[MSP-EXP430G2ET] [MSP430G2 LaunchPad入门系列] 第5篇 - 定时器

  [复制链接]

17

主题

137

帖子

553

积分

单晶硅锭

Rank: 3Rank: 3

积分
553
楼主
查看: 20973回复: 12 发表于 2019-2-28 12:07:04   只看该作者
定时器可以说是单片机中最核心的模块,因为单片机的程序基本上都是按照时间顺序来完成的,而定时器就是负责提供这个时间的部分。MSP430中的定时器除了有基本的计数和中断功能外,还包含比较/捕获单元这个重要的辅助功能,可以方便地生成PWM波或是进行信号捕获。本章中将介绍MSP430G2系列的定时器TimerA,并学习如何使用定时器的比较/捕获单元。


本章目录如下:
章节题目
5.1定时器概述
5.2Timer_A定时器中的计数器
5.3Timer_A定时器的比较/捕获模块


MSP430G2 LaunchPad 相关资源链接:

本章内容PDF下载:
第五章-定时器.pdf (1.41 MB, 下载次数: 566)


本系列其他章节:



17

主题

137

帖子

553

积分

单晶硅锭

Rank: 3Rank: 3

积分
553
沙发
发表于 2019-2-28 12:09:27   只看该作者
本帖最后由 Shuyang 于 2019-2-28 12:11 编辑

5.1 定时器概述

在所有单片机中,定时器都具有极其重要的作用。因为单片机CPU是单线程的,所有任务必须按照顺序执行(除非有中断发生)。像是之前闪烁LED程序中的延时就是用CPU完成的,这相当于让CPU什么也不干,只是掰着手指头数秒,这无疑是对CPU的极大浪费。定时器的功能就像是一个可以定时的闹钟,可以帮CPU完成延时等重复的劳动,把CPU解放出来去完成更重要的工作,如运算、控制等。可以说有了定时器,CPU才真正成为了一个完整的自由人。

MSP430G2系列单片机的定时器叫做Timer_A模块。具体到MSP430G2553这个型号,内部有2个Timer_A定时器,分别叫做Timer0_A3和Timer1_A3,或简称TA0和TA1。在MSP430系列定时器的命名规则中,Timer后面的数字表示定时器的编号;而下划线后面的A或B表示定时器的类型;A后面的数字3表示定时器中包含3个比较/捕获单元。



Timer_A定时器是带有中断功能的,当定时器计数值到达设定的值时,将自动产生一个定时器中断信号。我们可以利用这个功能方便地制造一个周期性的中断,这样就可以每隔一段事件执行一个指令。利用这个中断也可以进行延时,并且这样的延时是不需要消耗CPU资源的。

Timer_A定时器除了完成计数以外,还“附赠”了一个重要的功能模块,叫做比较/捕获单元。顾名思义,这个单元有捕获和比较这两个功能。捕获功能的作用是可以自动捕捉一个外部信号的电平变化,并记录下该变化发生的时刻。例如一个周期性的方波,可以通过捕获单元分别记录两次上升沿(电平由低变高)或是下降沿(电平由高变低)的时刻,并将二者相减来计算出波形的周期。而比较功能最大的作用是可以自动产生脉宽调制波形(PWM),目前各种数字控制信号中很多都是通过PWM波来实现的,利用比较功能可以在不消耗CPU资源的情况下产生多路PWM波形。但需要注意的是,在同一时刻下,一个比较/捕获单元中只能在比较和捕获功能中选择一个进行使用,两个功能是无法同时使用的。


17

主题

137

帖子

553

积分

单晶硅锭

Rank: 3Rank: 3

积分
553
板凳
发表于 2019-2-28 12:17:34   只看该作者
本帖最后由 Shuyang 于 2019-2-28 12:26 编辑

5.2 Timer_A定时器中的计数器

