文章目录
前言
串口的发送和接受有三种方式,分别是阻塞发送和接收(轮询)、中断方式发送和接收、DMA方式发送和接收。这里我使用阻塞+中断的方式实现双串口通信。
一、三种收发方式对应的函数
1、阻塞(轮询)接收或发送:
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
2、中断方式接收或发送:
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
使用中断方式注意回调函数的使用,不然接收或发送动作只执行一次,对应的回调函数怎么使用请在stm32xxx_hal_uart,c中查看。
3、DMA方式发送或接收:
HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
二、使用的工具及效果展示
1.实用工具:keil,STM32CubeMX,串口调试工具
2.实验效果展示
三、利用STM32CubeMX引入工程
第一步:芯片的选择
第二步:导入模板工程对应引脚设置
根据此路径选择注意这里rzcy005指的是用户目录(
)C:\Users\rczy005\STM32Cube\Repository\STM32Cube_FW_WL_V1.3.0\Projects\NUCLEO-WL55JC\Applications\SubGHz_Phy\SubGHz_Phy_PingPong\SubGHz_Phy_PingPong.ioc
关闭不需要的PIN,配置需要的外设
这里我们加了DMA,也可以不加,需要用就加
对串口1进行设置
这里对射频频率进行配置,我用的板子是470030000可根据自己的情况设置
最后检查下时钟树
最后点击创建工程
四、工程文件BSP的加入
到此目录下找到BSP驱动C:\Users\rczy005\STM32Cube\Repository\STM32Cube_FW_WL_V1.3.0\Drivers\BSP
将此文件加入到我们的工程中
在kile中进行添加
五、代码部分
由于我们用的是pingpong例程模板,所以将代码写入到
首先进行头文件添加
#include "usart.h"
#include "string.h"
在SubghzApp_Init中进行收发的工作
//中断模式发送与接收,注意在接收时要用到相应的回调函数
HAL_UART_Receive_IT(&huart1,aRxBuffer1,1); // 使能 USART1接收中断
HAL_UART_Receive_IT(&huart2,aRxBuffer2,1); // 使能USART2 接收中断
HAL_UART_Transmit(&huart1,aTxBuffer,sizeof(aTxBuffer),100);
HAL_UART_Transmit(&huart2,aTxBuffer,sizeof(aTxBuffer),100);
接着编写回调函数
`使用回调函数时需要将工程自动生成的回调函数删除,不然会重复定义`
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1) // 判断是由哪个串口触发的中断
{
HAL_UART_Transmit(&huart2,aRxBuffer1,1,100); // 接收到数据马上使用串口1发送出去
HAL_UART_Receive_IT(&huart1,aRxBuffer1,1); // 重新使能串口1接收中断
}
if(huart->Instance == USART2)
{
HAL_UART_Transmit(&huart1,aRxBuffer2,1,100); // 接收到数据马上使用串口1发送出去
HAL_UART_Receive_IT(&huart2,aRxBuffer2,1); // 重新使能串口2接收中断
}
}
注意,在main.c中,要对初始化位置进行颠倒
总结
简单的串口收发