ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
24 ноября
34486 Топик полностью
Abo (30.06.2005 14:57, просмотров: 1) ответил Cидopгeк на Кто использовал таскинг-библиотеку КроссВоркс-АРМ!? Поделитесь опытом использования Программироуемого контроллера прерываний!
Опп, с первогораза не получилось - вторая попытка. 
#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 процесс};
}