MSP430常见问题之看门狗及定时器类
Q1. 定时器两个中断TAIE 和CCIE,有什么区别?两个中断的中断向量一样吗?
A1:TAIE 和CCIE指的是不同事件。TAIE指TAR 计数器溢出,从65535 到0 的变化,由TAIFG 引起的。CCIE指捕获到相应信号(捕获模式下);定时时间到(比较模式下)。由CCIFG引起的。两个中断的中断向量不一样,TAIFG 一般进TIMERA1_VECTOR;CCIFG 的话要看用的是哪个定时器如果是CCR0 的话就进TIMERA0_VECTOR,如果是CCR1,CCR2……则进TIMERA1_VECTOR。(中断向量的写法因器件不同而有所不同)
Q2 用F149 的定时器B 的捕捉功能, 遇到问题,在等待捕捉时,读取TBR 的值总是随机数。
A2:TBR 是一直再跑的,看TBCCRx。因为捕获事件发生时,硬件会自动把TBR 的值保存到TBCCRx 中。
Q3:想输出PWM,在中断响应后能改变PWM的频率吗?
A3:调整相应的定时器配置,PWM的频率和占空比都是可以改变的,不过周期频率一般都是由CCR0据顶的。
Q4:timerA 不能进入中断检查的一般思路?
A4:不能进入中断一般检查思路:
1:是否开所属模块中断和总中断
2:所属模块所用时钟是否有效
3:触发条件成立没?标志位是否置位。
Q5. MSP430F149关于时钟的问题
问题:时钟采用8MHz,那么执行for(i=0;i<980;i++);会花费多少ms?是不是1ms?另外,若是采用ADC12自带的时钟,在RC振荡器在5MHz,且不分频,执行一次采集(采样和转换)会花费多长时间?
A5:执行for(i=0;i<980;i++);这个得去看汇编看消耗了几个机器周期这样是看不出来的。当然一般的做法是把程序运行在仿真状态下,在执行执行for(i=0;i<980;i++)之前记下此时的CYCLECOUNTER(VIEW-->register)该语句执行完毕之后记下这时的CYCLECOUNTER,2者相减,在乘以MCLK的周期。若是采用ADC12自带的时钟,在RC振荡器在5MHz,且不分频:ADC12采样是12个ADC12CLK 外加一个ADC12CLK 用来把结果存到ADC12MEM。所以时间t=13*1/5M 秒。
Q6:430F149,中TACTL 中SCCI 是什么功能?
A6:Latched capture signal (read)处于捕获模式时,接入的信号状态0/1。
Q7:程序执行完成后,进入LPM3 模式,大约过3 秒钟之后,又再进入正常模式,即从LPM3退出,再一次从头开始执行程序,执行完成后,再一次进入LPM3 模式。如此往复循环下去。请问这个能不能通过定时器A来实现?
A7:能。
1、在主程序中完成初始化后进入LPM3 模式。
2、在LPM3 模式下,ACLK必须工作,并且TA选择ACLK为时钟源。
3、当TA 中断时,CPU 在进入TA中断服务前,会自动唤醒。
4、在TA 中断服务中调用要被周期性执行的程序。
5、从TA 中断服务返回后,CPU 又会自动恢复到中断发生前的LPM3 模式(即,主程序会永远停留在进入LPM3
模式的那条语句中程序)。
Q8:中断向量和中断标志寄存器的区别?
A8:IICIFG 是中断标志,指示是否产生中断。IICIV是中断向量,是中断代码的入口地址。MCU 首先查询是否有中断标志产生,如果有,再查询中断向量,转去执行中断服务程序。
Q249. 关于TIMERA 计数问题
用TIMERA 对外来脉冲计数,脉冲输入TACLK,读到的值总是不准,不知道各位有什么高招?TIMERA 益出有什
么好办法可以连续计数?
A10:
1、应该是漏计了,输入频率不是很高,最高也就是20KHZ。
2、TIMERA 我用的是连续计数到0XFFFF 后中断的方式,在溢出中断里累计中断次数。然后应用程序里面用溢
出次数*65535+TAR 值,就是连续计数值。
Q11:知道定时器可输出自定义占空比的PWM波,找了些参考程序看,大概是这样的
TACTL=TASSEL0+TACLR+MC0;
CCTL0=CCIE;
CCR0=360;
CCR1=327;
CCTL1=OUTMOD_2;
P2SEL |= BIT5;
这样是不是直接从P2.5端口输出PWM波,芯片不能工作在低功耗下啊?怎么样让芯片工作在低功耗,等有波形翻转时产生中断啊?
A11:OUTMOD_7 我推荐那样比较好计算指定占空比时CCR1 与CCR0 的值,这种情况下芯片可以工作在低功耗模式下只要你保证在该模式中你的TA 时钟源仍然开启就行,至于波形翻转这些都是硬件完成,无需CPU干预。
Q12:想用TA 的CCR0 定时中断,增记数模式,但我看书上的CCIFG0的设置只有在CCR0与TAR 的值相等时才置位,下一个周期马上又复位了。要是此时正在运行一条指令,那岂不是错过了进入中断了吗?
A12:CCIFG0 应该是响应了中断服务程序后才复位的或者用指令清除,不会错过的.。
Q13:MSP430 中断所需的最小输入脉宽是多少?
A13:最小中断脉宽必须大于1.5 主时钟周期(MCLK),以确保中断有效。有关问题请参阅器件特定的数据表。
Q14:430 在低功耗模式下, 是哪几个模式(LPM0,LPM1,LPM2,LPM3,LPM4) 下,还支持看门狗。LPM3,LPM4支持看门狗吗。
A14:在只有在LPM4 模式下,看门狗才关掉,其他模式下只要选择了看门狗模式,时钟会一直跑。
Q15:在某种模式下把看门狗使能,那么功耗将增加多少?
A15:这个定时器模块不会引起额外的功耗(lpm3 模式下,不论是否开启看门狗,系统耗电会低于1uA)。
Q16系统复位后,如何判断是看门狗引起的复位呢,还是上电引起的复位呢?能不能通过看门狗中断标记来判
断?是不是看门狗做定时器时才能使能看门狗中断控制位?
A16:看门狗引起复位会在标志寄存器中的WDTIFG 为1,而上电复位为0。
Q17:一般使用如下指令进行看门狗停止:WDTCTL = WDTPW + WDTHOLD; //关闭看门狗。那么看门狗打开是否可以采用指令:WDTCTL &= ~(WDTPW + WDTHOLD); //打开看门狗?
A17:需要理解WDTPW、WDTHOLD 的具体意思。这些都在头文件中的宏定义。WDTPW为寄存器访问密钥,如果写入错误的密钥,会产生复位;WDTHOLD为看门狗时钟关闭;寄存器WDTTMSEL选择看门狗是工作在定时器模式还是在看门狗模式,所以要打开看门狗应该WDTCTL = WDTPW + WDTTMSEL;具体定时时间可以看头文件,头文件中都有注释。
Q18在程序中间采用如下指令:WDTCTL = WDTPW + WDTCNTCL;//清开门狗,防止在程序正常运行中复位。是否正确?
A18:错误,程序一样会复位。WDTCNTL为清除计数器,WDTHOLD 为关闭计数器,两个寄存器的概念不一样,使用时需要注意。
Q19:用F149的定时器B 的捕捉功能, 遇到问题,在等待捕捉时,读取TBR 的值总是随机数,我用软件在线调试观察的。
A19:别读TBR。读TBCCRx 就OK了,捕获到信号时TBR的值自动复制到TBCCRX的值。
Q20我想输出PWM,在中断响应后能改变PWM的频率吗?
A20:调整相应的定时器配置,PWM 的频率和占空比都是可以改变的。CCR0 的值改变周期,CCR1(和输出对应的寄存器)改变占空比。
Q21使用MSP430 产生PWM 波形,一般抖动问题如何解决?
A21:提高时钟精度。
Q22中断向量和中断标志寄存器的区别?
A22:IFG 是中断标志,指示是否产生中断。IV 是中断向量,是中断代码的入口地址。MCU 首先查询是否有中断标志产生,如果有,再查询中断向量,转去执行中断服务程序。
Q23使用了Timer_B的单元1 和单元2测量频率,计数过程中发生的溢出中断,如何判断这个溢出中断是哪个单元产生的?
A23:TIMER_B 使用两个中断向量TBCCR0 中断向量CCIFG 和TBIV 中断向量。TBIV包含所有其他的CCIFG 和TBIFG。
Q24用430 单片机进行连续的数据采集,每次持续时间得几十秒,但是还要用单片机实现实时时钟功能,期间每秒都得进Timer 中断计时。这样势必会影响数据的连续采集。这种矛盾该怎么解决呢?
A24:数据采集启动后,有一定的时间才能完成AD 转换.这段时间内,CPU要么空转,要么进行时钟处理.因此我认为CPU干这两件工作完全胜任,只要:
1. 提高CPU 时钟到8MHz。
2. 用中断方式进行AD 及时钟处理,中断程序要高效小巧。
3.数据采集从微观上讲,并不是连续不停进行的(这是模拟电路的带宽及数据稳定所决定的),因此合理选择单位时间内AD 转换的次数。
4.要连续采集几十秒数据,单位时间内AD 转换的次数应与系统的数据存储空间大小一并考虑。
Q25一个TA 或TB 最多只能产生两个中断吗。要不是的话,中断向量表该怎么处理??
A25:应该说是两个中断向量地址,不能说产生两个中断。TA、TB 总4 个中断向量地址,TA、TB 各有两个,如TIMER_A 的比较模式采用CCR0、CCR1、CCR2 就可以产生三个中断,但中断入口只有两个,CCR0 占用一个,CCR1、CCR2、TAIFG 占用一个,通过中断标志来判断是那个中断源引起的中断。