使用工具:keil5.38a STM32cubeMx软件
1:中断知识的介绍:
STM32的每个IO都可以作为外部中断输入。STM32的中断控制器支持多个外部中断/事件请求:
Stm32的中断配置方式:每个外部中断线可以独立的配置触发方式(上升沿,下降沿或者双边沿触发),触发/屏蔽,专用的状态位。
中断的应用场景:
按钮/开关控制:当用户按下按钮或切换开关时,可以触发外部中断来响应用户的操作,例如控制LED的亮灭或执行特定功能。这种中断类型常用于用户界面交互,如按键控制设备启动、停止或切换模式。
传感器触发:当传感器检测到特定事件或条件发生时(如温度达到阈值、光线强度变化等),可以触发外部中断来及时处理传感器数据。这种中断类型在环境监测、工业自动化等领域有广泛应用。
2:中断的配置过程思路:
设置IO口与中断线的映射关系。
初始化线上中断,设置触发条件等。
配置中断分组(NVIC),并使能中断。
编写中断服务函数。
清除中断标志位
3:STM32cube 软件的配置过程:
3.1查看硬件原理图:
可以看到板载的用户按键分别使用PA0,PB5和PB14IO口,我们只需要在cube中配置其为中断模式,可以根据自身的需要配置上升沿触发、还是下降沿触发
可以配置 中断的模式:
只需要配置上图中的代码就可以了,然后直接电机生成代码:
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/* Enable SYSCFG clock */
__HAL_RCC_SYSCFG_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2|GPIO_PIN_1|GPIO_PIN_4, GPIO_PIN_SET);
/*Configure GPIO pins : PB2 PB4 */
GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_4;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/*Configure GPIO pin : PB1 */
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/*Configure GPIO pin : PA2 */
GPIO_InitStruct.Pin = GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF7_SWDIO;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pin : PA0 */
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pin : PB5 */
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
编写中断处理函数如下:
void HAL_GPIO_EXTI_Callback(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
{
if (GPIO_Pin == GPIO_PIN_0)
{
/* Toggle LD1 */
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);
}
if (GPIO_Pin == GPIO_PIN_5)
{
/* Toggle LD1 */
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_2);
}
if (GPIO_Pin == GPIO_PIN_14)
{
/* Toggle LD1 */
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_4);
}
}
试验现象:按下板载的三个用户按键,可以控制对应LED灯电平的翻转。
在软件配置的时,需要注意配置好IO口的工作模式,使能中断功能,直接编写中断处理函数即可。
软件代码如下:
https://bbs.21ic.com/forum.php?mod=attachment&aid=MjMxOTk1OHxkZWJlOGNjNGE2ZDlmNWY3OGI2NDQ0Njc0MDNmMDdjY3wxNzMzODI5OTgz&request=yes&_f=.zip
|