基于STM32CubMX和HAL库的外设开发
第七讲 GPIO作为外部中断
一、外部中断简介
- STM32中含有多个外部中断号(外部中断号的命名与对应引脚的最后一个引脚号保持一致EXTIx),
- 一个外部中断号对应了多个GPIO引脚(所以当使用其中一个引脚产生外部中断的时候,其余的引脚便不可以使用外部中断了)
- 中断号对应的地址叫做中断向量(中断地址),不同的中断号对应不同的中断地址,或者多个中断号对应一个中断地址(一一对应或者是多一对应的关系),
- 不同中断地址的作用就是,在每个中断号对应的代码中编写程序就可以通过指针直接跳到相应的中断地址,从而达到多个控制的作用。
- 抢占优先级:级别高的优先级可以打断级别低的优先级
- 子优先级 :级别高的优先级不可以打断级别低的优先级,但是当中断同时到达时,级别高的优先级优先得到执行(不可以抢)
- STM32中用户可以配置4位优先级,
二、示例一:按键的中断识别
即每按一次按键,led0状态反转,我们还是结合具体实例来了解终端功能的实现 原理图如下,可以结合第二讲 LED灯的点亮来对比理解 分析: 按键触发:1-0-1(可以下降沿也可以上升沿触发函数),然后在中断函数中使引脚的电平取反
1、配置引脚为外部中断模式
2、配置GPIO参数,触发沿,上下拉
**注意注意:**这里因为原理图上显示按键KEY1没法输出高电平
3、到NVIC中使能相应中断(有需要的可以配置优先级)
4、生成代码
5、编写代码
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);
}
如果按键容易抖动,为了避免抖动导致的触发 我们可以加一个条件
uint32_t lastTime=0;
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(HAL_GetTick()-lastTime>300)
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);
lastTime=HAL_GetTick();
}
三、示例二:串口的的中断收发
1、到NVIC中使能相应串口中断(有需要的可以配置优先级)
2、生成代码
3、编写代码
(1)常用的串口中断收发接口
HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
区别于
HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
可以看出中断发送不会等待发送完成再返回
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
通过回调函数让HAL库完成发送之后通知用户
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
(2)示例代码
串口接收
HAL_UART_Transmit_IT(&huart1,(uint8_t*)"hello\r\n",sizeof("hello\r\n"));
HAL_Delay(500);
串口收发
uint8_t revByte[16];
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
HAL_UART_Transmit_IT(&huart1,revByte,10);
}
while (1)
{
HAL_UART_Receive_IT(&huart1,revByte,10);
}
这里主函数中可以加入一个发送值体会中断和非中断的区别:中断不等待性
while (1)
{
HAL_UART_Receive_IT(&huart1,revByte,10);
HAL_UART_Transmit_IT(&huart1,(uint8_t*)"return\r\n",sizeof("I am ready\r\n"));
HAL_Delay(500);
}
|