Timer_A的核心是一个16位的计数器,其最大计数值是2的16次方,即从0到65535之间计数。在每个定时器的时钟周期,计数器的值会自动加1(或减1,取决于计数模式),我们可以通过配置寄存器来选择定时器的时钟周期。

计数器的计数值存在一个名为TAR的寄存器当中。默认状态下,当计数器的值达到65535之后,计数器会自动回到0并重新开始计数——这叫做计数器溢出。当计数器溢出时,定时器可以产生一个溢出中断,Timer_A的溢出中断标志位TAIFG会被置为1。这时如果我们开启了定时器中断使能位TAIE以及全局中断使能位,则MSP430会自动进入到定时器溢出中断服 务函数中。


从计数器的工作过程可以看出,只要定时器的时钟源保持精准,那么我们就可以通过计数器来完成精确的时间控制。计数器的值乘以时钟周期就等于真正的时间间隔。


5.2.1
计数器的工作模式


计数器共有4种工作模式,通过TACTL寄存器中的MCx位可以配置,其中MCx=00为停止,另外3种模式分别是:连续计数模式(continuousmode)、向上计数模式(up mode)、向上/向下计数模式(up/downmode)。TACTL寄存器的具体定义请查看MSP430x2xx Family User’s Guide的12.3节。

1)     连续计数模式(continuous mode

设置MCx=10,计数器将工作在连续计数模式下。在此模式下,TAR寄存器将从0到65535连续增加,到65535后则清零重新计数。

在连续计数模式下,定时器的周期仅由时钟源的频率决定,频率越高,则越快计数到65535,定时器周期越短。


2)     向上计数模式(up mode

设置MCx=01,计数器将工作在向上计数模式。与连续计数模式不同的是,向上计数模式时计数器的溢出值是由TACCR0寄存器设定的,计数器达到设定值后将自动清零。例如将TACCR0设为40959,则TAR的值只能在0到40959之间计数。

在向上计数模式下,定时器周期不仅与时钟源有关,还与TACCR0的设定值有关。


3)     向上/向下计数模式(up/down mode

设置MCx=11,计数器将工作在向上/向下计数模式。与向上计数不同的是,当计数器到达TACCR0的设定值之后,计数器不清零,而是从递增变成递减,直到计数器的值回到0。

在向上/向下计数模式下,定时器的周期是向上计数模式的两倍。



5.2.2 定时器中断

从上述3中工作模式的描述中可以看到,计数器工作时有2个关键节点,分别是计数达到CCR0和65535。与之对应的,定时器可以产生2个中断,分别是CCR0中断和溢出中断,它们对应的中断标志位分别是CC0IFG和TA0IFG,如上图所示。因为Timer_A定时器有3个比较/捕获单元,所以其实还可以产生CCR1和CCR2中断。但CCR0中断有其特殊性,我们会在下面专门讲解。

1)   CCR0中断

当计数器的值达到CCR0时,定时器会产生CCR0中断。CCR0中断是定时器所有中断中优先级最高的,并且单独拥有一个中断向量。而CCR1和CCR2与定时器溢出中断共用一个中断向量。CCR0中断的使能位CCIE和标志位CCIFG都在TACCTL0寄存器中,其中断向量名是TIMER0_A0_VECTOR。

要使用CCR0中断,首先要使能CCIE使能位,然后最关键的一步就是设置CCR0寄存器的值。无论是在向上计数模式还是向上/向下计数模式,当计数器的值到达CCR0时CCIFG都会被置位。当进入CCR0的中断服 务函数以后,CCIFG标志位会自动复位,不需要手动设置。

下面是一个CCR0中断的示例程序:
  1. int main(void)
  2. {
  3.     ...
  4.     TACCTL0 = CCIE;                                        // CCR0 interrupt enabled
  5.     TACCR0 = 1000;                                         // Set CCR0 value
  6.     ...
  7. }

  8. // Timer A0 CCR0 interrupt ser-vice routine
  9. #pragma vector=TIMER0_A0_VECTOR
  10. __interrupt void Timer_A(void)
  11. {
  12.     ...
  13. }
