历史上的今天
今天是:2025年02月09日(星期日)
2020年02月09日 | MSP430学习笔记3----定时器学习
2020-02-09 来源:eefocus
先给出框图

随便从百度文库上找了个定时器程序,分析下。
1 #include 2 void main (void) 3 { 4 WDTCTL = WDTPW + WDTHOLD; 5 6 7 TA1CTL|=TASSEL_2+TACLR+MC_3+ID_3;//采取内部时钟源1.04M,八分频,增减计数模式 8 TA1CCTL0=CCIE;//启用定时器中断 9 TA1CCR0=65535;//计数1S 10 P1DIR|=BIT0; 11 _EINT(); 12 //LPM4; 13 while(1); 14 } 15 #pragma vector=TIMER1_A0_VECTOR 16 __interrupt void ta10_isr(void) 17 { 18 P1OUT^=BIT0; 19 } View Code 测试通过,这个程序可以是LED1按2秒的频率闪烁(1秒亮,一秒暗)下面分析下: 第1句:WDTCTL = WDTPW + WDTHOLD; 这一句有点不太懂了,明明是定时器,怎么把看门狗定时器给停止了呢? 第2句:TA1CTL |= TASSEL_2+TACLR+MC_3+ID_3; 后面的解释:采取内部时钟源1.04M,八分频,增减计数模式。 先分析程序句,去头文件里找各自的定义: 1 SFR_16BIT(TA1CTL); /* Timer1_A3 Control */ 1 #define MC_0 (0*0x10u) /* Timer A mode control: 0 - Stop */ 2 #define MC_1 (1*0x10u) /* Timer A mode control: 1 - Up to CCR0 */ 3 #define MC_2 (2*0x10u) /* Timer A mode control: 2 - Continous up */ 4 #define MC_3 (3*0x10u) /* Timer A mode control: 3 - Up/Down */ 5 #define ID_0 (0*0x40u) /* Timer A input divider: 0 - /1 */ 6 #define ID_1 (1*0x40u) /* Timer A input divider: 1 - /2 */ 7 #define ID_2 (2*0x40u) /* Timer A input divider: 2 - /4 */ 8 #define ID_3 (3*0x40u) /* Timer A input divider: 3 - /8 */ 9 #define TASSEL_0 (0*0x100u) /* Timer A clock source select: 0 - TACLK */ 10 #define TASSEL_1 (1*0x100u) /* Timer A clock source select: 1 - ACLK */ 11 #define TASSEL_2 (2*0x100u) /* Timer A clock source select: 2 - SMCLK */ 12 #define TASSEL_3 (3*0x100u) /* Timer A clock source select: 3 - INCLK */ 第1句话表示了在特殊功能寄存器里找16个位置给Timer1_A3 Control;后面12句话定义了各个宏,实际上就是用前面的标示符表示后面的数,没别的意思。 从数据手册上截取: 数据手册对TACTL的结构有说明: 后面对各个有详细的说明,这里只说明遇到的: (1)TASSELx: (Timer_A Source select,A计时器的激励源选择) TASSEL_0: 00 代表着 TACLK,外部时钟单元 TASSEL_1: 01 代表着 ACLK ,Auxiliary clock ,辅助时钟单元,可做2、4或者8分频。 TASSEL_2: 10 代表着 SMCLK,Sub-main clock,子时钟单元,也可做2、4或者8分频。 TASSEL_3: 11 代表着 INCLK ,外部时钟单元 (2)IDx: 表示分频的个数 ID_0 ID_1 ID_2 ID_3 1分频,也就是不分 2分频 4分频 8分频 (3)MCx表示模式 百度文库找个图: 嘿嘿,这个图就是整个的定时器结构图和计数模式了,虽然有点复杂,但对于老爷们来说,这点事不算啥。 (4)TACLR:Timer A clear 第3句:TA1CCTL0=CCIE; 后面给出的解释是:启用定时器中断。 从头文件里获取 SFR_16BIT(TA1CCTL0); #define CCIE (0x0010) /* Capture/compare interrupt enable */ 如果TA1CCTL0=CCIE,实际上在置CCIE位为1的同时,把其他位置0, 第4句:P1DIR|=BIT0; BIT0在头文件里这么定义的,并不是0的意思: 1 #define BIT0 (0x0001) 2 #define BIT1 (0x0002) 3 #define BIT2 (0x0004) 4 #define BIT3 (0x0008) 所以这句话的意思是把P1.0 的方向设为输出。 第5句:_EINT(); enable interuption 打开全局中断。 相反的,_DINT(); disable interruption关闭全局中断。 第6句:#pragma vector=TIMER1_A0_VECTOR __interrupt void ta10_isr(void) 用关键字来__interrupt来定义一个中断函数。注意前面的下划线是两个,一个会出错的。 用#pragma vector来提供中断函数的入口地址。 



上一篇:msp430学习笔记之时钟
下一篇:MSP430定时器介绍
史海拾趣
|
发现,最近一阵子,论坛里最八卦最大的八卦点就是: EEWORLD 美眉的声音。 (当然,我就是其中之一。哈哈) 先来几个证据: (去我的回复里找找就行了~~) https://bbs.eeworld.com.cn/viewthread.php?tid=109503&e ...… 查看全部问答> |
|
关于ARM7 LPC2368无操作系统移植TCP/IP协议栈,八百里加急!!! 我刚刚接触嵌入式编程不久 最近接手一个项目要求无操作系统移植一个TCP/IP协议栈,任务比较急 开始我打算移植LwIP,但是过程中遇到了许多问题无法解决 现在正在试图移植 nichelite的TCP/IP协议栈, 因为nichelite LPC23xx系列的程序针对8389芯片编 ...… 查看全部问答> |
|
如题!不是ppc呀...我做了个程序,编译没问题,用的是voimage,但运行的时候就说少组件???这是为什么呀???难道wince不支持imgdecmp+voimage????只能ppc里面用??? 那wince用什么浏览图片???… 查看全部问答> |
|
我想用430测一个从外部输入的脉冲在1秒钟时间的脉冲数,我用Timer_A定时一秒,然后把输入引脚定义为捕获模式,每测到一个脉冲TAR应加1,(TAR初值是0吧???)同时TAR把此值写入CCR1,那么我到定时时间到时直接读取CCR1的值就是一秒钟内的脉冲数, ...… 查看全部问答> |
|
J-link 出现target vcc failure .please check target voltage.failed to connect J-link 出现target vcc failure .please check target voltage.failed to connect我是笔记本电脑,用的开发板是mini2440。在看国嵌体验入门班-1-5(软硬件环境搭建) 视频教程根据视频教程的步骤,我装好了J-Flash ARM V4.08l,并连接好J-link跟开 ...… 查看全部问答> |




