历史上的今天
今天是:2025年07月11日(星期五)
2018年07月11日 | msp430学习笔记之中断处理函数
2018-07-11 来源:eefocus
//本平台 msp430f149
#include
void select_xt2(void){
unsigned char i;
/*------选择系统主时钟为8MHz-------*/
BCSCTL1 &= ~XT2OFF; //打开XT2高频晶体振荡噿
do{
IFG1 &= ~OFIFG; //清除晶振失败标志
for (i = 0xFF; i > 0; i--); //等待8MHz晶体起振
}while ((IFG1 & OFIFG)); //晶振失效标志仍然存在_
BCSCTL2 |= SELM_2 + SELS; //MCLK和SMCLK选择高频晶振
}
void main(){
WDTCTL = WDTPW + WDTHOLD;
select_xt2();
P2DIR = 0x80;
P2OUT = 0xff
CCTL1 = CCIE; // CCR1 中断使能
CCR1 = 10000;
TACTL = TASSEL_2 + MC_2 + ID_3; // SMCLK = 1MHz, 连续计数模式
_EINT(); //打开全局中断
while(1){
if(count == 50){
count = 0;
P2OUT ^= BIT7; //led灯每0.5s变化一次
}
}
}
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A1(void)
{
CCR1 += 10000; //
count ++;
}
昨天写了一段这样的代码,本想用定时器a 每0.5s控制led灯状态,发现程序运行不符合预期效果,仔细检验发现根本就没有进中断,count 值不变。先贴上可用的代码,再仔细分析
修改后的中断处理函数:
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A1(void)
{
switch(TAIV){
case 2:
CCR1 += 10000; //
count ++;
}
}
这两个中断处理函数区别在修改后的多用了switch语句,里面还有TAIV,也就是中断向量值
仔细阅读数据手册,发现TAIFG的中断入口地址是TIMERA1_VECTOR,同时也是TACCR1和//TACCTR2的CCIFG的入口地址。TACCRO单独使用TIMERA0_VECTOR。从官方给出的代码,使用TACCR1事中断函数里面也有switch语句,结合上面这个图,分析中断处理代码,执行
switch(TAIV)
不难发现,TAIV是与CCIFG所在的向量值匹配,也就是查询中断向量,提供一个入口地址,
执行后case语句的代码,现在可以理解未修改之前中断处理函数count值为改变的原因。
以上都是本人结合官方的源码和数据手册做出的分析,如有出入的地方,欢迎指正!
上一篇:msp430学习笔记之定时器A
史海拾趣
|
来源:http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=657257&bbs_page_no=1&bbs_id=9999 终于调通了!哈哈: 我也拿出来跟大家分享一下! 里面的内容什么都不用该,就该一下前面宏定义就可以了! 只需调用gettemp();就可以了!出口参数 ...… 查看全部问答> |
|
Wince界面怎么响应触摸笔划动的操作?怎么做出像IPHONE/M8那样的划屏动态界面效果! Wince界面怎么响应触摸笔划动的操作?怎么做出像IPHONE/M8那样的划屏动态界面效果!… 查看全部问答> |
|
我现在手里有一块s3c2410(arm920t,flash:16m,sdrom:64m)的开发板,现在用PPCBOOT2.0.0引导LINUX启动一切正常。我现在想把用这块开发板,运行vxworks,应该如何做呢,请高手帮忙,谢谢!!!!急… 查看全部问答> |
|
在用stm32f103vc 100pin做项目的时候,遇到一个问题。 我们想用103vc的fmsc挂5个外设。这5个外设的地址有4个只需要2根地址线,另外一个需要10根地址线。它们的数据线都是8位的。 因为用的103vc 100pin的,所以它的A0~A15和D0~D15是复用的, ...… 查看全部问答> |
|
RT.不知道为什么.如果不用TIM2计时.直接用DMA串口接收.是没问题的.但是用TIM2延时一阵子.就不能收到了... 大家帮帮忙,有必要我就上程序… 查看全部问答> |




