MSP432定时器详解:深入理解Timer_A

msp432数据手册slau356h.pdf,P782


目录

1. 时钟源选择和分频器

2. 定时器A工作(计数)模式

 2.1 停止模式

 2.2 增计数模式

 2.3 连续计数模式

 2.4 增减计数模式

3. 捕获/比较模块

 3.1 捕获模式

3.2 比较模式

 4. 中断

5. Timer_A寄存器

6. 软件实例


MSP432单片机定时器模块有:看门狗定时器,16位定时器A,32位定时器,实时时钟。这里主要讨论定时器A。

定时器A(Timer_A)特点:

(1) 4种计数工作模式的异步16位定时/计数器

(2)参考时钟源可选择配置

(3)具有7个可配置的捕获/比较寄存器

(4)具有8种输出模式,可配置PWM输出

(5)异步输入和输出锁存

Timer_A可主要分为两个部分:主计数器和捕获/比较模块。主计数器负责定时、计时/计数,计数值(TAR寄存器的值)被送到各个捕获/比较模块中,它们可在无需CPU干预情况下根据触发触发条件和计数器值自动完成某些测量和输出功能。

定时器A的结构框图如下图所示:

        16位定时器的计数值寄存器TAR在每个时钟信号的上升沿进行增加/减少,可利用软件读取TAR寄存器的计数值。此外,当定时时间到,并且产生溢出时,定时器可产生中断。置位定时器控制寄存器中的TACLR控制位可自动清除TAR寄存器的计数值;同时,在增减计数模式下,清除了时钟分频器和计数方向。

1. 时钟源选择和分频器

        根据定时器A的结构框图可知,可通过TASSEL控制位进行选择Timer_A的时钟源(ACLK、SMCLK、TACLK、INCLK),对于选择的时钟源可通过ID控制位进行1/2/4/8分频,后通过TAIDEX控制位进行1/2/3/4/5/6/7/8分频。

PS:TASSEL控制位(寄存器CTL的9-8bit),ID控制位(寄存器CTL的7-6bit),TAIDEX控制位(寄存器EX0的2-0bit)

eg:若选择12MHz SMCLK作为Timer_A时钟源,分频值均为1,则每计一个数所需时长为:1/12000000=83.33ns.

2. 定时器A工作(计数)模式

         计数器A有4种计数模式:停止模式、增计数模式、连续计数模式、增减计数模式,其工作模式可通过MC控制位(CTL寄存器5-4bit)进行选择,见下表。

 2.1 停止模式

        停止模式用于定时器暂停,并不发生复位,所有寄存器现行的内容在停止模式结束后都可用。当定时器暂停后重新计数时,计数器将从暂停时的值开始以暂停前的计数方向计数。

eg:停止模式前,Timer_A定时器工作于增减计数模式并且处于下降计数方向,停止模式后,Timer_A仍然工作于增减计数模式下,从暂停前的状态开始继续沿着下降方向开始计数。如若不想这样,则可通过 TAxCTL寄存器中的TACLR控制位来清除定时器的计数及方向记忆特性。

 2.2 增计数模式

        比较寄存器TAxCCR0用作Timer_A增计数模式的周期寄存器,由于TAxCCR0为16位寄存器,所以在该模式下,定时器A连续计数值应小于0FFFFh。TAxCCR0的数值定义了定时的周期,计数器TAR可以增计数到TAxCCR0的值,当计数值与TAxCCR0的值相等(或定时器值大于TAxCCR0的值)时,定时器复位并从0开始重新计数。

 2.3 连续计数模式

       
 在连续计数模式下,Timer_A定时器增计数到0FFFFh之后从0开始重新计数,如此往复。

 2.4 增减计数模式

        需要对称波形的情况往往可以使用增减计数模式。在该模式下,定时器先增计数到TAxCCR0的值,然后反方向减计数到0。计数周期仍由TAxCCR0定义,它是TAxCCR0值的2倍。

