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

发布者:吉州古玩斋最新更新时间:2022-08-08 来源: csdn关键字: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();

[1] [2]
关键字:MSP432E401Y  定时器  中断控制  LED闪烁 引用地址:MSP432E401Y-用定时器中断控制LED闪烁

上一篇:MSP432E401Y-时钟输出PWM
下一篇:MSP432E401Y-按键中断点灯

推荐阅读最新更新时间:2024-11-06 06:07

STM32驱动多个超声波模块(只用一个定时器
用STM32单片机成功驱动一个超声波模块后,接下来便有了疑问如何用stm32单片机驱动多个超声波模块呢?(驱动一个超声波模块可以参考:stm32驱动超声波模块测距) 超声波模块型号为HC-SR04,模块驱动方式选择利用外部中断的方式驱动(具体细节可参见上面链接)。 经过一个下午的思考实验发现了两种驱动多个超声波模块的方法: 分时测量 同时测量 1.分时测量: 通过类似于实现流水灯的方法,多个超声波模块依次测量并将测量结果依次输出。 优点:各个超声波模块测量过程中不会出现相互干扰的情况。 缺点:整体测量周期长,数据采样频率比较低。 这里有几个问题点需要注意: 一个超声波模块需要在测量完成后再开始下一个模块的测量 超声波模块在
[单片机]
STM32实战 4.利用定时器与串口接收指令控制LED亮度
#include sys.h #include led.h #include delay.h #include string.h #include USART3_TIM2.h char *str_open = open ; char *str_close = close ; int main(void) { delay_init(); Led_Init(); USART3_TIM2_Init(115200); while(1) { if(RX_stat == 1)//表示接受完成 { if(strcmp(RX_buf,str_open) == 0) { LED = 0;
[单片机]
总结MSP430学习经验(3)
2:连续模式,定时器计数到0xFFFF;3:增减模式,0- TACCR0- 0 TACLR: 定时器清零位。该位置位会复位 TAR,时钟分频和计数方向。TACLR位会自动复位并读出值为0 TAIE: TA 中断允许。该位允许 TAIFG 中断请求 0:中断禁止;1:中断允许 TAIFG: TA中断标记 0:无中断挂起;1:中断挂起 2、TAR:TimerA计数寄存器 学习经验总结】 alt= 【msp430 学习经验总结】 width=30 height=30 3、TACCTLx:捕获比较控制寄存器 学习经验总结】 alt= 【msp430 学习经验总结】 width=30 height=30
[单片机]
S3C2410中脉宽调制定时器
S3C2410有5个16bit定时器。定时器0-3有脉宽调制功能(Pulse Width Modulation,PWM),定时器4是内部定时器,没有输出引脚。定时器0有Dead-zone发生器,可以保证一对反向信号不会同时改变状态,常用于大电流设备中。 定时器0-1共用一个8bit prescaler,定时器2-4共用另外一个。每个定时器有一个时钟分频器,可以选择5种分频方法。每个定时器从各自的时钟分频器获取时钟信号。prescaler是可编程的,并依据TCFG0-1寄存器数值对PCLK进行分频。 当定时器被使能之后,定时器计数缓冲寄存器(TCNTBn)中初始的数值就被加载到递减计数器中。定时器比较缓冲寄存器(TCM
[单片机]
S3C2410中脉宽调制<font color='red'>定时器</font>
AVR 定时器使用范例
/*********************************************** **** AVR 定时器使用范例 *** **** *** **** 作者: HJJourAVR *** **** 编译器:WINAVR20050214 *** **** *** **** www.OurAVR.com 2005.9.22 *** ***********************************************/ /* 本程序简单的示范了如何使用ATMEG
[单片机]
控制IRQ和FIQ中断的编译器内部函数 - 基于Keil MDK
编译器内部函数__disable_irq、__enable_irq、__disable_fiq和__enable_fiq用于控制IRQ和FIQ中断。 只有当处理器处于特权模式才可以使用这些内部函数,因为这些函数要改变寄存器CPSR和SPSR(ARM7、ARM9等)或者PRIMASK和FAULTMASK寄存器(Cortex-M3、M4等),而这些寄存器只有在特权模式下才能被访问。 这些内部函数对所有架构的处理器都有效,无论是ARM状态还是Thumb状态,如下所述: 如果使用的是ARMv6(ARM11)或更新架构,编译器会将这些函数用CPS指令代替。 如果使用的是ARMv4或者ARMv5架构并且处于ARM状态,编译器会将这些函
[单片机]
STM8S 定时器的使用
看了网上的资源,都不怎么好用,于是决定总结总结,记录下定时器的简单实用方法。 环境: STM8SF103 ,仿真器为:STLINK TIM4 属于8位定时器,最大128分频。 这个定时器的时钟源是系统时钟源(fMaster),然后直接通过预分频器分频后供CK_CNT使用。如:系统频率为4MHz,经过128分频后,提供给定时器使用的频率就为 31250Hz 因为项目需要,我这里使用的内部RC 16MHz振荡器,并进行LSI 4分频,所以主频为4MHz。 //main.c void Init_Tim4(void) { /*很多人都是在这里装填0xFF,其实是为了让PSC尽快生效,对于PSC的设置,需要在下一个
[单片机]
STM32G0开发笔记:定时器timer的基本使用方法
使用Platformio平台的libopencm3开发框架来开发STM32G0,以下为定时器timer的基本使用方法。 1 新建项目 在PIO主页新建项目timer,框架选择libopencm3,开发板选择 MonkeyPi_STM32_G070RB; 新建完成后在src目录新建主程序文件main.c; 然后更改项目文件platformio.ini的烧写和调试方式: 1upload_protocol = cmsis-dap 2debug_tool = cmsis-dap 2 使用基本定时器 定时器设置 以下为设置定时器3的过程: 1static void timer_setup(void) 2{ 3 /* Enabl
[单片机]
STM32G0开发笔记:<font color='red'>定时器</font>timer的基本使用方法
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved