一、初始化以及初始化配置
要使用GPTM(GPIO_TIMER),必须先配置对应的RCGCTIMER寄存器中的TIMERn(分配时钟需求),如果同时信号要从对应的引脚输出则需要同时配置对应的RCGCGPIO寄存器(参考前几篇)。如果启用了GPIO则需要配置GPIOTCTL寄存器中的PMCn,用于将CCP信号分给对应的引脚。
二、模式以及模式配置
技术手册一共罗列了五种功能的配置方案:1.One-shot and Periodic Mode 2.RTC Mode 3.Input Edge-Count Mode 4.Input Edge Time Mode 5.PWM Mode
这篇文章只介绍第一种模式(One-shot and Periodic)的配置方案,预估以后还会介绍PWM模式的方案,其他方案可能不会去研究。
配置方法如下:
1.清零GPTMCTL寄存器中的TnEN位,以确保定时器被禁用。如果定时器未被禁用就进行相关配置会导致错误。
2.GPTMCFG寄存器或上TIMER_CFG_32_BIT_TIMER(其值为0x0。应该是默认位,不做特殊操作)
3.在GPTMTnMR寄存器中配置对应的TnMR位。One-Shot模式或上TIMER_TAMR_TAMR_1_SHOT(0x1) ,Periodic 模式或上TIMER_TAMR_TAMR_PERIOD(0x2)。
4.可以配置GPTMTnMR寄存器中的TnSNAPS,TnWOT,TnMIE和TnCDIR来配置其他的相关属性。
5.将起始(终止)值写入GPTMTnILR来确定定时器的间隔。如果需要中断则在GPTMIMR中设置配置对应位。
6.设置 GPTMCTL 寄存器中的 TnEN 位以启用定时器并开始计数。
三、相关寄存器功能介绍
1.GPTMCFG
该寄存器配置 GPTM 模块的全局操作。 写入该寄存器的值确定 GPTM 是处于 32 位模式还是 16 位模式。
0x0:默认位,无处理。(单次以及周期时钟模式选择此位)
0x1:对于 16/32 位定时器,该值选择 32 位实时时钟 (RTC) 计数器配置
0x4:对于 16/32 位定时器,该值选择 16 位定时器配置。该功能由 GPTMTAMR 的位 1:0 控制和 GPTMTBMR。
2.GPTMTAMR
该寄存器根据在 GPTMCFG 寄存器中选择的配置来配置 GPTM。
在 PWM 模式下,设置 TAAMS 位,清除 TACMR 位,并将 TAMR 字段配置为 0x1 或 0x2。
当定时器 A 单独使用时,该寄存器控制定时器 A 的模式。 当定时器 A 和定时器 B 串联时,该寄存器控制定时器 A 和定时器 B 的模式,并且忽略 GPTMTBMR 的内容。
注意:除了 TCACT 位以外,该寄存器中的所有其他位仅在GPTMCTL 寄存器中的 TAEN 位置位时被清除。
31-16:空位(无效位)
15-13.TCACT:定时器比较操作选择。
0X0:禁用比较模式
0x1:超时(time-out)时切换状态
0x2:超时时清除CCP
0x3:超时时设定CCP
0x4:立刻设定CCP并且设定超时
0x5:立刻清空CCP并且设定超时
0x6:立刻设定CCP并且清空超时
0x7:立刻清空CCP并且设定超时
12.TACINTD:一次性/周期性 中断禁用
0x00:超时中断功能正常工作
0x01:超时中断被禁用。 设置 GPTMTAMR 寄存器中的 TACINTD 位不会影响 µDMA 或 ADC 中断超时事件触发断言(assertions)。 当GPTMDMAEV 寄存器中的 TATODMAEN 位或 TATOADCEN 位在GPTMADCEV 寄存器、µDMA 或 ADC 超时触发分别发送到 µDMA 或 ADC,即使 TACINTD 位已设置。
11.TAPLO(GPTM Timer A PWM Legacy Operation):只在PWM模式生效
0x0:当定时器达到 0 后重新加载 GPTMTAILR 时,CCP 引脚驱动为低电平的传统操作。
0x1:当定时器达到 0 后重新加载 GPTMTAILR 时,CCP 被驱动为高电平
10.TAMRSU(GPTM Timer A Match Register Update):如果在该位置位时定时器被禁用(TAEN 清零),则在定时器启用时更新 GPTMTAMATCHR 和 GPTMTAPR。
如果定时器停止(TASTALL 置位),则 GPTMTAMATCHR 和 GPTMTAPR 根据该位的配置进行更新。
0x0:在下一个周期更新 GPTMTAMATCHR 寄存器和 GPTMTAPR 寄存器(如果使用)。
0x1:在下一次超时时更新 GPTMTAMATCHR 寄存器和 GPTMTAPR 寄存器(如果使用)。
9.TAPWMIE(GPTM Timer A PWM Interrupt Enable):该位在 PWM 模式下在 CCP 输出的上升沿、下降沿或两个沿启用中断,如 GPTMCTL 寄存器中的 TAEVENT 字段所定义。
此外,当该位被置位并且发生捕捉事件时,如果通过分别设置 GPTMCTL 寄存器中的 TAOTE 位和 GPTMDMAEV 寄存器中的 CAEDMAEN 位来启用触发功能,定时器 A 会自动生成对 ADC 和 DMA 的触发。
且该位仅在 PWM 模式下有效。
0X0:捕获事件中断被禁止
0X1:捕获事件中断被允许
8.TAILD(GPTM Timer A Interval Load Write):注意该位的状态在向上计数时没有影响。 如果定时器已启用并正在运行,则上述位描述适用。 如果设置该位时定时器被禁用(TAEN 清零),
GPTMTAR GPTMTAV 和 GPTMTAPs,在定时器启用时更新。 如果定时器停止(TASTALL 置位),则 GPTMTAR 和 GPTMTAPS 根据该位的配置进行更新。
0X0:在下一个周期用 GPTMTAILR 寄存器中的值更新 GPTMTAR 和 GPTMTAV 寄存器。 还要在下一个周期用 GPTMTAPR 寄存器中的值更新 GPTMTAPS 寄存器。
0X1:在下一次超时时使用 GPTMTAILR 寄存器中的值更新 GPTMTAR 和 GPTMTAV 寄存器。 还要在下一次超时时使用 GPTMTAPR 寄存器中的值更新 GPTMTAPS 寄存器。
7.TASNPS(GPTM Timer A Snap-Shot Mode)
0X0:快照(Snap-shot)模式被禁止
0x1:如果定时器 A 配置为周期模式,定时器 A 的实际自由运行、捕获或快照值在超时事件/捕获或快照事件中加载到 GPTM 定时器 A (GPTMTAR) 寄存器中。 如果使用定时器预分频器,则将预分频器快照加载到 GPTM Timer A (GPTMTAPR)
6.TAWOT(GPTM Timer A Wait-on-Trigger):如果应用需要循环菊花链,可以设置定时器 0 的 GPTMTAMR 寄存器中的 TAWOT 位。在这种情况下,定时器 0 等待来自链中最后一个定时器模块的触发。
0x0:定时器A在使能时就开始计时
0x1:如果定时器 A 被使能(TAEN 在 GPTMCTL 寄存器中设置),定时器 A 不会开始计数,直到它收到来自菊花链中前一个位置的定时器的触发信号,请参见 。 此功能对一次性、周期和 PWM 模式有效
5.TAMIE(GPTM Timer A Match Interrupt Enable)
0x0:匹配事件的匹配中断被禁用。清除 GPTMTAMR 寄存器中的 TAMIE 位可防止置位 µDMA 或匹配事件产生的 ADC 请求。 即使在 GPTMDMAEV 寄存器中设置 TATODMAEN 位或在 GPTMADCEV 寄存器中设置 TATOADCEN 位,当 TAMIE 位清零时,不会分别向 µDMA 或 ADC 发送 µDMA 或 ADC 匹配触发信号。
0x1:在一次性模式和周期模式下,当达到 GPTMTAMATCHR 寄存器中的匹配值时产生中断。
4.TACDIR(GPTM Timer A Count Direction):在 PWM 或 RTC 模式下,该位的状态被忽略。PWM 模式总是向下计数,RTC 模式总是向上计数
0x0:向下计数
0x1:计时器开始计时。 向上计数时,定时器从值 0x0 开始。
3.TAAMS(GPTM Timer A Alternate Mode Select)
0X0:捕获或比较模式已启用
0X1:PWM 模式已启用。要启用 PWM 模式,您还必须清除 TACMR 位并将 TAMR 字段配置为 0x1 或 0x2。
2.TACMR(GPTM Timer A Capture Mode)
0X0:边沿计数模式
0X1:边沿时间模式
1-0.TAMR(GPTM Timer A Mode):定时器模式基于位定义的定时器配置GPTMCFG 寄存器中的 2:0。
0X0:无效位
0x1:单次计时模式
0x2:周期计时模式
0x3:捕获模式
3.GPTMCTL
该寄存器与 GPTMCFG 和 GMTMTnMR 寄存器一起用于微调定时器配置,并启用其他功能,例如定时器停顿和输出触发。 输出触发器可用于启动 ADC 模块上的传输。
31-15:空位
14-7:TIMEB和空位
6.TAPWML(GPTM Timer A PWM Output Level)
0X0:输出不受影响
0X1:输出反相。
5.TAOTE(GPTM Timer A Output Trigger Enable):此外,必须使能 ADC 并使用 ADCEMUX 寄存器中的 EMn 位选择定时器作为触发源
0X0:输出定时器 A ADC 触发器被禁用
0X1:输出定时器 A ADC 触发器被启用
4.RTCEN(GPTM RTC Stall Enable):如果 RTCEN 位被设置,它可以防止定时器在所有工作模式下停止,即使 TnSTALL 被设置。
0X0:当处理器被调试器暂停时,RTC 计数冻结
0X1:当处理器被调试器暂停时,RTC 计数会继续。
3-2.TAEVENT(GPTM Timer A Event Mode):如果 PWM 输出反转使能,则边沿检测中断行为会反转。因此,如果已设置上升沿中断触发器并且 PWM 反转产生上升沿,则不会触发事件触发中断。相反,中断是在 PWM 信号的下降沿产生的。
0X0:上升沿
0X1:下降沿
0x2:空位
0x3:双边(both edges)
1.TASTALL(GPTM Timer A Stall Enable):如果处理器正常执行,则忽略 TASTALL 位
0X0:当处理器被调试器暂停时,定时器 A 继续计数。
0X1:当处理器被调试器暂停时,定时器 A 冻结计数。
0.TAEN(GPTM Timer A Enable):
0x0:定时器 A 被禁用。
0x1:根据 GPTMCFG 寄存器使能定时器 A 并开始计数或使能捕捉逻辑。
**关于中断五到八这部分和外部中断的定义差不多,用法也是大同小异。四个寄存器下的子寄存器的用法也差不多,不做过多的描述,而且432的各种定义也是大同小异,实在不明白可以直接ctrl+鼠标左键进文件翻一下,相关的定义基本上都放在一起**
4.GPTM Interrupt Mask (GPTMIMR)
该寄存器允许软件启用/禁用 GPTM 控制器级中断。 设置位启用相应的中断,而清除位则禁用它
31-14:空位
13-6:TIMERB和空位
5:DMAAIM(GPTM Timer A DMA Done Interrupt Mask): 0关;1开
4:TAMIM(GPTM Timer A Match Interrupt Mask): 0关;1开
3:RTCIM(GPTM RTC Interrupt Mask): 0关;1开
2:CAEIM(GPTM Timer A Capture Mode Event Interrupt Mask): 0关;1开
1:CAMIM(GPTM Timer A Capture Mode Match Interrupt Mask): 0关;1开
0:TATOIM(GPTM Timer A Time-Out Interrupt Mask):0关;1开
5.GPTM Timer A Interval Load (GPTMTAILR)
当定时器递减计数时,该寄存器用于将起始计数值加载到定时器中。 当定时器向上计数时,该寄存器设置超时事件的上限。
当 GPTM 配置为 32 位模式之一时,GPTMTAILR 显示为 32 位寄存器(高 16 位对应于 GPTM 定时器 B 间隔加载 (GPTMTBILR) 寄存器的内容)。 在 16 位模式下,该寄存器的高 16 位读为 0,对 GPTMTBILR 的状态没有影响。
31-0:TAILR(GPTM Timer A Interval Load Register):写入此字段会加载计时器 A 的计数器。读取返回 GPTMTAILR 的当前值
6.GPTM Timer A Match (GPTMTAMATCHR)
该寄存器加载了一个匹配值。 在一次性或周期性模式下,当定时器值等于该寄存器中的值时,可以产生中断。
在边沿计数模式下,该寄存器与 GPTMTAILR 一起确定计数的边沿事件数。 计数的边缘事件总数等于 GPTMTAILR 中的值减去该值。
注意,在边沿计数模式下,执行向上计数时,GPTMTnPR 和 GPTMTnILR 的值必须大于 GPTMTnPMR 和 GPTMTnMATCHR 的值。
在 PWM 模式下,该值与 GPTMTAILR 一起决定输出 PWM 信号的占空比。
当 16/32 位 GPTM 配置为 32 位模式之一时,GPTMTAMATCHR 显示为 32 位寄存器(高 16 位对应于 GPTM 定时器 B 匹配 (GPTMTBMATCHR) 寄存器的内容)。 在 16 位模式下,该寄存器的高 16 位读为 0,对 GPTMTBMATCHR 的状态没有影响。
31-0:TAMR(GPTM Timer A Match Register):该值与 GPTMTAR 寄存器进行比较以确定匹配事件。
四、代码
/* DriverLib Includes */
#include /* Standard Includes */ #include #include void time_init(){ TIMER0->CTL &=~TIMER_CTL_TAEN;//关闭定时器TA,以便进行相关配置 TIMER0->CFG |= TIMER_CFG_32_BIT_TIMER;//可以不写,因为该位为0x0 //按顺序配置为周期计时,增计数模式,打开TA计时器中断 TIMER0->TAMR |= TIMER_TAMR_TAMR_PERIOD+TIMER_TAMR_TACDIR+TIMER_TAMR_TAMIE; TIMER0->IMR |= TIMER_IMR_TAMIM;//关闭TA定时器的中断掩盖 //设置对应的计时间隔,目前还不知道分配给这个定时器的时钟频率是多少,先给50000,根据实际效果 //大概为1s左右 TIMER0->TAILR =50000; TIMER0->TAMATCHR=50000; TIMER0->CTL |= TIMER_CTL_TAEN;//打开定时器TA MAP_IntEnable(INT_TIMER0A);//打开定时器TA中断,中断系统配置,请导入TI家的driverlib库,不过也只有这一句用了 } void gpio_init(){ //led_init GPION->DIR|=BIT1+BIT0;//D1,D2 light on GPION->DEN|=BIT1+BIT0; } int timer_A_count; void TIMER0A_IRQHandler(void)//固定形式,中断函数,可以进中断看看其他中断函数 { if (TIMER0->RIS | TIMER_RIS_TAMRIS){//当TA触发了中断,进入对应中断操作 timer_A_count++; if (timer_A_count == 500){ GPION->DATA ^=BIT1; timer_A_count=0; } } TIMER0->ICR |= TIMER_ICR_TAMCINT;//清除中断标志位,这个是一定要清除的 } int main(void) { //和打开GPIO时钟一样,这里打开TIMER0时钟 SYSCTL->RCGCTIMER|=SYSCTL_RCGCTIMER_R0; while((SYSCTL->RCGCTIMER & SYSCTL_RCGCTIMER_R0) == 0){}; //打开GPIOL,因为TIMER0CCP0和TIMER0CCP1分别在PL4和PL5上面 //但是这里不做PWM使用,所以不需要对GPIOL4和5进行对应的PWM输出引脚定义 SYSCTL->RCGCGPIO |= SYSCTL_RCGCGPIO_R12+SYSCTL_RCGCGPIO_R8+SYSCTL_RCGCGPIO_R10; // activate clock for Port L,N,J while((SYSCTL->RCGCGPIO & (SYSCTL_PRGPIO_R12+SYSCTL_RCGCGPIO_R8+SYSCTL_RCGCGPIO_R10)) == 0){}; // wait for preparation of Port L,N,J time_init(); gpio_init();
上一篇:MSP432E401Y-时钟输出PWM
下一篇:MSP432E401Y-按键中断点灯
推荐阅读最新更新时间:2024-11-06 06:07
设计资源 培训 开发板 精华推荐
- 看视频赢京东卡 | 泰享实测之水哥秘籍第三期
- 泰克任意波形发生器,跨越成本极限,克服挑战
- 下载送好礼|人工智能物联网时代即将来临,您准备好了吗?
- 【分享成长,10月有奖】EEWORLD优秀主题/回复第15期活动开始啦!!!
- 【读书月】读一本RT-Thread技术好书,写下你的读书笔记
- 免费尝鲜:热气体式加速度传感器来啦,拍摄冲击对比实验有好礼
- 免费申请 | Nordic Semiconductor nPM1300-EK PMIC 评估套件
- ADI 系统方案精选【用于多路抽头输出隔离电源的简易解决方案】
- 提交WEBENCH设计,就能参与转盘抽奖!
- 有奖直播|罗彻斯特电子半导体全周期解决方案 助您应对供应链中断和元器件停产的挑战