复制代码

2)   定时器溢出中断

除了CCR0中断之外,计数器还可以产生一个溢出中断。需要注意的是溢出中断发生的时刻并不是TAR的计数值等于溢出值的时刻,而是TAR的值返回到0的时刻。例如在向上计数模式下,CCR0中断信号产生的时刻是TAR等于CCR0的时刻,而溢出中断产生的时刻是TAR溢出后返回0的时刻,二者相差了一个时钟周期。

溢出中断的使能位TAIE和标志位TAIFG都在TACTL寄存器中。溢出中断与CCR1、CCR2中断共同分享一个中断向量,向量名是TIMER0_A1_VECTOR。那么如果同时开启了溢出中断和CCR1/CCR2中断,如何区分究竟是哪一个中断触发了中断向量呢?在定时器中有一个寄存器TAIV,它的第1-3位包含了中断源的信息。在中断服 务函数中读取TAIV寄存器的值可以判断究竟是哪一个中断信号触发了中断。TAIV寄存器的具体定义在“MSP430x2xx Family User's guide”的第12.3.5节。


对TAIV的读/写操作都会使当前优先级最高的一个中断标志位自动复位。如果此时还有其他中断在等待,那么该中断会在当前中断结束后执行。例如当前TACCR1和TACCR2标志位都被置位,那么读写TAIV之后,TACCR1的标志位会被自动复位,但TACCR2不会。当前中断服 务函数执行完之后会直接进入TACCR2的中断。

下面是一个定时器溢出中断的示例程序。与CCR0中断相比,主要是多了读取TAIV来判断中断源的语句。
  1. int main(void)
  2. {
  3.     ...
  4.     TACTL = TASSEL_2 + MC_2 + TAIE;                // SMCLK, contmode, interrupt
  5.     ...
  6. }

  7. // Timer_A interrupt vector (TA0IV) handler
  8. #pragma vector=TIMER0_A1_VECTOR
  9. __interrupt void Timer_A(void)
  10. {
  11.     switch( TA0IV )
  12.     {
  13.         case  2: break;                          // CCR1 not used
  14.         case  4: break;                          // CCR2 not used
  15.         case 10: P1OUT |= 0x01;           // overflow
  16.         break;
  17.     }
  18. }
复制代码


5.2.3 Timer_A计数器程序流程
  
下面我们可以来总结一下Timer_A中计数器的使用步骤:

1)    选择定时器的时钟来源(TASSELx)及分频值(IDx),常用的时钟来源有ACLK和SMCLK,此外也可以用外部时钟输入到TACLK引脚作为时钟源。


2)     确定定时器工作模式(MCx),即连续计数、向上计数、向上/向下计数,见上图。

3)     根据定时器工作模式确定使用哪个中断,并进行初始化。如果是CCR0中断需要打开使能位并设置CCR0的值;如果是溢出中断只要打开使能位即可。

4)     编写对应的中断服 务函数。


17

主题

137

帖子

553

积分

单晶硅锭

Rank: 3Rank: 3

积分
553
4#
发表于 2019-2-28 12:43:43   只看该作者
本帖最后由 Shuyang 于 2019-2-28 13:43 编辑

5.3 Timer_A定时器的比较/捕获模块

Timer_A的比较/捕获模块CCRx并不是独立的功能模块,它们都必须配合计数器才能工作。

捕获模块(capture)可以判断输入信号的边沿,并瞬间用TACCRx寄存器记录下边沿时刻(TAR值),用于精确测定脉宽或频率。

比较模块(comparator)可以将TAR寄存器值与TACCRx中的预设值比较,并自动按照“预设方案”翻转I/O电平,可以自动生成各种波形。

比较/捕获模块共用了TACCRx寄存器,所以不能同时使用,TACCTLx寄存器中的CAP位负责选择比较/捕获模式,CAP=0为比较,CAP=1为捕获。



