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 (在 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 } }
Amit Ashara、您好!
感谢你的答复。 目的实际上是学习东西,所以我自己写了。 我刚刚检查 了 http://users.ece.utexas.edu/~valvano/arm/tm4c123gh6pm.h 、发现所有寄存器地址都是正确的。 但我仍然不知道为什么 LED 始终亮起。
此致
Deepak
[引用用户="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 }