工具/软件:Code Composer Studio
大家好、
我面临一个问题、我的程序设计为启用3个计时器。 这3个计时器我将分成两对、以生成总共6个周期性中断。 问题是当我配置最后一个定时器时、一旦处理器读取 TimerConfigure 行、它就会进入故障 ISR。 导致这种情况的原因是什么? 这有一些限制、或者我缺少一些配置?
堆栈大小为4096、我在使用和不使用 ROM 的情况下进行了测试、我正在使用 UART_buffered。
主代码如下所示:
int main (void) { MAP_SysCtlClockSet (SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz); MAP_FPUEnable(); MAP_FULazyStackingEnable(); MAP_IntMasterEnable(); init_all_periph(); CONFIG_UART (UART0、系统、921600); CONFIG_LED(); CONFIG_Display1602(); CONFIG_TIMER0(); CONFIG_Timer1(); CONFIG_TIMER2(); CONFIG_WTIME1 (); CONFIG_HibernateRTC(); init_Cronometro(); for (;;); }
用于初始化外设的代码:
内联 void init_all_periph (void) { MAP_SysCtlPeripheralDisable (SYSCTL_Periph_GPIOA); MAP_SysCtlPeripheralReset (SYSCTL_Periph_GPIOA); MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA); while (!map_SysCtlPeripheralReady (SYSCTL_Periph_GPIOA)); MAP_SysCtlPeripheralDisable (SYSCTL_Periph_GPIOB); MAP_SysCtlPeripheralReset (SYSCTL_Periph_GPIOB); MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB); while (!map_SysCtlPeripheralReady (SYSCTL_Periph_GPIOB)); MAP_SysCtlPeripheralDisable (SYSCTL_Periph_GPIOC); MAP_SysCtlPeripheralReset (SYSCTL_Periph_GPIOC); MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOC); while (!map_SysCtlPeripheralReady (SYSCTL_Periph_GPIOC)); MAP_SysCtlPeripheralDisable (SYSCTL_Periph_GPIOD); MAP_SysCtlPeripheralReset (SYSCTL_Periph_GPIOD); MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD); while (!map_SysCtlPeripheralReady (SYSCTL_Periph_GPIOD)); MAP_SysCtlPeripheralDisable (SYSCTL_Periph_GPIOE); MAP_SysCtlPeripheralReset (SYSCTL_Periph_GPIOE); MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE); while (!map_SysCtlPeripheralReady (SYSCTL_Periph_GPIOE)); MAP_SysCtlPeripheralDisable (SYSCTL_Periph_GPIOF); MAP_SysCtlPeripheralReset (SYSCTL_Periph_GPIOF); MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF); while (!map_SysCtlPeripheralReady (SYSCTL_Periph_GPIOF)); MAP_SysCtlPeripheralDisable (SYSCTL_Periph_TIMER0); MAP_SysCtlPeripheralReset (SYSCTL_Periph_TIMER0); MAP_SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0); while (!map_SysCtlPeripheralReady (SYSCTL_Periph_TIMER0)); MAP_SysCtlPeripheralDisable (SYSCTL_Periph_Timer1); MAP_SysCtlPeripheralReset (SYSCTL_Periph_Timer1); MAP_SysCtlPeripheralEnable (SYSCTL_Periph_Timer1); while (!map_SysCtlPeripheralReady (SYSCTL_Periph_Timer1)); MAP_SysCtlPeripheralDisable (SYSCTL_Periph_TIMER2); MAP_SysCtlPeripheralReset (SYSCTL_Periph_TIMER2); MAP_SysCtlPeripheralEnable (SYSCTL_Periph_TIMER2); while (!map_SysCtlPeripheralReady (SYSCTL_Periph_TIMER2)); MAP_SysCtlPeripheralDisable (SYSCTL_Periph_WTIME0); MAP_SysCtlPeripheralReset (SYSCTL_Periph_WTIME0); MAP_SysCtlPeripheralEnable (SYSCTL_Periph_WTIME0); while (!map_SysCtlPeripheralReady (SYSCTL_Periph_WTIME0)); MAP_SysCtlPeripheralDisable (SYSCTL_Periph_ADC0); MAP_SysCtlPeripheralReset (SYSCTL_Periph_ADC0); MAP_SysCtlPeripheralEnable (SYSCTL_Periph_ADC0); while (!map_SysCtlPeripheralReady (SYSCTL_Periph_ADC0)); MAP_SysCtlPeripheralDisable (SYSCTL_Periph_PWM0); MAP_SysCtlPeripheralReset (SYSCTL_Periph_PWM0); MAP_SysCtlPeripheralEnable (SYSCTL_Periph_PWM0); while (!map_SysCtlPeripheralReady (SYSCTL_Periph_PWM0)); MAP_SysCtlPeripheralDisable (SYSCTL_Periph_PWM1); MAP_SysCtlPeripheralReset (SYSCTL_Periph_PWM1); MAP_SysCtlPeripheralEnable (SYSCTL_Periph_PWM1); while (!map_SysCtlPeripheralReady (SYSCTL_Periph_PWM1)); MAP_SysCtlPeripheralDisable (SYSCTL_Periph_HIBERNATE); MAP_SysCtlPeripheralReset (SYSCTL_Periph_HIBERNATE); MAP_SysCtlPeripheralEnable (SYSCTL_Periph_HIBERNATE); while (!map_SysCtlPeripheralReady (SYSCTL_Periph_HIBERNATE)); }
用于初始化定时器的代码如下所示:
/* TIMERA 3Hz * TIMERB 2Hz */ INLINE void CONFIG_TIMER0 (void) { MAP_TimerConfigure (TIMER0_BASE、TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_PERIOD | TIMER_CFG_B_PERIODICRACRACASE); MAP_TimerLoadSet (TIMER0_BASE、TIMER_A、(MAP_SysCtlClockGet ()/3)-1); MAP_TimerLoadSet (TIMER0_BASE、TIMER_B、(MAP_SysCtlClockGet ()/2)-1); MAP_IntDisable (INT_TIMER0A); MAP_IntDisable (INT_TIMER0B); MAP_TimerIntDisable (TIMER0_BASE、TIMER_TINA_TIMEOUT | TIMER_TIMB_TIMEOUT); MAP_IntPendClear (INT_TIMER0A); MAP_IntPendClear (INT_TIMER0B); MAP_TimerIntClear (TIMER0_BASE、TIMER_TINA_TIMEOUT | TIMER_TIMB_TIMEOUT); MAP_IntPrioritySet (INT_TIMER0A、0x40); MAP_IntPrioritySet (INT_TIMER0B、0x60); MAP_TimerIntEnable (TIMER0_BASE、TIMER_TINA_TIMEOUT | TIMER_TIMB_TIMEOUT); MAP_IntEnable (INT_TIMER0A); MAP_IntEnable (INT_TIMER0B); while (!map_IntIsEnabled (INT_TIMER0A)||!MAP_IntIsEnabled (INT_TIMER0B)); MAP_TimerEnable (TIMER0_BASE、TIMER_Both); } // * TIMERA 100Hz * TIMERB 10Hz */ INLINE void CONFIG_Timer1 (void) { MAP_TimerConfigure (Timer1_base、TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_PERIOD | TIMER_CFG_B_PERIODICRACRACASE); MAP_TimerLoadSet (Timer1_base、timer_A、(MAP_SysCtlClockGet ()/100)-1); MAP_TimerLoadSet (Timer1_base、timer_B、(MAP_SysCtlClockGet ()/10)-1); MAP_IntDisable (INT_TIMER1A); MAP_IntDisable (INT_TIMER1B); MAP_TimerIntDisable (Timer1_base、TIMER_TIMA_TIMEOUT | TIMER_TIMB_TIMEOUT); MAP_IntPendClear (INT_TIMER1A); MAP_IntPendClear (INT_TIMER1B); MAP_TimerIntClear (Timer1_base、timer_TINA_TIMEOUT | timer_TIMB_TIMEOUT); MAP_TimerIntEnable (Timer1_base、TIMER_TIMA_TIMEOUT | TIMER_TIMB_TIMEOUT); MAP_IntEnable (INT_TIMER1A); MAP_IntEnable (INT_TIMER1B); while (!map_IntIsEnabled (INT_TIMER1A)||!MAP_IntIsEnabled (INT_TIMER1B)); MAP_TimerEnable (Timer1_base、timer_both); } // * TIMERA 1Hz * TIMERB 50Hz */ 内联 void CONFIG_TIMER2 (void) { MAP_TimerConfigure (TIMER2_base、TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_PERIODICRACRARY_TIMER_CFG_B_PERIODICRACRACRACRACRAD); MAP_TimerLoadSet (TIMER2_base、TIMER_A、(MAP_SysCtlClockGet ()/1)-1); MAP_TimerLoadSet (TIMER2_base、TIMER_B、(MAP_SysCtlClockGet ()/50)-1); MAP_IntDisable (INT_TIMER2A); MAP_IntDisable (INT_TIMER2B); MAP_TimerIntDisable (TIMER2_base、TIMER_TINA_TIMEOUT | TIMER_TIMB_TIMEOUT); MAP_IntPendClear (INT_TIMER2A); MAP_IntPendClear (INT_TIMER2B); MAP_TimerIntClear (TIMER2_base、TIMER_TINA_TIMEOUT | TIMER_TIMB_TIMEOUT); MAP_TimerIntEnable (TIMER2_base、TIMER_TINA_TIMEOUT | TIMER_TIMB_TIMEOUT); MAP_IntEnable (INT_TIMER2A); MAP_IntEnable (INT_TIMER2B); while (!map_IntIsEnabled (INT_TIMER2A)||!MAP_IntIsEnabled (INT_TIMER2B)); MAP_TimerEnable (TIMER2_base、TIMER_Both); }
谢谢!