STM32 HAL库多串口中断通讯【任意长度 不丢帧】

基于HAL库的多串口通信入门,多串口中断通信,可以发任意字节数据,用的STM32F302CBTx,STM32F103也一样通用。

本例使用三组串口中断互相通信。

1、背景了解和工具

现在开发stm32一般有几种方式,如下

HAL库开发:

STM32CubeMX中可以下载各个stm系列的HAL库,集成stm常见的外设,便于一键生成项目代码。STM32CubeMX是ST公司现在主推的一个配置工具,可以下载HAL库,直接由图形界面简单配置下,生成初始化代码,并对外设做了进一步的抽象,方便快捷,但出问题时,不熟悉的情况下容易无从下手。

标准外设库(STD)开发:

是对STM32芯片的一个完整的封装,包括所有标准器件外设的器件驱动器。一般每个系列的标准库都是不一样的,所以没有可移植性。

寄存器开发:

直接操作寄存器,不使用stm官方的库,容易操作,但对寄存器操作要比较熟悉。

2、工具下载安装

STM32CubeMX,本人用的5.2版

官方链接https://www.st.com/en/development-tools/stm32cubemx.html,官方没有的话后面有下载地址

STM32 HAL库多串口中断通讯【任意长度 不丢帧】_第1张图片

Keil5,用来编译STM32CubeMX生成的工程项目

两个工具包下载 链接:https://pan.baidu.com/s/1IFu5eLlBD31gcEenxwt37Q  提取码:p04j 

下载后自行安装,STM32CubeMX运行需要安装JAVA运行环境,直接百度安装java环境

 

3、STM32CubeMX设置

打开,下载stm32f302cbtx库,步骤如下

STM32 HAL库多串口中断通讯【任意长度 不丢帧】_第2张图片

STM32 HAL库多串口中断通讯【任意长度 不丢帧】_第3张图片

 

4、建立工程

依次打开 File > New Project,此时会自动弹出下载选型的的界面,下好后,选STM32F302CB双击确定进入工程界面STM32 HAL库多串口中断通讯【任意长度 不丢帧】_第4张图片

1)配置晶振和配置时钟

STM32 HAL库多串口中断通讯【任意长度 不丢帧】_第5张图片

STM32 HAL库多串口中断通讯【任意长度 不丢帧】_第6张图片

 

2)配置串口usart1、usart2、usart3

波特率115200,使能中断,使能中断优先级,三组串口都要配置,再检查下串口时钟,串口引脚可以看右边的芯片图,也可以自定义

 

STM32 HAL库多串口中断通讯【任意长度 不丢帧】_第7张图片

STM32 HAL库多串口中断通讯【任意长度 不丢帧】_第8张图片

STM32 HAL库多串口中断通讯【任意长度 不丢帧】_第9张图片

STM32 HAL库多串口中断通讯【任意长度 不丢帧】_第10张图片

 

3)生成项目

设置项目名,保存路径,生成项目后的编译工具(MDK-ARM V5就是ARM版Keil5),编译的默认库,再点generate code

STM32 HAL库多串口中断通讯【任意长度 不丢帧】_第11张图片

 

5、Keil5编译工程项目

1)添加使能串口的函数,添加三组串口自发自收的函数,注意在USER CODE BEGIN和END之间,否则再次编译cubemx时会被覆盖,编译

STM32 HAL库多串口中断通讯【任意长度 不丢帧】_第12张图片

STM32 HAL库多串口中断通讯【任意长度 不丢帧】_第13张图片

main函数外代码如下

/* USER CODE BEGIN 0 */
uint8_t Uart1RX_Data,Uart2RX_Data,Uart3RX_Data;

void USART_IT_Start(void)
{
	HAL_UART_Receive_IT(&huart1,&Uart1RX_Data,1);
	HAL_UART_Receive_IT(&huart2,&Uart2RX_Data,1);
	HAL_UART_Receive_IT(&huart3,&Uart3RX_Data,1);
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance == USART1)
	{

		HAL_UART_Transmit(&huart1,&Uart1RX_Data,1,0xFFFF);
        HAL_UART_Receive_IT(&huart1,&Uart1RX_Data,1);      
	}
	
	if(huart->Instance == USART2)
	{

		HAL_UART_Transmit(&huart2,&Uart2RX_Data,1,0xFFFF);
        HAL_UART_Receive_IT(&huart2,&Uart2RX_Data,1);
	}
	
	if(huart->Instance == USART3)
	{
		HAL_UART_Transmit(&huart3,&Uart3RX_Data,1,0xFFFF);
		HAL_UART_Receive_IT(&huart3,&Uart3RX_Data,1);      
	}
	
}
/* USER CODE END 0 */

main函数调用函数

  /* USER CODE BEGIN 2 */
  USART_IT_Start();
  /* USER CODE END 2 */

 

2)下载设置,设置为J-LINK下载(目前用的J-LINK,swd下载选择ST Link),选择设置芯片,设置Port为SW,设置10MHz,检查右边有没发现jlink,没有多试几次,设置flashdowload选项里的Reset and Run,这样程序烧写后才会运行(zz设定),再点击download下载程序

STM32 HAL库多串口中断通讯【任意长度 不丢帧】_第14张图片

STM32 HAL库多串口中断通讯【任意长度 不丢帧】_第15张图片

STM32 HAL库多串口中断通讯【任意长度 不丢帧】_第16张图片

STM32 HAL库多串口中断通讯【任意长度 不丢帧】_第17张图片

STM32 HAL库多串口中断通讯【任意长度 不丢帧】_第18张图片

 

6、修改

程序烧写后,会发现发送短数据,收发没问题,但长的数据,容易发生不进中断的情况(可以在中断中加led闪烁程序),修改代码如下,加入一个标志位,在串口中断时若串口堵塞时置位,再在main函数中再使能中断

main.c

STM32 HAL库多串口中断通讯【任意长度 不丢帧】_第19张图片

STM32 HAL库多串口中断通讯【任意长度 不丢帧】_第20张图片

main.h

STM32 HAL库多串口中断通讯【任意长度 不丢帧】_第21张图片

stm32f0xx_it.c的串口中断处理函数加入如下代码

STM32 HAL库多串口中断通讯【任意长度 不丢帧】_第22张图片

STM32 HAL库多串口中断通讯【任意长度 不丢帧】_第23张图片

STM32 HAL库多串口中断通讯【任意长度 不丢帧】_第24张图片

效果如下

STM32 HAL库多串口中断通讯【任意长度 不丢帧】_第25张图片

若要串口1发给串口3,则可以将函数void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)中改为如下

STM32 HAL库多串口中断通讯【任意长度 不丢帧】_第26张图片

你可能感兴趣的:(STM32)