| 位 | 位名称 | 复位值 | 操作 | 描述 |
| 7:6 | – | 00 | R0 | 不使用,读为 0。 |
| 5 | WDTIE | 0 | R/W | 看门狗定时器中断使能。 0:中断禁止 1:中断使能 |
| 4 | P1IE | 0 | R/W | 端口 1 中断使能。 0:中断禁止 1:中断使能 |
| 3 | UTX1IE | 0 | R/W | USART1 发送中断使能 0:中断禁止 1:中断使能 |
| 2 | UTX0IE | 0 | R/W | USART0 发送中断使能。 0:中断禁止 1:中断使能 |
| 1 | P2IE | 0 | R/W | USART0 发送中断使能。 0:中断禁止 1:中断使能 |
| 0 | RFIE | 0 | R/W | RF 一般中断使能。 0:中断禁止 1:中断使能 |
位寻址:可以通过位名称来修改其值,如IEN0 中断使能寄存器 0中有个位名称为EA,直接
EA=1;
就行了,
上面三个是关于中断的使能位寄存器,涵盖了18个中断源,再来看看端口使能的中断寄存器,上面的寄存器是具体到某个端口,而下面的寄存器则是具体到某个引脚。
P0IEN P0 端口中断使能寄存器
位 | 位名称 | 复位值 | 操作 | 描述 |
7:0 | P0_[7:0]IEN | 0x00 | R/W | 端口 P0_7 到 P0_0 中断使能。 0:中断禁止 1:中断使能 |
P1IEN P1 端口中断使能寄存器
位 | 位名称 | 复位值 | 操作 | 描述 |
7:0 | P1_[7:0]IEN | 0x00 | R/W | 端口 P1_7 到 P1_0 中断使能。 0:中断禁止 1:中断使能 |
P2IEN P2 端口中断使能寄存器
位 | 位名称 | 复位值 | 操作 | 描述 |
7:6 | – | 00 | R0 | 不使用,读为 0 |
5 | DPIEN | 0 | R/W | USB D+中断使能 |
4:0 | P2_[4:0]IEN | 0x00 | R/W | 端口 P2_4 到 P2_0 中断使能。 0:中断禁止 1:中断使能 |
PICTL 端口输入信号控制寄存器
位 | 位名称 | 复位值 | 操作 | 描述 |
7 | PADSC | 0 | R/W | 控制 I/O 引脚输出模式下的驱动能力。 |
6:4 | – | 000 | R0 | 未使用。 |
3 | P2ICON | 0 | R/W | 端口 P2_4 到 P2_0 中断触发方式选择。 0:上升沿触发。 1:下降沿触发 |
2 | P1ICONH | 0 | R/W | 端口 P1_7 到 P1_4 中断触发方式选择。 0:上升沿触发。 1:下降沿触发 |
1 | P1ICONL | 0 | R/W | 端口 P1_3 到 P1_0 中断触发方式选择。 0:上升沿触发。 1:下降沿触发 |
0 | P0ICON | 0 | R/W | 端口 P0_7 到 P0_0 中断触发方式选择。 0:上升沿触发。 1:下降沿触发。 |
接下来,来看看对于端口外部中断来说很重要的三个标志位
P0IFG P0 端口中断状态标志寄存器
(该标志必须在清除端口中断标志 P0IF 之前清除)
位 | 位名称 | 复位值 | 操作 | 描述 |
7:0 | P0IF_[7:0] | 0x00 | R/W0 | 端口 P0_7 到 P0_0 的中断状态标志。 当输入端口有未响应的中断请求时,相应标志位硬件自动置 1, 需要通过软件人工清 0。 0:无中断请求。 1:有中断请求。 |
P1IFG P1 端口中断状态标志寄存器
(该标志必须在清除端口中断标志 P1IF 之前清除)
位 | 位名称 | 复位值 | 操作 | 描述 |
7:0 | P1IF_[7:0] | 0x00 | R/W0 | 端口 P1_7 到 P1_0 的中断状态标志。 当输入端口有未响应的中断请求时,相应标志位硬件自动置 1, 需要通过软件人工清 0。 0:无中断请求。 1:有中断请求。 |
P2IFG P2 端口中断状态标志寄存器
(该标志必须在清除端口中断标志 P2IF 之前清除)
位 | 位名称 | 复位值 | 操作 | 描述 |
7:6 | – | 00 | R0 | 未使用,读为 0。 |
5 | DPIF | 0 | R/W0 | USB D+中断标志位 |
4:0 | P2IF_[4:0] | 0x00 | R/W0 | 端口 P2_4 到 P2_0 的中断状态标志。 当输入端口有未响应的中断请求时,相应标志位硬件自动置 1, 需要通过软件人工清 0。 0:无中断请求。 1:有中断请求。 |
呼~是不是感觉这一章的寄存器有点多呢?其实除了中断的使能寄存器,后面的端口触发的寄存器中断比赛的时候很少很少涉及得到,平常开发项目可能就经常用得到,所以,还是得学了解了解。
了解了概念、原理和寄存器,接下来看代码的了。
来完成这两道题加深对其的理解(PS:题目是欧老师的题库):
3.1完整代码:
#include "ioCC2530.h"
#define D3 P1_0 // 定义 LED 灯的引脚号
#define D4 P1_1
#define D5 P1_3
#define D6 P1_4
#define SW1 P0_1 // 定义按键的引脚号
#define SW2 P1_2
void Init_port() // 初始化端口
{
P1SEL &= ~0x1b; // 配置 P1_0、P1_1、P1_3、P1_4 为数字 IO 口
P1DIR |= 0x1b; // 配置 P1_0、P1_1、P1_3、P1_4 为输出口
P1 &= ~0x1b; // 初始化 P1_0、P1_1、P1_3、P1_4 为低电平状态
P1SEL &= ~0x04; // 配置 P1_2 为数字 IO 口
P1DIR &= ~0x04; // 配置 P1_2 为输入口
P1INP &= ~0x04; // 配置 P1_2 的输入缓冲区范围
P2INP &= ~0x40; // 配置 P1_2 所在的管脚的输入缓冲区范围
P0SEL &= ~0x02; // 配置 P0_1 为数字 IO 口
P0DIR &= ~0x02; // 配置 P0_1 为输入口
P0INP &= ~0x02; // 配置 P0_1 的输入缓冲区范围
P2INP &= ~0x20; // 配置 P0_1 所在的管脚的输入缓冲区范围
P1IEN |= 0x04; // 配置 P1_2 为外部中断口
PICTL |= 0x02; // 配置外部中断的边缘触发方式(上升沿触发)
IEN2 |= 0x10; // 开启外部中断
EA=1; // 开启总中断允许位
}
void Delay(unsigned int t) // 实现简单的延时函数
{
while(t--);
}
#pragma vector=P1INT_VECTOR // 定义中断服务程序函数
__interrupt void SW_1() // 当按键被按下引起外部中断时,执行该函数
{
D5 = ~D5; // 翻转 LED D5 的状态
P1IFG &= ~0x04; // 清除中断标志位
P1IF=0;
}
void main()
{
Init_port(); // 调用初始化函数
while(1)
{
D4=1; // 点亮 LED D4
Delay(0xffff); // 延时一段时间
D4=0; // 关闭 LED D4
Delay(0xffff); // 延时一段时间
}
}
3.2完整代码:
#include "ioCC2530.h"
#define D3 P1_0 // 定义 LED 灯的引脚号
#define D4 P1_1
#define D5 P1_3
#define D6 P1_4
#define SW1 P0_1 // 定义按键的引脚号
#define SW2 P1_2
unsigned int keys=0; // 定义按键状态变量
void Init_port() // 初始化端口
{
P1SEL &= ~0x1b; // 配置 P1_0、P1_1、P1_3、P1_4 为数字 IO 口
P1DIR |= 0x1b; // 配置 P1_0、P1_1、P1_3、P1_4 为输出口
P1 &= ~0x1b; // 初始化 P1_0、P1_1、P1_3、P1_4 为低电平状态
P1SEL &= ~0x04; // 配置 P1_2 为数字 IO 口
P1DIR &= ~0x04; // 配置 P1_2 为输入口
P1INP &= ~0x04; // 配置 P1_2 的输入缓冲区范围
P2INP &= ~0x40; // 配置 P1_2 所在的管脚的输入缓冲区范围
P0SEL &= ~0x02; // 配置 P0_1 为数字 IO 口
P0DIR &= ~0x02; // 配置 P0_1 为输入口
P0INP &= ~0x02; // 配置 P0_1 的输入缓冲区范围
P2INP &= ~0x20; // 配置 P0_1 所在的管脚的输入缓冲区范围
P0IE = 1; // 允许 P0_1 的中断功能
P0IEN |= 0x02; // 配置 P0_1 为外部中断口
PICTL |= 0x01; // 配置外部中断的边缘触发方式(下降沿触发)
P0IFG &= ~0x02; // 清除中断标志位
P0IF=0; // 清除中断标志位
EA=1; // 开启总中断允许位
}
void Delay(unsigned int t) // 实现简单的延时函数
{
while(t--)
{
while(keys==1); // 如果按键被按下,则进入等待状态
}
}
#pragma vector=P0INT_VECTOR // 定义中断服务程序函数
__interrupt void key2() // 当按键被按下引起外部中断时,执行该函数
{
EA=0; // 关闭总中断允许位
if(keys==0) // 如果按键状态为未按下,则将按键状态变量设为已按下
{
keys=1;
}else
{
keys=0; // 如果按键状态为已按下,则将按键状态变量设为未按下
}
P0IFG &= ~0x02; // 清除中断标志位
P0IF = 0; // 清除中断标志位
EA=1; // 开启总中断允许位
}
void led() // 控制 LED 灯的函数
{
D4=1; // 点亮 LED D4
D3=0;
D5=0;
D6=0;
Delay(0xffff); // 延时一段时间
D4=0; // 关闭 LED D4
D3=1; // 点亮 LED D3
D5=0;
D6=0;
Delay(0xffff); // 延时一段时间
D4=0;
D3=0;
D5=0;
D6=1;
Delay(0xffff);
D4=0;
D3=0;
D5=1;
D6=0;
Delay(0xffff);
}
void main()
{
Init_port();
while(1)
{
led();
}
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数嵌入式工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以+V:Vip1104z获取!!! (备注:嵌入式)
最后
资料整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~
你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以+V:Vip1104z获取!!! (备注:嵌入式)
最后
资料整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~
你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!