配置中断步骤
- 使能中断(全局中断和中断服务子程序)。Enable the Interrupt(Global & IRQx)
- 配置好对应的中断源。Configure the corresponding Interrupt Scource
- 编写对应的中断服务子程序ISR(Interrupt Service Routine)
- 把中断服务子程序配置到向量表。Fill the name of the ISR(address) into the Vector Table.
使能中断
-
使能全局中断
由内部CPU通过汇编指令,来使能Global全局中断。 -
打开对应的中断源
NVIC Module
Nested Vector Interrupt Controller Module. **可嵌套的外部中断向量的控制模块。是由ARM统一设置的外设模块。**在地址内存段的Private Peripherals 地址段内。
NVIC Registers
NVIC_ISER:置位使能中断寄存器
NVIC_ICER:置位关闭中断寄存器
NVIC_IPR0-7:设置中断的优先级寄存器
每一个寄存器都有32位,对应着32种中断源的子开关。
配置对应中断源
PORTx_PCRn寄存器
-
引脚功能和上拉电阻配置
引脚对应关系e.g. PORTA_PCR1寄存器对应打开PAT1
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W9l2MSSh-1649173021391)(:/d080edf36dea4a95b95bbe15d5739e76)] -
配置中断源方式和清楚中断状态位
interrupt Configuration(中断配置):以什么样的方式启动中断。
PORTx_PCRn = 0x000A0102 // 按键下降沿触发中断
Interrupt Status(中断状态位):w1c 意思是 向这个位写一次1 即可清楚中断标志位。
PORTx_PCRn |= 0x0100 0000 //清除中断标志位
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zxxZ7BVh-1649173021393)(:/656b1ad0efff4787a2da7668b09e2676)]
编写中断服务子程序
中断服务子程(ISR,Interrupt Service Routine)
- 中断完后要清除中断标志位IF
- ISR中断服务子程是由CPU硬件自动调用
- 函数的返回值和参数都是void。
中断服务子程 例子
void xxx_IRQHandle(void)
{
do sth...
clear the FLAG of interrupt
}
// e.g.
void PORTA_IRQHander(void)
{
if((GPIOA_PDIR & Ox0002)==0)
{
PORTA_PCR1 |=0x1000 0000; //清楚中断标志位
}
}
中断向量表
中断向量表
- 中断向量表是一段连续的存储空间
- 在复位后有默认的起始位置(0x0000 0000 地址)
- 每个中断在向量表中都有相应的表项,该表项的值为该中断对应的服务程序的地址(地址指针,函数名)
- 由程序代码确定中断向量表的每个表项(填表)
填表
中断向量表的地址里填入 中断服务子程的函数。