找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6926|回复: 0
打印 上一主题 下一主题
收起左侧

实现用一个中断服务程序(ISR)处理CC2530多个端口中断的方法

[复制链接]
跳转到指定楼层
楼主
ID:76127 发表于 2015-4-18 00:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
当用CC2530开发程序时,有时候会用到IO端口的外中断,CC2530强大的外中断系统,可以使得几乎每一个IO端口都可以处理外中断,外中断的数量远远超过51单片机外中断的数量(51单片机是两个外中断,INT0和INT1).
但是当我们对CC2530的外中断进行编程时,会发现虽然端口0(或者端口1)可以同时处理8个外中断,但是中断服务程序却只有一个,那么CC530是怎么区分是由端口中的哪个引脚触发的中断呢?其实是通过引脚的中断标志位进行区分的,我下面帖一段正常运作的代码,大家参考一下,就能知道原理了。
//代码说明:P1.0和P1.1分别连接LED1和LED2灯,P0.1和P0.2分别接两个按键,也可以接两个外中断源,在端口0的中断服务程序中通过端口标志位来区分是哪个中断源引起的中断,如果是P0.1引起的中断,就点亮(或者熄灭)LED1灯,如果是P0.2引起的中断,就点亮(或者熄灭)LED2灯.
void main(void)
{
halMcuClockInit();//将始终设置为32MHZ的
//对LED灯的设置
IO_FUNC_PORT_PIN(1, 0, IO_FUNC_GIO); //将P1_0设置为普通的IO口
IO_DIR_PORT_PIN(1, 0, IO_OUT); //设置为输出
IO_FUNC_PORT_PIN(1, 1, IO_FUNC_GIO); //将P1_1设置为普通的IO口
IO_DIR_PORT_PIN(1, 1, IO_OUT); //设置为输出

IO_FUNC_PORT_PIN(0, 2, IO_FUNC_GIO); //将P0_2设置为普通的IO口
IO_DIR_PORT_PIN(0, 2, IO_IN); //方向为输入
IO_IMODE_PORT_PIN(0 ,2 ,IO_IMODE_PUD); //设置为上拉或者下拉模式
IO_PUD_PORT(0, IO_PULLUP); //设置为上拉模式
IO_FUNC_PORT_PIN(0, 1, IO_FUNC_GIO); //将P0_1设置为普通的IO口
IO_DIR_PORT_PIN(0, 1, IO_IN); //方向为输入
IO_IMODE_PORT_PIN(0 ,1 ,IO_IMODE_PUD); //设置为上拉或者下拉模式
IO_PUD_PORT(0, IO_PULLUP); //设置为上拉模式

P0IFG=0x00; //P0中断标志位清零
IRCON=0X00; //P0中断端口标志位解挂
PICTL|=0x01; //配置端口0所有的引脚为下降沿中断
P0IEN |=0X04; //开启中断p0.2
P0IEN |=0X02; //开启中断p0.1
IEN1 |=0X20; //开启P0口的总中断
INT_GLOBAL_ENABLE(INT_ON); //使能全局中断
while(1);
}
#pragma vector=P0INT_VECTOR
__interrupt void P1_IRQ(void){
// check if PUSH_BUTTON is pressed
if((P0IFG&0X04)!=0)//p0.2的中断
{
MCU_IO_TGL(1,0);//电平切换
}
if((P0IFG&0X02)!=0)//p0.1的中断
{
MCU_IO_TGL(1,1);//电平切换
}

P0IFG = 0;
IRCON=0X00; //P0中断标志位解挂


}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表