STM32(寄存器)学习笔记——实验五:外部中断
储备知识:
(1)STM32F103ZET6(CM3内核)共有256个中断,需要进行管理
首先,要对STM32进行分组,组0~4,同时要对每个中断设置一个抢占优先级和响应优先级
(抢占优先级:是指打断其它中断的级别,高的抢占优先级可以打断低的抢占优先级的工作
相应优先级:是指在抢占属性相同的情况下,当两个中断向量的抢占优先级相同时,
如果两个中断同时到达,则先处理响应优先级高的中断
)
其级别编号越小,表明它的优先级别越高
寄存器设置函数
MY_NVIC_INIT(抢占,响应,EXIT外部中断引脚口对应分组_IRQn,分组)
(2)设置外部中断触发条件
外部中断触发函数
Ex_NVIC_Config(GPIO_X,引脚口,触发条件(寄存器))
RTIR:上升沿触发
FTIR:下降沿触发 (3)外部中断函数
函数:void EXITx_IRQHandler(void)
引脚口为0,1,2,3,4时
外部中断函数为
void EXIT0(1/2/3/4)_IRQHandler(void)
引脚口为5,6,7,8,9时
外部中断函数为
void EXIT9_5_IRQHandler(void)
引脚口为10,11,12,13,14,15时
外部中断函数为
void EXIT15_10_IRQHandler(void)
编写程序
1、初始化I/O输入。
GPIOA->CRL&=0XFFFFFFF0; //PA0设置成输入,默认下拉 GPIOA->CRL|=0X00000008; GPIOE->CRL&=0XFFF00FFF; //PE3/4设置成输入 GPIOE->CRL|=0X00088000; GPIOE->ODR|=3<<3; //PE3/4 上拉*/
2、开启I/O口复用时钟,设置I/O口与中短线的映射关系
3、初始化线上中断,设置触发条件
Ex_NVIC_Config(GPIO_A,0,RTIR); //上升沿触发 Ex_NVIC_Config,4.设置中断分组,并且使能中断MY_NVIC_Init Ex_NVIC_Config(GPIO_E,3,FTIR); //下降沿触发5.设置中断分组 Ex_NVIC_Config(GPIO_E,4,FTIR); //下降沿触发
这个函数就完成了2,3步
4、配置中断分组(NVIC),并使能中断
MY_NVIC_Init(2,3,EXTI0_IRQn,2); //抢占2,子优先级3,组2 MY_NVIC_Init(2,1,EXTI3_IRQn,2); //抢占2,子优先级1,组2 MY_NVIC_Init(2,0,EXTI4_IRQn,2); //抢占2,子优先级0,组2
5、编写中断服务函数
void EXTI0_IRQHandler(void)//EXTI9_5_IRQHandler(void)
{
delay_ms(10); //消抖
if(WK_UP==1) //WK_UP按键
{
BEEP=!BEEP;
}
EXTI->PR=1<<0; //清除LINE0上的中断标志位 PR挂起寄存器,1表示外部中断线上发生了选择的边沿事件。通过向该寄存器的对应位写入 1 可以清除该位。
}
//外部中断3服务程序
void EXTI3_IRQHandler(void)
{
delay_ms(10); //消抖
if(KEY1==0) //按键KEY1
{
LED1=!LED1;
}
EXTI->PR=1<<3; //清除LINE3上的中断标志位
}
//外部中断4服务程序
void EXTI4_IRQHandler(void)
{
delay_ms(10); //消抖
if(KEY0==0) //按键KEY0
{
LED0=!LED0;
LED1=!LED1;
}
EXTI->PR=1<<4; //清除LINE4上的中断标志位
}
PR是EXIT结构体的寄存器,PR为1,清除中断标志位,PR为0
