第一步:现在STM32CubeMx 中配置所需要IO口外部中断模式:
单击对应IO口左键-->GPIO_EXTI
第二步:配置中断触发模式
GPIO-->GPIO_mode
GPIO--> GPIO 上拉/下拉
这里以外部中断模式/下降边缘触发检测,默认上拉( Pull-up) 为例
第三部:配置中断优先级:
NVIC(嵌套向量中断控制器) -->EXTI line interrupts 根据自身需要配置中断优先级
到这里STM32CubeMx 就配置完成了,之下来分析STM32CubeMx 生成的源码
先看一下GPIO的初始化函数;
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);//默认输出高
/*Configure GPIO pin : PA8 */
GPIO_InitStruct.Pin = GPIO_PIN_8;//配置GPIO_PIN_8
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; //外部中断模式/下降边缘触发
GPIO_InitStruct.Pull = GPIO_PULLUP;//默认上拉
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pins : PA9 PA10 */
GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;//配置GPIO_PIN_9/GPIO_PIN_10
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;/外部中断模式/下降边缘触发
GPIO_InitStruct.Pull = GPIO_PULLUP;//默认上拉
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pin : KEY1_Pin */
GPIO_InitStruct.Pin = KEY1_Pin; //初始化KEY1引脚
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;//配置为输入模式
GPIO_InitStruct.Pull = GPIO_PULLUP;//上拉输入
HAL_GPIO_Init(KEY1_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pin : LED1_Pin */
GPIO_InitStruct.Pin = LED1_Pin;//初始化LED1引脚
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //配置为输出模式
GPIO_InitStruct.Pull = GPIO_PULLUP;//默认上拉输出
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;//低速模式
HAL_GPIO_Init(LED1_GPIO_Port, &GPIO_InitStruct);
/* EXTI interrupt init*/
HAL_NVIC_SetPriority(EXTI9_5_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
HAL_NVIC_SetPriority(EXTI15_10_IRQn, 2, 0);
HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
}
接下来开始编写中断服务函数:
//这里中断服务函数写在BEGIN 4,也可以写在其他可编辑的代码区域中,这里不明白的可以看前面几章的说明
/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
switch(GPIO_Pin) //扫描是哪个中断源触发的中断
{
case GPIO_PIN_8: //如果是GPIO8
{
for(uint16_t i=0;i< 2000;i++); //消抖一下
if(!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8)) //再次确认一遍GPIO8是否拉低;
{
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET); //如果是,LED1 输出高电平,
}
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_8); //清除外部中断标志位
break;
}
case GPIO_PIN_9: //如果是GPIO9
{
for(uint16_t i=0;i< 2000;i++); //消抖一下
if(!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_9)) //再次确认一遍GPIO9是否拉低;
{
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET); //如果是,LED1 输出低电平,
}
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_9); //清除外部中断标志位
break;
}
case GPIO_PIN_10: //如果是GPIO10
{
for(uint16_t i=0;i< 2000;i++); //消抖一下
if(!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_10)) //再次确认一遍GPIO10是否拉低;
{
HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin); //如果是,翻转LED1输出电平,
}
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_10); //清除外部中断标志位
break;
}
default:break;
}
}
/* USER CODE END 4 */
如果能理解到这里,恭喜你已经学会了外部中断的基本操作!