浅谈msp430f5529入门(3)——定时器A/Timer_A
来源:互联网 发布:手机熊族软件 编辑:程序博客网 时间:2024/06/08 06:38
这次聊聊定时器A,Timer_A。
F5529的定时器和F149刚能上几乎没有区别,会用F149的定时器就会用F5529的定时器了。可是呢~F55系列定时器的数量不一样了,而且寄存器的名字也有所改变了。
·F5529一共有3个定时器A,3个!TimerA!这3个分别是Timer0_A5,Timer1_A3,Timer2_A3,前面的数字就是定时器的序数,后面的数字是这个定时所拥有的捕获比较单元数量。
这些我都不是从datasheet或者user guide上查到的,而是最直接地翻CCS里的<msp430f5529.h>知道的。datasheet和user guide 都是讲一个系列的,各种芯片之间可能有点差异,所以还是进这个专门的头文件里找比较精确。因为数目多了,所以在使用时很容易会产生混乱。大家刚开始学着写程序时一定要经常翻翻user guide和头文件,避免写错。
x代表定时器,n代表捕获比较单元,Timer_A的寄存器也就这么6种,需要我们注意的也就2种。都是TAx开头,如果是涉及捕获比较单元的会在后面再有个n。
TAxCTL——定时器Ax的控制寄存器。
TAxCCTLn——定时器Ax里的捕获比较单元n的控制寄存器,多了个C是Capture/Compare。
TAxR——定时器Ax的计数器,这个不归我们管。
TAxCCRn——定时器Ax里的捕获比较寄存器,用到这个捕获比较的时候直接写就行了,或者是写CCR0。
TAxIV——定时器Ax的中断向量寄存器。进这个中断时查看就行了,switch。
TAxEX0——定时器A扩增的寄存器,里面只有一个TAIDEX对时钟再分频,可以忽略。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
待我们用到定时器时,对着user guide,
先把TAxCTL设置好——TASSEL时钟源,ID分频不分频,MC工作模式,TAIE打开不打开定时器溢出中断。
再把要用到的捕获比较单元的TAxCCTLn设置好——CAP捕获还是比较,捕获的话CM怎么捕,SCS同步,CCIS信号从哪进;
无论捕获还是比较,CCIE中断总得打开吧;
如果输出PWM波,设置OUTMOD就够了(一般用模式7)。
最后写TAxCCRn(比较或者是输出PWM波)。
----------------------------------------------------------------------------------------------------------------------------------------------------------
有些疑问。
对于TAxCCTLn里的CCIS和SCCI我搞不太懂。
CCIS默认的是CCIxA,这个就是该捕获比较单元所对应的引脚,但CCIxB对应的是哪个呢?我找不出来。我也试过,不是对应的TBxCCTLn的引脚。另外VCC和GND是怎么捕获的,也不太好懂。还好这问题无伤大雅,就那默认地CCIxA用就行了。
另外,SCCI的值说是信号发生跳变时,也就是捕获瞬间的值,但这瞬间的值是什么?捕获前还是捕获后的电平,我无从而知,也没有人告诉我。
曾看了这一段程序,说是可以测PWM波持续高电平的时间,用的是上升下降沿捕获。
#pragma vector = TIMERA1_VECTOR__interrupt void TIMERA1(void){ switch(TAIV) { case TAIV_TACCR1: if((TACCTL1 & SCCI)== SCCI) { pulse = CCR1-oldCCR1; } oldCCR1=CCR1; case TAIV_TACCR2:break; case TAIV_TAIFG: break; }}
可我试了貌似不行,而且在我写的程序里面,单步单步的运行,一直看SCCI都是0,没有变过。
如果有哪位懂得这两个问题而又刚好看见这篇文章的,请不要吝啬地留言。谢谢!
----------------------------------------------------------------------------------------------------------------------------------------------------------
那么对于如何测PWM波持续高电平的时间,我想到这样的办法,大家应该都能想出来。
#pragma vector = TIMER0_A1_VECTOR__interrupt void timer0A1( void ){switch( __even_in_range( TA0IV,14) ){case TA0IV_TA0CCR1 :period = TA0CCR1 - oldccr1;oldccr1 = TA0CCR1;break;case TA0IV_TA0CCR2 :if( TA0CCTL2 & CM_1 ){TA0CCTL2 &= ~CM_1;//取消上升沿捕获TA0CCTL2 |= CM_2;//改为下降沿捕获oldccr2 = TA0CCR2;}else{TA0CCTL2 &= ~CM_2;//趋向下降沿捕获TA0CCTL2 |= CM_1;//改为下降沿捕获pulse = TA0CCR2 - oldccr2;}break;case TA0IV_TA0CCR3 :break;case TA0IV_TA0CCR4 :break;case TA0IV_TA0IFG :break;}}无非就是进上升沿中断后改下降沿。比较笨的方法,但能用。
----------------------------------------------------------------------------------------------------------------------------------------------------------
关于每一种工作模式如何如何地我就不啰嗦了,和149一样,如果有F149底子应该都懂的。学到5529,我觉得要注意的就是寄存器和有一些位的命名。多了真的很容易混乱,不过多练几次很快就能掌握记忆的技巧了。
祝大家学习愉快!
- 浅谈msp430f5529入门(3)——定时器A/Timer_A
- MSP430F5529 (六)定时器Timer_A
- MSP430F5529 (六)定时器Timer_A-1
- MSP430F5529 (六)定时器Timer_A-2
- 浅谈msp430f5529入门(1)——时钟模块DCO
- 浅谈msp430f5529入门(2)——时钟配置、例程分析
- MSP430F5529 (七)定时器B
- 单片机MSP430 - 定时器Timer_A
- (1)MSP430F5529学习入门
- 单片机MSP430 - Timer_A 定时器中断程序
- msp430单片机Timer_A产生两路定时器
- MSP430F5529—遇到bug--输出电平不成功
- nodeJS入门例子一—定时器(timers)
- nodeJS入门例子一—定时器(timers)
- 讲讲我自己对ADC12模块的心得——msp430f5529
- Nokia LCD 5110 移植(基于MSP430F5529)
- Windows SDK入门浅谈 — 写给初学者
- Windows SDK入门浅谈 — 写给初学者
- maven的jar包的查询地址
- git 修改远程仓库 remote origin
- IOS 判断应用版本和升级提示
- Eclipse常用配置
- jQuery hover事件 parent和parents
- 浅谈msp430f5529入门(3)——定时器A/Timer_A
- 寒城攻略:Listo 教你 25 天学会 Swift 语言 - 08 Functions
- android 通过uri启动Activity
- 拷贝构造函数与赋值运算符重载的区别
- 排序算法
- VBS学习日记(七) 重复操作
- PreparedStatement接口的常用方法及其描述
- Cookie/Session机制详解
- 动态规划解最长公共子序列问题