单片机stm32系列——内部中断与外部中断,搭配stm32cubeMX+keil5
·
一、内部中断:usart中断
1.在cubeMX中勾选usart1的NVIC(中断向量控制器)中的使能
2.点击生成代码

3.打开keil5会发现文件中多了一个stmf1xx_it.c文件,代码中有一个打开usart1中断服务函数

4.在main函数内的while循环前必须开启一次中断函数接收
HAL_UART_Receive_IT(&huart1, &rx_byte, 1);
5.正常写while循环中的代码不影响中断回调
6.收到数据 → MCU 自动进中断 → HAL 调回调函数(就是说每次接收到数据就会启动一次中断的回调函数)
下面写一个demo每次传输完成就启动LED灯的反转
uint8_t rx_byte; //定义一个全局变量
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart->Instance == USART1)
{
if (rx_byte != NULL)
{
HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); //自定义内容
HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin); //自定义内容
}
// ⭐ 必须开启下一次接收
HAL_UART_Receive_IT(&huart1, &rx_byte, 1);
}
}
二、外部中断:GPIO中断
1.在cubeMX中选择外部中断引脚,这里选择PE4

2.配置PE4为上拉电阻下降沿有效

3.在PE4引脚配置中打开NVIC(中断向量控制器)的使能

4.点击cubeMX生成代码

5.打开keil5发现在中断入口文件stm32fxx_it.c中多了一个函数EXTI4_IRQHandler,这就是EXTI4 的中断服务函数
6.硬件中断需要现在在main函数内初始化GPIO
MX_GPIO_Init(); //GPIO初始化
7.正常写while循环中的代码不影响中断回调
8.GPIO电平变化 → MCU 自动进中断 → HAL 调回调函数(就是说每次接收到数据就会启动一次中断的回调函数)
此demo中在每次key0按下后,就会触发外部中断,运行中断函数,使得LED0反转
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == KEY0_Pin) // PE4 按键
{
// ? 软件消抖:简单延时 10~20 ms
for (int i = 0; i < 10000; i++); // 简短延时,大约 10ms(视系统频率而定)
// 再次读取引脚状态,确认按键真的被按下
if (HAL_GPIO_ReadPin(KEY0_GPIO_Port, KEY0_Pin) == GPIO_PIN_SET)
{
HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin); // 翻转 LED0
}
}
}
谢谢大家,我会继续努力
更多推荐
所有评论(0)