微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > 射频无线通信设计 > 新手遇到问题求解答

新手遇到问题求解答

时间:10-02 整理:3721RD 点击:
刚开始接触cc2530,在调用外部中断时遇到一些地方不是很明白。(以P0_1作为中断为例)

1. P0IFG与P0IF之间有什么关系呢?有人说在清P0IF之前一定要先清P0IFG,请问这是为什么呢?
2. 请看下面代码:
#pragma vector =P0INT_VECTOR
__interrupt voidP0_ISR(void)
{
if(P0IFG > 0) //按键中断
{
DelayMS(10);//延时去抖
if(P0IFG> 0) //按键中断
{
KeyValue= 1; //产生中断保存中断状态
}
}
P0IFG= 0; //清中断标志
P0IF= 0; //清端口0中断标志
}

网上说中断的过程为(以P0_1下降沿产生中断为例):P0_1口产生下降沿发出中断请求,自动将P0IFG中对应位置1,等待CPU响应。当CPU检测到有中断请求且对应的中断使能位使能,则进入中断服务子程序。
按照这样的说法,进入中断服务子程序的前提是P0IFG对应位置1了,那为什么进入中断服务子程序后还要判断一次P0IFG是否大于0呢?这步是否可以去掉?

网上说的没错,建议你以后遇到类似问题,可不可以去掉你自己先试一下不就清楚了吗

还有我想问下的就是P0IF在这里起到的是什么作用?在中断的过程中的哪一步骤将其置1?和P0IFG是怎样的一个关系?中断时哪个先置1?谢谢



这是CC2530 datasheet的介绍

之后我用加断点的方法debug出了一些现象,就是在结束中断函数时若“P0IF=0;”写在“P0IFG=0;”之前的话,运行完“P0IF=0;”后P0IF并不会被清0;接下来运行“P0IFG=0;”后把P0IFG清0了,退出中断程序后由于P0IF未被清0,就再次进入中断,这时再运行到“P0IF=0;”时P0IF才被清0,等于这样写的话会连续进入两次中断。目前只发现这样的现象,但产生现象的具体原因没找到,本人没学过汇编,看不懂debug时上面的汇编语言对寄存器的操作,所以请教高手解答



上面就明确要求P0IFG必须在P0IF前清零,至于为什么我也不清楚
个人认为如非研究必要,像此类datatsheet已经交代如何操作的事,按它写的做就是了

好的,谢谢。本人刚接触没多久,对这些细节想了解得透彻些,以免到时出错时找不到相应的解决方法

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top