系列文章目录
HAL库(STM32CubeMX)——ADC学习总结(包含单次/连续模式下的轮询/中断/DMA)(蓝桥杯STM32G431RBT6)
HAL库(STM32CubeMX)——DAC学习(STM32G431RBT6)
HAL库(STM32CubeMX)——USART配置(中断接收/STM32G431RBT6)
HAL库(STM32CubeMX)——基本定时器、PWM、输入捕获、输出比较、互补式PWM等综合学习(STM32G431RBT6)
stm32下的IIC实现EEPROM代码-stm32G431RBT6(蓝桥杯嵌入式)
stm32f103c6t6下的HAL库搭建三种低功耗模式及实战分析(stm32通用)
HAL库(STM32CubeMX)之看门狗学习及实操(STM32F767IGTX)
外部中断配置
配置IO口为外部中断输入源
![![在这里插入图片描述](https://img-blog.csdnimg.cn/b100684dbf8041719f7b6a53219f9798.png)
在IO设置中配置好触发方式和默认拉低或拉高
在NVIC中使能外部中断,并分配优先级。
实际的中断执行函数:
和之前的一样,还是存在中断回调函数:
仍然是weak定义的,可以自己重新定义编写该函数
这里的函数名字有些奇怪:EXTI15_10_IRQHandler
使能中断时:
像10-15这几个外部中断线捆在一起
如图,只有0-4是单独的
标准库
void GPIO(void)
{
GPIO_InitTypeDef GPIO_Initstruct; //声明GPIO初始化结构体
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); //打开GPIO时钟
GPIO_Initstruct.GPIO_Mode=GPIO_Mode_IN; //输入模式
GPIO_Initstruct.GPIO_OType=GPIO_OType_OD; //开漏输入模式
GPIO_Initstruct.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1; //引脚0,1
GPIO_Initstruct.GPIO_PuPd=GPIO_PuPd_UP; //上拉模式
GPIO_Initstruct.GPIO_Speed=GPIO_High_Speed; //高速模式
GPIO_Init(GPIOB,&GPIO_Initstruct); //初始化GPIO
}
//外部中断初始化
void EXTI_init(void)
{
EXTI_InitTypeDef EXTI_Initstruct; //创建外部中断初始化结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE); //打开时钟
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB,EXTI_PinSource0); //将GPIO与外部中断连接
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB,EXTI_PinSource1); //同上
EXTI_Initstruct.EXTI_Line=EXTI_Line0|EXTI_Line1; //配置的是外部中断0,1
EXTI_Initstruct.EXTI_LineCmd=ENABLE; //使能
EXTI_Initstruct.EXTI_Mode=EXTI_Mode_Interrupt; //选择中断模式
EXTI_Initstruct.EXTI_Trigger=EXTI_Trigger_Falling; //下降沿模式
EXTI_Init(&EXTI_Initstruct); //初始化外部中断0,1
}
//配置NVIC
void EXTI_NVIC(void)
{
NVIC_InitTypeDef NVIC_Initstruct; //声明NVIC初始化结构体
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //选定NVIC分组
NVIC_Initstruct.NVIC_IRQChannel=EXTI0_IRQn; //配置的外部中断0
NVIC_Initstruct.NVIC_IRQChannelCmd=ENABLE; //使能
NVIC_Initstruct.NVIC_IRQChannelPreemptionPriority=1; //主优先级
NVIC_Initstruct.NVIC_IRQChannelSubPriority=1; //副优先级
NVIC_Init(&NVIC_Initstruct); //初始化外部中断0的NVIC
NVIC_Initstruct.NVIC_IRQChannel=EXTI1_IRQn; //配置的外部中断1
NVIC_Initstruct.NVIC_IRQChannelCmd=ENABLE; //同上
NVIC_Initstruct.NVIC_IRQChannelPreemptionPriority=1; //同上
NVIC_Initstruct.NVIC_IRQChannelSubPriority=2; //同上
NVIC_Init(&NVIC_Initstruct); //初始化外部中断1的NVIC
}
//初始化函数
void Init(void)
{
GPIO();
EXTI_init();
EXTI_NVIC();
}
//外部中断0的中断服务函数
void EXTI0_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line0)!=RESET) //标志位被值位(产生中断)
{
/*需要操作的内容*/
EXTI_ClearITPendingBit(EXTI_Line0); //清除中断标志位
}
}
//外部中断1的中断服务函数
void EXTI1_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line1)!=RESET) //标志位被值位(产生中断)
{
/*需要操作的内容*/
EXTI_ClearITPendingBit(EXTI_Line1); //清除中断标志位
}
}
标准库还是需要自己明白许多外部中断线与IO口,时钟线对应关系的
不同IO时钟对应的总线:(简单利用HAL库找一下,具体的还要看stm32的参考手册)
参考stm32参考手册: