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.

[参考译文] 编译器/EK-TM4C123GXL:周期性计时器的 Tiva TM4C123gxl 重新加载不起作用...

Guru**** 2477145 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/687823/compiler-ek-tm4c123gxl-tiva-tm4c123gxl-reload-of-periodic-timer-not-working

器件型号:EK-TM4C123GXL
主题中讨论的其他器件:TM4C123GH6PM

工具/软件:TI C/C++编译器

大家好、我想使用这个板上的周期定时器 TM4C123gxl 来生成一个10Hz、50%占空比的 LED 灯。

但是、我将以下代码烧写到电路板上、只是为了看到应该"闪烁"的 LED 灯不能正常工作。

LED 灯不是以10Hz 的频率"闪烁"、而是以相同的亮度持续发光。  

中断必须由处理器处理、否则 LED 将不会首先亮起。

因此、我假设计时器中断的代码段只输入一次、可能是因为我对计时器的重新加载值执行了错误操作。

有人可以帮帮我吗? 我已经被这个问题困扰了一段时间。

#include "driverlib/sysctl.h"
#include "driverlib/timer.h"
#include "inc/tm4c123gh6m.h"
#include "driverlib/interrupt.h"

静态无符号长整型 ulPeriod;
空 Timer0IntHandler (空);

空 Timer0IntHandler (空)

//清除计时器中断
TimerIntClear (TIMER0_BASE、TIMER_TINA_TIMEOUT);

//读取 GPIO 引脚和的当前状态
//写回相反的状态
IF (GPIOPinRead (GPIO_PORTF_BASE、GPIO_PIN_2))
GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3、0);
其他
GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_2、GPIO_PIN_2);

void setup(){
//系统时钟以40MHz 运行
SysCtlClockSet (SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHz|SYSCTL_OSC_MAIN);

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、GPIO_PIN_1_GPIO_PIN_2|GPIO_PIN_3);

SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0);
while (!SysCtlPeripheralReady (SYSCTL_Periph_TIMER0)){}

TimerConfigure (TIMER0_BASE、TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_PERIODICASE);

ulPeriod =(SysCtlClockGet ()/10)/2;
TimerLoadSet (TIMER0_BASE、TIMER_A、SysCtlClockGet ()/1000);//ulPeriod -1);
IntEnable (INT_TIMER0A);


TimerEnable (TIMER0_BASE、TIMER_A);
IntMasterEnable();
TimerIntDisable (TIMER0_BASE、TIMER_TINA_TIMEOUT);
TimerIntClear (TIMER0_BASE、TIMER_TINA_TIMEOUT);
TimerIntRegister (TIMER0_BASE、TIMER_A、Timer0IntHandler);
TimerIntEnable (TIMER0_BASE、TIMER_TINA_TIMEOUT);

void loop(){

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我很快浏览了您的代码、没有发现任何明显的错误。 您能否在 Timer0IntHandler 中放入断点、以及每次计时器运行时是否会进入 ISR。 您还可以使用示波器来捕获 PF2吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好! 感谢你的帮助。 好消息是、我只是通过将计时器更改为全宽计时器来解决这个问题、因为半宽计时器只能计数到2^16 = 65536

    因此、在我的16MHz 时钟下、我将以最快的速度进入 ISR、以至于肉眼看不到 LED 光。

    现在、全宽度计数器可以计数到足够大的数字、我看到 LED 以10Hz 的频率闪烁。

    再次感谢!!!