This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/EK-TM4C123GXL:TimerConfigure 导致故障

Guru**** 2331900 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/598640/ccs-ek-tm4c123gxl-timerconfigure-causing-a-fault

器件型号:EK-TM4C123GXL

工具/软件: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);
} 

谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果您"交换" "Config Timer0"(配置 Timer0)(第一个)的位置与 "Config Timer2"(现在 是最后一个)的位置、会发生什么情况?    (即在 "Config TIMERx"代码块中交换"代码执行顺序")

    计时器代码块之间的并行性很高/很合适-更改呼叫顺序可能会证明这一点很明显。     (并且快速/简单)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    虽然您的"喜欢"总是受到赞赏-您的"定向测试"结果报告-更好地解决您的问题。

    我为您设计的测试不能更快/更简单...   (CB1的"首选"测试类型...)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    已经尝试过、它给了我同样的问题、但在本例中、如果我在调试模式下使用步越、程序运行正常。 我想这是因为之前计时器的中断在某种程度上中断了配置。 然后、我在配置计时器后移动了 TimerEnable 调用、bam 问题得到解决。 如果没有你给我的这一简单提示,我就不会想到,谢谢! (是的、幸运的是、由于更换了计时器位置、我至少能够绕过故障条件)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    "用某种方法来抑制/减弱赞美"这一表述就会引起注意。     "简单提示"-是否不能快速/轻松地-正如承诺的那样-推动您找到解决方案?

    我确实注意到,你"使"定时器"(相当早)--然而,"三者中的两人"接受了这种侮辱--导致我"放火"。

    是的、"幸运"确实到达了-但只有经过一些深思熟虑的努力-结果不能减少- 您再次"启动/运行..."

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、"销售部门的 Helder "、

    我敢打赌、如果您在错误发生之前已经检查了 FaultISR、那么您会发现原因不是计时器启用、而是中断例程中的其他东西-甚至考虑到已经注册了它...

    但我真正想写的原因是关于这个序列:

    MAP_IntEnable (INT_TIMER1A);
    MAP_IntEnable (INT_TIMER1B);
    while (!map_IntIsEnabled (INT_TIMER1A)||!MAP_IntIsEnabled (INT_TIMER1B));

    与启用外设时发生的情况不同,IntEnable()几乎是一种直接设置,我想说,虽然确认行没有损坏,但它并不是真正必要的... (没有任何批评、只是一个想到的想法)。

    谢谢

    布鲁诺
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Bruno、

    由于我在启用外设方面遇到了问题、并且在经历了如此多的痛苦之后发现了这种问题、我更喜欢使事情尽可能"正确"。 不过我不知道这个。

    此致

    Helder