Ответ: Код в студии. Функция прерывания от INT0 Устанавливается аналогично таймерному прерыванию.
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_INT_PRIORITY, CTL_ISR_TRIGGER_FIXED, timerISR, 0);
ctl_unmask_isr(TIMER0_INT);
}
void InitController(void){
unsigned int temp;
#ifdef _DEBUG_
debug_printf("Entering into \"void InitController(void)\"\n");
debug_printf("Seting Up EMC Bank0.\n");
#endif
// Запрещаем прерывания от всех внутренних устройств
VICIntEnClr = 0xffffffff;
BCFG0 = (0 << BCFG0_IDCY_BIT) | // 3 WS bw RW cycle
(0 << BCFG0_WST1_BIT) | // Read len - 3 cyclse
(1 << BCFG0_RBLE_BIT) | // WE need
(1 << BCFG0_WST2_BIT) | // Write len - 2 cycle
(1 << BCFG0_MW_BIT);
PINSEL2 = (1<<2) | // Разрешим использование JTAG
(1<<4) | // Переведем P2 в режим шины данных, P1.0 - CS0, P1.1 - RD
// Задействуем только младшие 16 бит шины данных, BLS0, BLS1
(1<<8) | // Сигнал WE на P3.27
(1<<13) | // Выведем сигнал VPBCLK = 1/2 от CCLK на ногу 40 (P3.27)
(1<<24) | // Разрешим сигнал A1 на P3.1
(3<<25); // Разрешим сигналы A2-A7 на P3.2-P3.7
#ifdef _DEBUG_
debug_printf("\tBCFG0.IDCY = %d (Cycles bw transactions)\n",
(BCFG0 & BCFG0_IDCY_MASK)>>BCFG0_IDCY_BIT);
debug_printf("\tBCFG0.WST1 = %d (Len of Read access)\n",
(BCFG0 & BCFG0_WST1_MASK)>>BCFG0_WST1_BIT);
debug_printf("\tBCFG0.RBLE = %d (1 for WE signal generated)\n",
(BCFG0 & BCFG0_RBLE_MASK)>>BCFG0_RBLE_BIT);
debug_printf("\tBCFG0.WST2 = %d (Len of Write access)\n",
(BCFG0 & BCFG0_WST2_MASK)>>BCFG0_WST2_BIT);
debug_printf("\tBCFG0.BUSERR = %d (Must be 0)\n",
(BCFG0 & BCFG0_BUSERR_MASK)>>BCFG0_BUSERR_BIT);
debug_printf("\tBCFG0.WPERR = %d (Write protect Err Count)\n",
(BCFG0 & BCFG0_WPERR_MASK)>>BCFG0_WPERR_BIT);
debug_printf("\tBCFG0.WP = %d (Is Write Protected)\n",
(BCFG0 & BCFG0_WP_MASK)>>BCFG0_WP_BIT);
debug_printf("\tBCFG0.BM = %d (Is a Burst Rom Bank)\n",
(BCFG0 & BCFG0_BM_MASK)>>BCFG0_BM_BIT);
debug_printf("\tBCFG0.MW = %d (Data Bus Wisth 0-8bit, 1-16bit, 2- 32bit, 3-Reserved)\n",
(BCFG0 & BCFG0_MW_MASK)>>BCFG0_MW_BIT);
debug_printf("\tPINSEL2 = 0x%8.8X\n",PINSEL2);
#endif
// Настраиваем внешнее прерывание от контроллера USB - INT0
// Как прерывание по спаду
#ifdef _DEBUG_
debug_printf("Setting INT0 as low level sens. \n");
#endif
VPBDIV = 0; // В соответствии с ERRATASEET EXTINT.1 перед обращением
// к регистрам EXTMODE и EXTPOLAR
EXTMODE = 1; // Прерывание по спаду
VPBDIV = 1; // как написано в ErrataSheet 1.8 EXTINT.2
VPBDIV = 0;
temp = EXTMODE;
#ifdef _DEBUG_
debug_printf("EXTMODE = 0x%2.2X\n",(char)temp);
#endif
VPBDIV = 0; // В соответствии с ERRATASEET EXTINT.1 перед обращением
// к регистрам EXTMODE и EXTPOLAR
EXTPOLAR = 0; // Прерывание активно при переходе из 1 в 0
VPBDIV = 0;
VPBDIV = VPBDIV_VAL;
#ifdef _DEBUG_
debug_printf("EXTPOLAR = 0x%2.2X\n", EXTPOLAR);
#endif
PINSEL1 &= ~(0x3); // Подключаем вывод P0.16(100 нога)
PINSEL1 |= 1; // к входу контроллера прерываний
#ifdef _DEBUG_
debug_printf("Connecting INT0 to P1.16 (Pin 100). \n");
debug_printf("PINSEL1 = 0x%8.8X\n", PINSEL1);
#endif
}
int main(void)
{
ctl_task_init(&main_task, 0, "main");
ctl_global_interrupts_enable();
#ifdef _DEBUG_
debug_printf("We are in debug mode.\n");
debug_printf("Initializing controller.\n");
#endif
InitController();
SetTimer(VPB_FREQ / 1000);
Usb_Initiate();
while(1){
CTL_TIME_t CTime = ctl_get_current_time()+1;
if ((unsigned long)CTime % 5000 == 0){
debug_printf("Working %d ms.\n",CTime);
debug_printf("Sof Count %d\n",SOF_Count);
};
};
debug_exit(0);
return 0;
}
-
- Не праильнеа обработка по ISR_IRQ и инициализация VIC на таймер - Ken@t(19.09.2005 12:22,
)
- Ответ: Кажется понял! Добавил в начало main() до разрешения прерываний запись в VICVectAddr. Abo(334 знак., 19.09.2005 13:40,
) - А что конкретно? - Abo(19.09.2005 13:21,
)
- Ответ: Кажется понял! Добавил в начало main() до разрешения прерываний запись в VICVectAddr. Abo(334 знак., 19.09.2005 13:40,
- Не праильнеа обработка по ISR_IRQ и инициализация VIC на таймер - Ken@t(19.09.2005 12:22,