5.3.1 捕获模块

将CAP设为1时,CCRx工作于捕获模式。计数器一般设置为连续计数模式,当CCRx检测到CCIx(带有捕获功能的I/O口)的电平边沿时,瞬间读取TAR寄存器的值并写入TACCRx中。


CCRx可以选择检测上升沿或下降沿,或者都检测。CCRx用于测定信号脉宽时,只需要分别记录信号上升沿时刻和下降沿时刻,二者相减就是脉宽;而测量频率时,连续记录两次上升沿时刻,相减就是周期。

使用捕获模式的一般步骤如下:

1)     把计数器设为连续计数模式,这样就有最长的“刻度尺”可用。如果“尺子”长度还不够用,可以设定尺子每溢出一次,中断服 务函数中给全局变量count+1,这样就能测量任意时间长度了。

2)     把TACCTLx寄存器中的CAP位设为1,捕获模式。

3)     选择CCRx模块的捕获源寄存器CCISx,也就是具体哪个引脚作为捕获输入口CCIx。

4)     设定CMx寄存器,决定是上升沿捕获、下降沿捕获,还是两者都捕获。

5)     设定SCS寄存器,决定是同步捕获还是异步捕获,一般都是设为同步捕获。

6)     等待捕获信号到来并读取CCRx的捕获值。


5.3.2 比较模块

当CAP=0时,CCRx工作于比较模式。CCR0在比较模式中用于设定计数器的周期,CCR1和CCR2负责设定比较值。

当CCR1/2发现TAR的值与CCR0或者它们自己的CCRx值相等时,便会自动改变输出I/O口TAx的输出电平,从而生成波形。改变的规则由OUTMODx寄存器决定,共有8种规则。具体规则定义见“MSP430x2xx Family User's guide”的第12.2节。


这8种规则和计时器的3种工作模式(连续计数、向上计数、向上/向下计数)组合起来,共有24种排列组合,看起来十分复杂。但其实最常用的功能就是用来生成PWM波。所谓PWM波是指“脉冲宽度调制”波形(PulseWidth Modulation),就是一定周期的方波,其高电平时间和低电平时间的比例(称为“占空比”)可以控制。PWM的应用十分广泛,例如要控制一个电机的转速,一般都是通过给出一定占空比的PWM波来实现的。


下面我们来分析一下模式2:Toggle/Reset,即OUTMODx=010。在此模式下,TAx引脚电平会按照下面规律变化:

  • Toggle:当TAR=CCRx时,TAx引脚电平自动翻转;
  • Reset:当TAR=CCR0时,TAx引脚电平自动变为0。

我们一般将计数器设为向上计数模式(up mode)来生成PWM波。根据上面的变化规律,可以推导出TAx引脚电平变化如下图所示。


可以看到引脚电平分别在TAR等于CCR0和CCR1两个时刻发生了变化。因此,只要改写CCR0和CCR1的值就可以设定PWM的周期和占空比。其中CCR0负责控制周期,CCR1负责控制占空比。

其他几种输出模式的作用请见下图。我们看到模式2/3/6/7其实都可以生成PWM波。为了在设置占空比时更直观,我们一般用模式7。此时可以看到CCRx与占空比成正比,CCRx的值越大,占空比越大。


比较模块产生的PWM波只能在特定引脚输出,且CCRx寄存器与TAx引脚一一对应。例如Timer_A0CCR1产生的PWM只能在TA0.1,Timer_A0 CCR2产生的PWM只能在TA0.2,以此类推。需要注意的是在比较模块中,CCR0是用来设定周期的,因此一个定时器最多可以产生2路不同的PWM波形。


5.3.3 比较模块产生PWM

本节中我们来详细介绍利用比较模块产生PWM波的步骤。

1)   设定PWM波的输出端口。

只有具备定时器输出功能的引脚才能输出PWM波。在MSP430中这些引脚用TA0.x或TA1.x来标明。TA0.0-TA0.2是Timer0的输出端口,TA1.0-TA1.2是Timer1的输出端口。


从MSP430G2553 datasheet中可以看到,20pin的G2553没有留出TA0.2输出端口,之前也介绍过CCR0在比较模式下不能输出PWM,因此真正能够输出PWM的端口就是TA0.1、TA1.1、TA1.2这3组。20pin的MSP430G2553共有3个TA0.1端口,以及2个TA1.0/TA1.1/TA1.2端口,所以极限情况下一共可以输出3组7路PWM波。

要将I/O口设为PWM输出口,需要按照第二章介绍的引脚复用方法设定相应的寄存器。除了P2.6(TA0.1)这个端口外,其他几组端口的寄存器设置基本类似,即DIR寄存器为1,PxSEL寄存器为1,PxSEL2寄存器为0。

I/O口寄存器的详细配置请见MSP430G2553 datasheet的“Port Schematics”部分。


例如下面我们来将P2.1/TA1.1引脚配置位PWM输出引脚。
  1.   P2DIR |= BIT1;                        // Set P2.1 as TA1.1
  2.   P2SEL |= BIT1;
复制代码

2)   设定CCR0CCRx的值。

设定好PWM输出引脚之后,我们就要来确定PWM的周期和占空比了。周期由CCR0寄存器决定,CCR0的值乘以定时器时钟周期就是PWM的周期。占空比等于CCRx/CCR0,在输出模式7下,CCRx的值与占空比成正比。
  1.   TA1CCR0 = 512;                      // PWM Period
  2.   TA1CCR1 = 256;                      // PWM duty cycle
复制代码

3)   选择比较/捕获模块的输出模式。

根据上一节的介绍,我们一般选择输出模式7来生成PWM波。输出模式通过TACCTLx寄存器来设置。注意每个比较/捕获模块有自己的TACCTLx寄存器,例如要选择TA1.1引脚的输出模式,就需要配置TA1CCTL1寄存器。
  1.   TA1CCTL1 = OUTMOD_7;                 // Set output mode to 7
复制代码

4)   选择定时器的时钟源和计数模式。

定时器的时钟源也决定了PWM的周期。Timer_A定时器可以使用SMCLK或者ACLK,并且可以分频。时钟和分频都由TACTL寄存器设定。另外这个寄存器也负责选择计数器的计数模式,我们一般选择向上计数模式(Up mode)。


设定好TACTL寄存器之后,定时器就开始工作了,将会产生PWM输出。因此我们一般将设置TACTL的指令放在最后。
  1.   TA1CTL = TASSEL_2 + MC_1;                        // SMCLK, up mode
复制代码

5)   MSP430开始自动生成PWM波,CPU可进入低功耗模式。

设置好上述步骤以后,比较模块就将开始生成PWM波。由于这样产生的PWM波完全是由定时器生成的,与CPU无关,因此现在CPU可以去处理更重要的任务,或是进入低功耗模式休息。
  1. _BIS_SR(CPUOFF);                                        // Enter LMP0
复制代码



5.3.4 使用比较/捕获模块的捕获功能

本节中我们来介绍比较/捕获模块的捕获功能的使用。捕获功能的典型应用是用来测量外部输入信号的上升/下降沿之间的时间间隔。

1)     捕获输入端口

使用捕获功能时外部信号是通过MSP430的捕获引脚输入进来的。之前介绍过每个Timer_A定时器有3个比较/捕获模块,捕获和比较可以看作是对偶的功能。上一节中我们也列出了MSP430G2553中带有比较输出功能的引脚。但需要注意并非所有带比较输出功能的引脚都有捕获输入功能,下面我们来详细分析。

