基于HAL库的多串口通信入门,多串口中断通信,可以发任意字节数据,用的STM32F302CBTx,STM32F103也一样通用。
本例使用三组串口中断互相通信。
现在开发stm32一般有几种方式,如下
HAL库开发:
STM32CubeMX中可以下载各个stm系列的HAL库,集成stm常见的外设,便于一键生成项目代码。STM32CubeMX是ST公司现在主推的一个配置工具,可以下载HAL库,直接由图形界面简单配置下,生成初始化代码,并对外设做了进一步的抽象,方便快捷,但出问题时,不熟悉的情况下容易无从下手。
标准外设库(STD)开发:
是对STM32芯片的一个完整的封装,包括所有标准器件外设的器件驱动器。一般每个系列的标准库都是不一样的,所以没有可移植性。
寄存器开发:
直接操作寄存器,不使用stm官方的库,容易操作,但对寄存器操作要比较熟悉。
STM32CubeMX,本人用的5.2版
官方链接https://www.st.com/en/development-tools/stm32cubemx.html,官方没有的话后面有下载地址
Keil5,用来编译STM32CubeMX生成的工程项目
两个工具包下载 链接:https://pan.baidu.com/s/1IFu5eLlBD31gcEenxwt37Q 提取码:p04j
下载后自行安装,STM32CubeMX运行需要安装JAVA运行环境,直接百度安装java环境
打开,下载stm32f302cbtx库,步骤如下
依次打开 File > New Project,此时会自动弹出下载选型的的界面,下好后,选STM32F302CB双击确定进入工程界面
波特率115200,使能中断,使能中断优先级,三组串口都要配置,再检查下串口时钟,串口引脚可以看右边的芯片图,也可以自定义
设置项目名,保存路径,生成项目后的编译工具(MDK-ARM V5就是ARM版Keil5),编译的默认库,再点generate code
1)添加使能串口的函数,添加三组串口自发自收的函数,注意在USER CODE BEGIN和END之间,否则再次编译cubemx时会被覆盖,编译
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下载程序
程序烧写后,会发现发送短数据,收发没问题,但长的数据,容易发生不进中断的情况(可以在中断中加led闪烁程序),修改代码如下,加入一个标志位,在串口中断时若串口堵塞时置位,再在main函数中再使能中断
main.c
main.h
stm32f0xx_it.c的串口中断处理函数加入如下代码
效果如下
若要串口1发给串口3,则可以将函数void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)中改为如下