[STM32H7] STM32H7系列 armCortex-M7 串口DMA不定长接收 STM32H750 STM32H723 HAL库

[复制链接]
荣陶陶 发表于 2025-8-26 08:43 | 显示全部楼层 |阅读模式
简介:

        STM32H7系列微控制器采用了带有缓存(Cache)的Cortex-M7/M4内核,不维护缓存时CPU核心、DMA控制器和其他主设备访问内存时看到的数据可能不一致,此类芯片上需要确保缓存一致性。DMA是数据异常的高发区,对比低端芯片系列要进行特殊处理。本文只强调不同,常见DMA空闲接收请找其他文章

H7系列主要包含:

一级缓存(L1 Cache): 指令缓存(I-Cache)和数据缓存(D-Cache)

二级缓存(L2 Cache): 部分型号配备

CubeMX配置:

DMA 仅开启RX 全默认设置

DMA和串口中断NVIC勾选

全默认设置即可

代码:

.c

#include "user_uart.h"

__attribute__((aligned(32))) volatile uint8_t uart1_rx[UART1_RXSIZE];

//重定向printf
int fputc(int ch,FILE*f)
{
        HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,50);
        return ch;
}

//串口接收回调
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size){
        if(huart == &huart1){
                if(Size <= UART1_RXSIZE){
                        SCB_InvalidateDCache_by_Addr((uint32_t *)(((uint32_t)uart1_rx) & ~0x1F), ((UART1_RXSIZE + 31) / 32) * 32);// DMA传输后(外设->CPU):
                        printf("Size:%d RX:%s\r\n",Size,uart1_rx);
                }
                // 重新启动接收
        HAL_UARTEx_ReceiveToIdle_DMA(&huart1, (uint8_t *)uart1_rx, UART1_RXSIZE);
        __HAL_DMA_DISABLE_IT(&hdma_usart1_rx, DMA_IT_HT); // 禁止半满中断
        }
}



.h

#ifndef _USER_UART_H_
#define _USER_UART_H_

#include "usart.h"
#include "dma.h"
#include "stdio.h"
#include "string.h"

#define UART1_RXSIZE 64
extern DMA_HandleTypeDef hdma_usart1_rx;
extern __attribute__((aligned(32))) volatile uint8_t uart1_rx[UART1_RXSIZE];

#endif



使用

HAL_UARTEx_ReceiveToIdle_DMA(&huart1,(uint8_t *)uart1_rx,UART1_RXSIZE);   //打开串口1
————————————————
版权声明:本文为CSDN博主「qttet」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qttet/article/details/150117947

您需要登录后才可以回帖 登录 | 注册

本版积分规则

54

主题

214

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部