STM32
直播中

陈静

7年用户 1266经验值
私信 关注
[问答]

如何使用三组串口中断互相通信?

如何使用三组串口中断互相通信

回帖(1)

华一颖

2021-11-16 14:38:31
基于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,官方没有的话后面有下载地址





Keil5,用来编译STM32CubeMX生成的工程项目
两个工具包下载 链接:https://pan.baidu.com/s/1IFu5eLlBD31gcEenxwt37Q  提取码:p04j
下载后自行安装,STM32CubeMX运行需要安装JAVA运行环境,直接百度安装java环境

3、STM32CubeMX设置

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











4、建立工程

依次打开 File > New Project,此时会自动弹出下载选型的的界面,下好后,选STM32F302CB双击确定进入工程界面




1)配置晶振和配置时钟













2)配置串口usart1、usart2、usart3

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






















3)生成项目

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







5、Keil5编译工程项目

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下载程序


























6、修改

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










main.h





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















效果如下





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


举报

更多回帖

发帖
×
20
完善资料,
赚取积分