ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
24 ноября
34478 Топик полностью
Abo (30.06.2005 14:46, просмотров: 1) ответил Cидopгeк на Кто использовал таскинг-библиотеку КроссВоркс-АРМ!? Поделитесь опытом использования Программироуемого контроллера прерываний!
Ответ: Вот посмотри куски исходников - надергал на скорую руку. #include CTL_TASK_t main_task; CTL_TASK_t LedTask; unsigned LedTaskStack[1+THREADSTACKSIZE+1]; void initController(void);// Подготавливает основные устройства ядра void ctl_handle_error(CTL_ERROR_CODE_t e); // Обработчик ошибок библиотеки управления потоками // Реализации функций 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; } 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); } 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); }