HAL库(STM32CubeMX)之外部中断(STM32F103C8T6)

系列文章目录

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设置中配置好触发方式和默认拉低或拉高
HAL库(STM32CubeMX)之外部中断(STM32F103C8T6)_第1张图片
在NVIC中使能外部中断,并分配优先级。HAL库(STM32CubeMX)之外部中断(STM32F103C8T6)_第2张图片
实际的中断执行函数:
HAL库(STM32CubeMX)之外部中断(STM32F103C8T6)_第3张图片
和之前的一样,还是存在中断回调函数:
HAL库(STM32CubeMX)之外部中断(STM32F103C8T6)_第4张图片
仍然是weak定义的,可以自己重新定义编写该函数
这里的函数名字有些奇怪:EXTI15_10_IRQHandler
使能中断时:
在这里插入图片描述
像10-15这几个外部中断线捆在一起
HAL库(STM32CubeMX)之外部中断(STM32F103C8T6)_第5张图片
如图,只有0-4是单独的

标准库

参考:【STM32标准库】【基础知识】外部中断

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的参考手册)
HAL库(STM32CubeMX)之外部中断(STM32F103C8T6)_第6张图片
参考stm32参考手册:
HAL库(STM32CubeMX)之外部中断(STM32F103C8T6)_第7张图片

你可能感兴趣的:(stm32,单片机,嵌入式硬件)