从比较/捕获模块(CCRx)的框图中可以看到,每一个CCRx模块其实有2个捕获输入,分别命名为CCIxA和CCIxB。比如CCR2模块的捕获输入叫做CCI2A和CCI2B。因此每个Timer_A定时器有6个捕获输入,对于20pin的MSP430G2553来说,有Timer0_A3和Timer1_A3两个定时器,因此理论上最多可以有12个捕获输入。


但需要注意的是,受引脚数量限制,并非所有的捕获输入都会在20pin的MSP430G2553上出现。具体需要查看MSP430G2553的datasheet,在datasheet第16页Timer_A3部分的表格里给出了具有捕获功能的引脚。

从表格中可以看出,在Timer0中只有2个捕获输入引脚,分别是P1.1(3号脚)和P1.2(4号脚),它们分别对应Timer0中的CCI0A和CCI1A。而Timer1中的捕获引脚比较齐全,6个捕获引脚无一缺席。Timer1中每一个CCRx会有2个比较输入,例如CCR0有P2.0和P2.3,分别为CCI0A和CCI0B。

具体每一个捕获引脚的位置请对照datasheet中的引脚描述。



我们可以根据datasheet中的介绍总结出以下的捕获功能引脚分布图(针对20pin的MSP430G2553)。

  
引脚
  
定时器–  CCRx
捕获模块名称
P1.1
Timer0 – CCR0
CCI0A
P1.2
Timer0 – CCR1
CCI1A
P2.0
Timer1 – CCR0
CCI0A
P2.3
Timer1 – CCR0
CCI0B
P2.1
Timer1 – CCR1
CCI1A
P2.2
Timer1 – CCR1
CCI1B
P2.4
Timer1 – CCR2
CCI2A
P2.5
Timer1 – CCR2
CCI2B


使用捕获功能的第一步就是选择捕获输入引脚,通过TACCTLx寄存器中的CCISx可以选择输入。共有CCIxA、CCIxB、GND、Vcc四种选择。


例如我们想用P1.1作为捕获输入,它对应的是Timer0的CCI0A。代码如下:
  1.   TA0CCTL0 |= CCIS_0;                      // CCI0A of Timer0 for capture input
复制代码

2)     上升沿/下降沿选择

可以选择捕获输入信号的上升沿、下降沿、或是二者都捕获。通过TACCTLx寄存器的CMx位可以选择。


继续接上面的例子,如果选择上升沿捕获,代码如下:
  1.   TA0CCTL0 |= CM_1;                      // Capture on rising edge
复制代码

3)     捕获中断

当比较/捕获模块处在捕获模式下,且输入信号的变化满足了捕获条件时(上升沿或者下降沿,由CMx决定),会产生一个中断信号CCIFG。如果需要使用这个中断,则需要在初始化时使能CCIE中断使能位。代码如下:
  1.   TA0CCTL0 |= CCIE;                      // Enable capture interrupt
复制代码

中断被使能后,单片机会在捕获条件达到时进入中断服 务函数。捕获中断和比较中断一样,都是使用CCRx的中断向量。请回忆5.2.2节在介绍定时器中断时讲到的CCR0中断与CCR1/CCR2中断的区别,CCR0使用单独的中断向量,CCR1、CCR2和TAIFG共用一个中断向量。二者的主要区别在于如果使用CCR1/CCR2中断,则需要在中断服 务函数函数中加入判断语句,确定是那一个中断信号触发了中断。

在中断服 务函数中,可以对捕获的结果进行用户所需要的计算。例如计算周期、频率或是时间间隔等。例如上面例子中,如果输入信号触发了CCR0中断,则中断服 务函数格式如下:
  1. // Timer A0 CCR0 interrupt ser-vice routine
  2. #pragma vector=TIMER0_A0_VECTOR
  3. __interrupt void Timer_A(void)
  4. {
  5.     ...
  6. }
复制代码

4)     开启捕获功能

