msp430中断定时的问题,该怎么算啊,如图P1.1多长时间去翻一次啊啊,该怎么计算
TACTL = TASSEL_2 + MC_2;//TASSEL_2表示选择SMCLK作为定时器的时钟源,MC_2表示计数方式选择为连续计数模式(Continuous mode),此句配好后,SMCLK每一个周期都会使定时器模块中的TAR寄存器以连续的方式加1。
CCR0 = 50000;//此句用于初始化CCR0寄存器的值。
CCTL0 = CCIE;// 此句是使能CCR0的中断,也就是当上面提到的TAR等于CCR0时会触发一个中断而使程序进入相应的中断服务程序中,从而翻转P1.1。因为最初的TAR为0,所以相当于经过50000个SMCLK后翻转一下P1.1。而中断服务程序中的CCR0 += 50000;则是告诉定时器经过50000个SMCLK后再产生中断,也就是翻转P1.1,这样就实现了每隔50000个SMCLK会将P1.1翻转一次,倘若没有这句代码CCR0 += 50000;那么P1.1将会每隔0xFFFF个SMCLK完成一次翻转,这里理解稍微有点绕,不过不算复杂,看看SPEC就懂了。
总结:你贴的代码可以实现P1.1每50000个SMCLK翻转一次,如果你的SMCLK为1MHz的话,则表示P1.1每50毫秒翻转一次。但是从你的代码当中可以看出你未配置时钟模块,所以使用的是默认的时钟源,查一查SPEC,看看默认时的SMCLK是多少,这样就可以算出P1.1实际的翻转速度。
谢谢,祝好运!
请问:
连续计数模式情况下,如果设置了CCRO=5000的话,TAR计数到CCR0=5000的时候就会触发中断进入相应的程序,如果不设置CCRO=5000的话,就是TAR计数到FFFFH,才会触发中断,进入相应的中断段程序么?这个点我有点不明白
谢谢
首先,能够触发中断的条件包含两个:
1. 是有相关的FLAG被Set起来;
2. 是中断要被使能。
这两者都满足CPU才会响应此中断。
但是从你的代码来看的话,你使能了CCR0的中断(CCTL0 = CCIE;),如果你没设置CCRO=5000的话,那么CCR0就是默认值0,这时当你的TAR计数到0的时候会产生中断,这一点要清楚。另外,你说的TAR计数到FFFFh会触发中断是不对的,从触发中断的条件1来看,当TAR从FFFFh计数到0时TAIFG会置位,如果使能了TAIE,也就是你上面的一句代码换成“TACTL = TASSEL_2 + MC_2 + TAIE;”后才会触发一个中断,具体看一下下面的图片。
补充点:
一、TimerA有两个中断Flag,
1是CCIFG,由CCR0置位
2是TAIFG,由CCR1、CCR2和Overflow置位。
二、中断向量入口
1. CCIFG的入口是:
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A0 (void)
{
}
2. TAIFG的入口是:
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A1(void)
{
}
因为TAIFG有三个中断源,所以进入这个中断服务程序后要去判断是CCR1、CCR2和 Overflow中的哪个触发的,具体参考一下附件中的代码:
2024-07-18 广告