3. 捕获/比较模块

         除了主计数器之外,Timer_A定时器还具有高达7个相同的捕获/比较模块TAxCCRn(其中n等于0~6),任何一个捕获/比较模块都可以用于捕获事件发生的时间或产生的时间间隔。每个捕获/比较模块都有单独的模式控制寄存器以及捕获/比较值寄存器。可通过CAP控制位(CCTLn寄存器中的8bit,n为0-6)选择捕获/比较模块工作在捕获模式/比较模式。

捕获/比较模块的逻辑结构见下图(以CCR6为例):

 3.1 捕获模式

        当CAP控制位(CCTLn寄存器8bit)设置为1时,捕获/比较模块配置为捕获模式。在捕获模式下,用定时器输入引脚电平跳变触发捕获电路,将此刻主计数器的计数值自动保存到相应的捕获值寄存器中,捕获事件发生的时间,可以用于测频率、测周期、测脉宽、测占空比等需要获得波形中精确时间。

        捕获输入CCIxA和CCIxB可连接外部引脚或内部信号,这需通过CCIS控制位(CCTLn寄存器13-12bit)进行配置。可通过CM控制位(CCTLn寄存器15-14bit)将捕获输入信号触发沿配置为上升沿触发、下降沿触发或两者都触发。

 

        捕获事件在所选输入信号触发沿产生,如果产生捕获事件,定时器将完成以下工作:

(1)主计数器TAR寄存器计数值复制到TAxCCRn寄存器中;

(2)置位中断标志位CCIFG(CCTLn寄存器0bit)

        输入信号的电平可在任意时刻通过CCI控制位(CCTLn寄存器3bit)进行读取。捕获信号可能会和定时器时钟不同步,并导致竞争条件产生,将SCS控制位(CCTLn寄存器11bit)置位,可在下个定时器时钟使捕获同步。捕获信号示意图见下图。

        如果第二次捕获在第一次捕获的值被读取之前发生,捕获比较寄存器就会产生一个溢出逻辑,在此情况下,将置位COV标志位。注意COV标志位必须通过软件消除。

总结:捕获模式的实质就是在捕获上升沿或下降沿的同时进入捕获中断,执行中断服务函数,同时把TAR计数的值赋给 TACCRn寄存器(n要看具体用的是哪个引脚的捕获),从而捕获到当前TAR(计数器)的值。

步骤:

step1. for 主计数器模块:设置TAxCTL寄存器(工作模式–stop mode、时钟源、预分频),清零TAR计数值;

step2. for 捕获/比较模块:设置TAxCCTLn寄存器(信号触发沿、输入引脚、信号同步、捕获/比较模式、中断使能、clear中断标志位);

step3. 设置NVIC:在NVIC优先级寄存器中设置优先级,在NVIC中断使能寄存器中使能中断;

step4. 启动计数器(up、continuous、up/down mode);

//以上步骤写在Timer_A捕获初始化函数中

step5. 编写中断服务函数;

step6. 启用中断(在所有设备初始化后的主程序中);

3.2 比较模式

        当CAP控制位设为0时,捕获/比较模块工作在比较模式。在比较模式下,每个捕获/比较模块将不断地将自身的比较值寄存器与主计数器的计数值进行比较,一旦相等,就将自动改变定时器输出引脚的输出电平,Timer_A具有8种输出模式,从而可在无需CPU干预的情况下输出PWM波、可变单稳态脉冲、移向方波、相位调制等常用波形。此模式下TAxCCRn的值可由软件写入,并通过比较器与主计数器的计数值TAR进行比较,当TAR计数到TAxCCRn时,将依次产生以下事件:

(1)置位中断标志位CCIFG;

(2)产生内部信号EQUn=1;

(3)EQUn信号根据不同的输出模式触发输出逻辑;

(4)输入信号CCI被锁存到SCCI

        每个捕获/比较模块都包含一个输出单元,用于产生输出信号,例如PWM信号等。每个输出单元都有8种工作模式,可产生EQUx的多种信号。输出模式可通过OUTMOD控制位(CCTLn寄存器中的7-5bit,n为0-6)进行选择,见下表:

 

例子:P2.6(TA0.3), P2.7(TA0.4)输出PWM波

/ PWM outputs on P2.6(TA0.3), P2.7(TA0.4)
// Inputs:  period : the value of TA0CCR0 //the Period of PWM is 2*period*8*(1/12M)
//          duty3  : the value of TA0CCR3 //the duty cycle of PWM_P2.6 is duty3/period
//          duty4  : the value of TA0CCR4 //the duty cycle of PWM_P2.7 is duty4/period
// Outputs: none
// SMCLK = 48MHz/4 = 12 MHz, 83.33ns
// Counter counts up to TA0CCR0 and back down
// Let Timerclock period T = 8/12MHz = 666.7ns
// period of P7.3 squarewave is 4*period*666.7ns
// P2.6=1 when timer equals TA0CCR3 on way down, P2.6=0 when timer equals TA0CCR3 on way up
// P2.7=1 when timer equals TA0CCR4 on way down, P2.7=0 when timer equals TA0CCR4 on way up

void PWM_Init34(uint16_t period, uint16_t duty3, uint16_t duty4){
  if(duty3 >= period) return; // bad input
  if(duty4 >= period) return; // bad input
  P2->DIR |= 0xC0;          // P2.6, P2.7 output
  P2->SEL0 |= 0xC0;         // P2.6, P2.7 Timer0A functions
  P2->SEL1 &= ~0xC0;        // P2.6, P2.7 Timer0A functions
  TIMER_A0->CCTL[0] = 0x0080;      // output mode : CCI0 toggle
  TIMER_A0->CCR[0] = period;       // Period is 2*period*8*83.33ns is 1.333*period
  TIMER_A0->EX0 = 0x0000;          // divide by 1(IDEX divider)
  TIMER_A0->CCTL[3] = 0x0040;      // output mode : CCR3 toggle/reset
  TIMER_A0->CCR[3] = duty3;        // CCR3 duty cycle is duty3/period
  TIMER_A0->CCTL[4] = 0x0040;      // output mode : CCR4 toggle/reset
  TIMER_A0->CCR[4] = duty4;        // CCR4 duty cycle is duty4/period
  TIMER_A0->CTL = 0x02F0;        // SMCLK=12MHz, divide by 8(ID divider), up-down mode
  //TA0CTL register
  // bit  mode
  // 9-8  10    TASSEL, SMCLK=12MHz
  // 7-6  11    ID, divide by 8
  // 5-4  11    MC, up-down mode
  // 2    0     TACLR, no clear
  // 1    0     TAIE, no interrupt
  // 0          TAIFG
}

 4. 中断

       
 16位定时器Timer_A具有两个中断向量:

 

        (1)TAxCCR0的中断向量CCIFG0;

        

        (2)具有其余TAxCCRn的中断标志CCIFGn及TAIFG的中断向量TAIV。

        在捕获模式下,当定时计数器TAR的值被捕获到TAxCCRn寄存器内时,置位相关的CCIFGn中断标志位。在比较模式下,当定时计数器TAR的值计数到TAxCCRn的值时,置位相关的CCIFGn中断标志位。也可利用软件置位或清除任意一个CCIFG中断标志位,当相关的CCIE中断允许位置位,CCIFGn中断标志位将请求产生中断。

        TAxIV中断主要包括TAxCCRn的中断标志CCIFGn和TAIFG中断标志。中断向量寄存器可被用来判断当前被挂起的Timer_A中断,之后通过查中断向量表得到中断服务程序的入口地址,并将其添加到程序计数器中,程序将自动转入中断服务程序。禁用Timer_A中断功能并不影响TAxIV中断向量寄存器的值。

5. Timer_A寄存器

 

PS: 各寄存器详细介绍见msp432数据手册slau356h.pdf,P796。

6. 软件实例

(6条消息) PWM驱动直流电机_一颗ting的博客-CSDN博客https://blog.csdn.net/qq_43855258/article/details/126371468

物联沃分享整理
物联沃-IOTWORD物联网 » MSP432定时器详解:深入理解Timer_A

发表评论