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.

[参考译文] TM4C123GH6PM:TM4C123GH6PM 中的 Timer0不工作

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/565753/tm4c123gh6pm-timer0-in-tm4c123gh6pm-is-not-working

器件型号:TM4C123GH6PM
我想在 TM4C123GH6PM (在 Tiva C 系列 TM4C123G Launchpad 评估套件中)使用计时器。 因此、我决定在周期定时器模式下使用 GPTM TimerA0。 我定义了的地址 
寄存器、并按照 数据表第 722页中第11.4.1节单次触发/周期定时器模式给出的步骤操作。 我希望 LED 每3秒闪烁一次(连接到
端口 F 引脚1)。 但 LED 始终亮起。 我所指的寄存器地址是否错误? 还是代码的问题?



//定时器寄存 器#define RCGCTIMER(*(volatile unsigned long *) 0x400FE604) #define GPTMCTL(*(volatile unsigned long *) 0x4003000C)//timer zero #define GPTMCFG(*(volatile unsigned long *) 0x40030000) #define GPTMTAMR(*(volatile unsigned long *) 0x4003004) #define GPTMRIS(#define GPTMR30028)#define GPTMTAMR (#define GPTMTAMR)(#define GPTMR30028)( (*(volatile unsigned long *) 0x4003001C) #define GPTMICR(*(volatile unsigned long *) 0x40030024)) //端口 F 寄存 器#define GPIO_PORTF_LOCK_R (*(volatile unsigned long *) 0x40025520) #define GPIO_PORTF_DATA_R (*((volatile unsigned long*) 0x400253FC) #define GPIO_PORTF_DIR_R (*(volatile unsigned long *) 0x40025400) #define GPIO_PORTF_AFSEL_R (*(volatile unsigned long *) 0x40025420) #define GPIO_PORTF_DEN_R (*(volatile unsigned long *) 0x4002551C) #define SYSCTL2_RCGC2_R (*(volatile unsigned long *) 0x400FE108) #define SYSCTL_RCGC2_GPIOF 0x00000020 //端口 F 时钟门控控制 空初始化 Timer() { RCGCTIMER |= 0x00000001;//要使用 GPTM,必须在 RCGCTIMER 中设置相应的 TIMERn 位。 这里是 TIMER0 //周期计时器模式 GPTMCTL &=(~0x00000001);//TAEN 置位0。 Timer A 禁用。 GPTMCFG = 0x00000000;//向 GPTM 配置寄存器(GPTMCFG)写入0x0000.0000 GPTMTAMR = 0x00000002;// TAMR 置位0x2。 使用周期定时器模式(在两条语句中、第一个位1被置位1、然后 bit0被置位0) GPTMTAMR &= 0xFFFFFFEF;//TACDIR 被置位0。 计时器递减计数。 GPTMTAILR = 0x02DC6C00;//TAILR 设置为48、000、000、000 GPTMCTL |=0x00000001;//TAEN 设置为1。 Timer A 已启用 。} void 初始化 PORTF() { volatile unsigned long delay; SYSCTL2_RCGC2_R |= 0x00000020; // 1) F 时钟 延迟= SYSCTL2_RCGC2_R; //延迟 GPIO_PORTF_LOCK_R = 0x4C4F434B;// 2)解锁 GPIO 端口 F GPIO_PORTF_DIR_R |= 0x02; // PF2输出 GPIO_PORTF_AFSEL_R &= 0x00; //无备用功能// 1) F 时钟 GPIO_PORTF_DEN_R |= 0x02; //启用数字引脚 PF2 GPIO_PORTF_DATA_R |= 0x02; //PF1设置为1。 LED 亮起 } int main() { 初始化 Timer(); 初始化 PORTF(); while (1) {//Did TATORIS in GPTMRIS 变为1?? if (((GPTMRIS | 0x00000001)= 1) { GPTMICR |= 0x00000001;//将1设置为 TATOCINT。 向该位写1清除 GPTMRIS 寄存器的 TATORIS 位和 GPTMMIS 寄存器的 TATOMIS 位。 GPIO_PORTF_DATA_R ^= 0x02;//切换 PF1。 切换 LED } }

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

    请使用 TivaWare 而不是使用 DRM 方法。 如您所见,您也在质疑寄存器的有效性。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Amit

      感谢你的答复。 目的实际上是学习东西,所以我自己写了。 我刚刚检查 了 http://users.ece.utexas.edu/~valvano/arm/tm4c123gh6pm.h 、发现所有寄存器地址都是正确的。 但我仍然不知道为什么 LED 始终亮起。  

    此致

    Deepak

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

    显然在本例中不是这样。 DRM 是一种用户在6个月后完全确信自己能够优化和理解代码的方法。 这是 DRM 帮助学习的一种常见误解。 有时可能会、但大多数情况下不会。 我建议您转到 TivaWare、我可以在其中更高效地帮助您。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Amit Ashara"]这是一种常见的神话,DRM 有助于学习。

    如果-通过"减速"效率、理解和成就-那么我们(可能)同意 DRM 有助于学习。

    海报从印刷手册中(通常为32位)学习了什么(除了)无穷的 MCU 手册"翻页"-尝试正确抄录(每位)关键位(通常为32位)-到"过于复杂"的 MCU 代码列表?

    本海报和其他海报是否会记住这些唯一寄存器和单独位设置中的每一个?  一周后?  一个月后?  6个月后-何时致电"修复"某件事?

    如果(本)海报或所有其他人寻求该供应商的 API "真正学习"、"经受住时间的考验!"  API 是全面的、包含工作代码示例、最重要的是、"已尝试、正确、已测试!"

    (部分)学校强制 DRM -是否可以将其归类为"试用、正确、测试?"  以这种方式(永远)开发代码需要花费时间-并且(应该)代码工作(永远不会保证)-它永远不会"用户友好"或直观。

    马车和马车、蒸汽推进的水上工艺品和(令人愉快的) DRM (可能)在历史书籍中有(部分)位置-但在任何"持续关注"中都不需要"正确、稳健和高效的代码开发"!

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

    您好!

      我使 LED 闪烁。 我之前选择的延迟 太小、这使得它看起来就像 LED 一直亮起一样。 现在已增加延迟值、LED 将闪烁。 但有一个新问题。 默认情况下、MCU 的时钟频率为16Hz。 因此、我希望前面的代码能够这么做

     GPTMTAILR = 0x02DC6C00; //TAILR is set to 48,000,000

    每3秒闪烁一次 LED。 但实际上、当我尝试在 MCU 上运行它时、时间并不是3秒。 因此、我怀疑时钟频率是16MHz。 我还没有激活 PLL。 我不知道问题是什么。 尝试弄清楚。  如果您遇到问题、请在平均时间内帮我解决。

    代码:

    //我想在 TM4C123GH6PM (在 Tiva C 系列 TM4C123G Launchpad 评估套件中)使用计时器。 因此、我决定在周期定时器模式下使用 GPTM TimerA0。 我定义了 GPTM 寄存器的地址、并按照数据表中给出的步骤进行操作。 我希望 LED 每隔3秒闪烁一次(连接到端口 F 引脚1)。 但 LED 始终亮起。 我引用的寄存器地址是否错误? 还是代码的问题?
    
    //定时器寄存
    器#define RCGCTIMER(*(volatile unsigned long *) 0x400FE604)
    #define GPTMCTL(*(volatile unsigned long *) 0x4003000C)//timer zero
    #define GPTMCFG(*(volatile unsigned long *) 0x40030000)
    #define GPTMTAMR(*(volatile unsigned long *) 0x4003004)
    #define GPTMRIS(#define GPTMR30028)#define GPTMTAMR (#define GPTMTAMR)(#define GPTMR30028)(
    (*(volatile unsigned long *) 0x4003001C)
    #define GPTMICR(*(volatile unsigned long *) 0x40030024))
    
    //端口 F 寄存
    
    器#define GPIO_PORTF_LOCK_R (*(volatile unsigned long *) 0x40025520)
    #define GPIO_PORTF_DATA_R (*((volatile unsigned long*) 0x400253FC)
    #define GPIO_PORTF_DIR_R (*(volatile unsigned long *) 0x40025400)
    #define GPIO_PORTF_AFSEL_R (*(volatile unsigned long *) 0x40025420)
    #define GPIO_PORTF_DEN_R (*(volatile unsigned long *) 0x4002551C)
    #define SYSCTL2_RCGC2_R (*(volatile unsigned long *) 0x400FE108)
    #define SYSCTL_RCGC2_GPIOF 0x00000020 //端口 F 时钟门控控制
    
    
    
    空初始化 Timer()
    {
    RCGCTIMER |= 0x00000001;//要使用 GPTM,必须在 RCGCTIMER 中设置相应的 TIMERn 位。 这里是 TIMER0
    
    //周期计时器模式
    
    GPTMCTL &=(~0x00000001);//TAEN 置位0。 Timer A 禁用。
    GPTMCFG = 0x00000000;//向 GPTM 配置寄存器(GPTMCFG)写入0x0000.0000
    GPTMTAMR = 0x00000002;// TAMR 置位0x2。 使用周期定时器模式(在两条语句中、第一个位1被置位1、然后 bit0被置位0)
    GPTMTAMR &= 0xFFFFFFEF;//TACDIR 被置位0。 计时器递减计数。
    GPTMTAILR = 0x00FFFFFF;//TAILR 设置为48、000、000、000
    GPTMCTL |=0x00000001;//TAEN 设置为1。 Timer A 已启用
    。}
    
    void 初始化 PORTF()
    {
    volatile unsigned long delay;
    SYSCTL2_RCGC2_R |= 0x00000020; // 1) F 时钟
    延迟= SYSCTL2_RCGC2_R; //延迟
    GPIO_PORTF_LOCK_R = 0x4C4F434B;// 2)解锁 GPIO 端口 F
    GPIO_PORTF_DIR_R |= 0x02; // PF2输出
    GPIO_PORTF_AFSEL_R &= 0x00; //无备用功能// 1) F 时钟
    GPIO_PORTF_DEN_R |= 0x02; //启用数字引脚 PF2
    GPIO_PORTF_DATA_R |= 0x02; //PF1设置为1。 LED 亮起
    }
    
    void delay (long int a)
    {
    long int i;
    for (i=-a;i<=a;i++)
    {
    
    //GPTMRIS 中的 TATORIS 是否变为1??
    if (((GPTMRIS | 0x00000001)= 1)
    {
    GPTMICR |= 0x00000001;//将1设置为 TATOCINT。 向该位写1清除 GPTMRIS 寄存器的 TATORIS 位和 GPTMMIS 寄存器 TATOMIS 位。
    }
    }
    
    
    int main()
    {
    初始化 Timer();
    初始化 PORTf();
    
    while (1)
    {
    delay (100000 );
    GPIO_PORTF_DATA_R ^= 0x02;//切换 PF1。 切换 LED
    }
    

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

    如果目的是延迟3秒、则计时器的使用会被高度高估。 相反、在 PWM 模式下使用具有预分频器的计时器、以便 LED 由计时器的 PWM 输出控制、而不是如此复杂的环路。

    如果需要软件控制、那么 SysCtlDelay (X)就足够了。 每个 X 是3个系统时钟。 因此、通过了解系统时钟、可以很好地确定延迟。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    注意的是海报继续使用可怕、低效和反学习"DRM"。

    当他寻求(我们)的努力时、"帮助他出去"、他避免了向 API 切换的请求、即"帮助我们出去"。