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

简介:

        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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值