上述初始化全部完成后,可以将寄存器TACCTLx中的CAP置为1,开启捕获功能。另外捕获模块中提供了一个输入信号同步功能,这是为了避免由于捕获信号和定时器时钟不同步而造成紊乱现象,一般建议将SCS置为1开启同步功能。
  1.   TA0CCTL0 |= CAP + SCS;                      // TA0CCR1 Capture mode
复制代码

5)     开启定时器

上面1-4步只是初始化了捕获模块,最后不要忘记根据5.2.3节中介绍的步骤对定时器进行初始化,并打开定时器。定时器一旦打开,捕获模块就开始工作了。

上面1-4步的代码可以合并为一个语句,再加上一个定时器初始化语句,就成为下面一个完整的捕获模块初始化代码:
  1. TA0CCTL0 = CAP + CM_1 + CCIE + SCS + CCIS_0;        // TA0CCR0 Capture mode, CCI0A, Rising edge, interrupt enable
  2. TA0CTL |= TASSEL_2 + MC_2 + TACLR;                        // SMCLK, Cont Mode, start timer
复制代码


17

主题

137

帖子

553

积分

单晶硅锭

Rank: 3Rank: 3

积分
553
5#
发表于 2019-3-5 12:26:03   只看该作者
本章参考资料:     
  
1.     《从零开启大学生电子设计之路--基于MSP430 LaunchPad口袋实验平台》,杨艳,傅强编著,北京航空航天大学出版社,2014年8月第1版。
2.     “MSP Design Workshop” by TexasInstruments, Version 4.60, May 2016, http://processors.wiki.ti.com/index.php/MSP_Design_Workshop
3.     “Getting Started with the MSP430G2553Value-Line LaunchPad Workshop” by Texas Instruments, Version 2.22, July 2013, http://processors.wiki.ti.com/in ... _LaunchPad_Workshop
4.     MSP430G2553 datasheet (Rev.J), May2013, http://www.ti.com/mcu/docs/litab ... 2&familyId=1937
5.     MSP430x2xxFamily User's Guide, SLAU144J, http://www.ti.com/cn/lit/pdf/slau144
6.     MSP-EXP430G2LaunchPad Evaluation Kit User's Guide, SLAU318G, March 2016, http://www.ti.com/cn/lit/pdf/slau318

0

主题

7

帖子

4

积分

一粒轻沙

Rank: 1

积分
4
6#
发表于 2019-4-19 15:56:38   只看该作者
正在学习单片机,非常有用

0

主题

14

帖子

53

积分

一粒轻沙

Rank: 1

积分
53
7#
发表于 2019-4-20 18:38:17   只看该作者
好!谢谢老师

0

主题

3

帖子

16

积分

一粒轻沙

Rank: 1

积分
16
8#
发表于 2019-6-28 19:57:47   只看该作者
谢谢老师,很有用

0

主题

24

帖子

20

积分

一粒轻沙

Rank: 1

积分
20
9#
发表于 2019-7-10 20:14:00   只看该作者
好看!!!!

0

主题

6

帖子

238

积分

二氧化硅

Rank: 2

积分
238
10#
发表于 2019-7-17 09:21:41   只看该作者
谢谢老师

0

主题

14

帖子

6

积分

一粒轻沙

Rank: 1

积分
6
11#
发表于 2019-7-24 10:25:36   只看该作者
谢谢分享

0

主题

1

帖子

60

积分

一粒轻沙

Rank: 1

积分
60
12#
发表于 2019-8-4 14:19:20   只看该作者

棒棒!对我很有帮助!写得很基础且易懂,比直接啃书接受起来轻松多了。

0

主题

13

帖子

15

积分

一粒轻沙

Rank: 1

积分
15
13#
发表于 2020-2-15 10:58:37   只看该作者
Shuyang 发表于 2019-2-28 12:43
5.3 Timer_A定时器的比较/捕获模块

Timer_A的比较/捕获模块CCRx并不是独立的功能模块,它们都必须配合计数 ...

谢谢分享
快速回复 返回顶部 返回列表