Опп, с первогораза не получилось - вторая попытка.
#include
#include
CTL_TASK_t main_task;
CTL_TASK_t LedTask;
unsigned LedTaskStack[1+THREADSTACKSIZE+1];
static void timerISR(void)
{
ctl_increment_tick_from_isr();
/* Clear the timer 0 interrupt */
T0IR = 0xFF;
}
void SetTimer(unsigned int Period)
{
ctl_mask_isr(TIMER0_INT);
PCONP |= (1<<1); // Включим питание таймера
T0TCR = 0; /* Reset timer 0 */
T0PR = 0; /* Set the timer 0 prescale counter */
T0MR0 = Period; /* Set timer 0 match register */
T0MCR = 3; /* Generate interrupt and reset counter on match */
T0TCR = 1; /* Start timer 0 */
ctl_set_isr(TIMER0_INT, TIMER0_PR, CTL_ISR_TRIGGER_FIXED, timerISR, 0);
ctl_unmask_isr(TIMER0_INT);
}
void ctl_handle_error(CTL_ERROR_CODE_t e)
{ // Обработчик ошибок библиотеки управления потоками
while(1);
}
void initController(void)
{// Подготавливает основные устройства ядра
// Запрещаем прерывания от всех внутренних устройств
VICIntEnClr = 0xffffffff;
// Настраиваем внешние прерывания EXT2 - по фронту, EXT3- по спаду
VPBDIV = 0; // В соответствии с ERRATASEET EXTINT.1 перед обращением
// к регистрам EXTMODE и EXTPOLAR
EXTMODE=(1<<3)|(1<<2); // Пусть прерывание будет по спаду сигнала на EI3
VPBDIV = 0; // В соответствии с ERRATASEET EXTINT.1 перед обращением
// к регистрам EXTMODE и EXTPOLAR
EXTPOLAR = (1<<2);
VPBDIV = VPBDIV_VAL; // В соответствии с ERRATASEET EXTINT.1 после обращения
// к регистрам EXTMODE и EXTPOLAR
// И отключим всю периферию
PCONP = 0;
}
void wait(unsigned ms)
{
ctl_timeout_wait(ctl_get_current_time()+ms);
}
void LedTaskCode()
{
wait(200);
while(1){
wait(10);
LED_ON;
wait(10);
LED_OFF;
};
}
int main(void)
{
initController();
ctl_task_init(&main_task, 0, "main");
SetTimer((VPB_FREQ) - 1); // Период внутреннего таймера 1 мс
ctl_task_run(&LedTask, 1, LedTaskCode, 0, "LedTask", THREADSTACKSIZE, LedTaskStack,0);
while(1){// Это Idle процесс};
}