简介:
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
|