STM32F0x HAL库学习笔记(5)串口的数据的收发(中断模式)

本文开发环境:

  • MCU型号:STM32F051R8T6
  • IDE环境: MDK 5.25
  • 代码生成工具:STM32CubeMx 5.0.1
  • HAL库版本:v1.9.0(STM32Cube MCU PackageforSTM32F0 Series)

本文内容:

  1. STM32CubeMx 配置异步串口中断配置
  2. 串口数据的中断收发

所需工具:
硬件:USB转串口模块
软件:串口助手

STM32CubeMx 初始化串口中断的配置

在上一节中,我们已经初始化了串口的最基本功能,由于没有开启中断,只能使用轮询方式收发数据。但是我们经常需要中断来实现程序功能。
所以这里我们打开上一节的功能,再进一步的配置串口的中断。配置中断主要是使能NVIC中断,并设置好中断优先组。以下是具体的配置:
在这里插入图片描述
我们在NVIC设置中,使能串口的全局中断,这样工程就会生成串口中断函数的定义。但是我还还需要让工程生成串口中断初始化函数,这部分在NVIC中配置,具体如下图所示:
在这里插入图片描述
M0的中断优先级别没有M3,M4那样可以设置分组,它只有4个等级可以选,我们这里可以保持默认的0,和其它模式一致,也可以改为其他数值。这个根据具体程序需求来确定,具体设置方法如下(以等级为1为例):
在这里插入图片描述
这点击GENERATE CODE生成代码后,就可以编写用户程序了。

中断接收函数的使用

当我们配置使能中断以后,一旦响应的串口发送中断后,串口中断函数就会判断一些错误信息标志位,如果串口工作正常,则失能串口中断,然后执行回调函数,所以当我们运行回调函数时,在结束前需要再次开启中断,否则中断处于失能状态。接着,工程默认函数串口的中断处于失能状态,我们可以通过HAL_USART_Receive_IT()函数来使能,同时它也是配置函数,关于中断的使用,示例程序如下:

... ...
uint8_t recv_data[512];              //定义接受数据的数组
uint8_t send_data[512];              //定义发送数据的数组
... ...
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	send_data[0] = recv_data[0] + 1;
	HAL_UART_Transmit(&huart1,(unsigned char *)&send_data,1,0x200);//发送数据+1后的值
	
	HAL_UART_Receive_IT(&huart1, recv_data,1);                     //再次使能接受中断
}
... ...
void main(void)
{
	... ...
	HAL_UART_Receive_IT(&huart1, recv_data,1); //使能接收中断,并配置为每次1个字节,即收到1个字节即调用回调函数
	... ...
	while(1)
	{
	}
} 

常见问题

关于CubeMx串口中断最常见的问题是已经置生成串口中断初始化代码了,但还时发现中断函数并不运行,这是可能是因为默认没有开启串口中断的原因,只在软件配置使能使能了NIVC中断,还有发现程序只运行一次串口中断,这是因为每次串口中断函数都会关闭自身中断,然后再调用回调函数,如果回调函数里面不开启中断,则串口将处于中断中途,这2个问题在以上代码也体现处理。
最后,虽然本文的MCU型号是STM32F051,但是在STM32F103,STM32F205的MCU上,配置流程和代码使用并无不同,这也提醒了CubeMx工具的便利性和HAL库的兼容性。

猜你喜欢

转载自blog.csdn.net/qq_17351161/article/details/89415937