MSP432E401Y-用定时器中断控制LED闪烁

一、初始化以及初始化配置

        要使用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();


    while(1){
        GPION->DATA |=BIT0;//亮一个灯证明系统正常运行
    }
}

你可能感兴趣的:(ccs,msp)