|
【前言】 这次使用的健康监测传感器的接口为UART接口,波特率为38400,因为不的工作状态,所接收到的字节数是不一样的,因此,我此次采取STM32H7中的CM4的USART1行进接收,用DMA+空闲中断来实现对数据帧的接收。 【串口输出设计】 1、选择usart1与mks传感器进行连接,开发板的usart1是PB6/PB7为输出接口
2、选择开发板与stlink的USART3做为日志输出。 【串口配置】 打开stm32cubeMX,导入工程 1、配置USART3为异步,波特率为38400,配置RX、TX的GPIO为PB7、PB6。GPIO为上拉模式。 2、添加DMA-RX接收,配置参数为外设到内存,循环接收,内存为自增长,接收数据宽度为byte配置好后如下图所示:
开启串口全局中断与DMA中断。 3、同时也配置usart3,波特率为115200 配置好后,使用stm32cubeIDE打开工程。 【代码编写】 1、在stm32h7xx_it.c的串口中断函数中添加空闲中断的代码: |
2025国庆中秋活动体验报告4_解析传感器数据
2025国庆中秋活动体验报告2 健康监测界面设计
【学习有礼】 STM32H7R/S线上课程,快速入手!
AN5617中OpenAMP Linker configuration中的一处勘误
STM32H755双核通信学习资料
STM32H7双核通信实现方法学习AN5617
【NUCLEO-H755ZI-Q】收集资料
【NUCLEO-H755ZIQ】到手一个STM32H755
踩坑经验分享,不知道这个坑,大家有没有踩过
【STM32F769I-DISC1】移植LVGL
微信公众号
手机版
【代码编写】
1、在stm32h7xx_it.c的串口中断函数中添加空闲中断的代码:
if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE) == SET)
{
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
USAR_UART_IDLECallback(&huart1);
}
首先判断是否是usart1的空闲中断,如果是清除中断标志,并执行数据处理的函数USAR_UART_IDLECallback。
2、添加USAR_UART_IDLECallback内容如下:
void USAR_UART_IDLECallback(UART_HandleTypeDef *huart)
{
HAL_UART_DMAStop(&huart1); //停止本次DMA传输
uint8_t data_length = SCREEN_RXBuf_SIZE - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx); //计算接收到的数据长度
printf("Receive Data(length = %d): ",data_length);
HAL_UART_Transmit(&huart3,USART1_Head.RxBuf,data_length,0x200); //测试函数:将接收到的数据打印出去
printf("\r\n");
memset(USART1_Head.RxBuf,0,data_length); //清零接收缓冲区
data_length = 0;
HAL_UART_Receive_DMA(&huart1, (uint8_t*)USART1_Head.RxBuf, SCREEN_RXBuf_SIZE); //重启开始DMA传输 每次255字节数据
}
在main.h中声明结构体:
/ USER CODE BEGIN EFP /
define SCREEN_RXBuf_SIZE 256
typedef struct
{
uint8_t RxBuf[SCREEN_RXBuf_SIZE];
uint8_t Rx_over;
uint32_t Rx_count;
}_USART_Typedef;
extern _USART_Typedef USART1_Head;
/ USER CODE END EFP /
3、在main中添加开启空闲中断以及dma接收的的命令:
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
HAL_UART_Receive_DMA(&huart1, (uint8_t*)USART1_Head.RxBuf, SCREEN_RXBuf_SIZE);
编译代码下载到cortex-M4内核中,接上串口进行测试
接上传感器后,可以正确的接收到完整的一帧数据: