空闲中断+DMA接收数据
使用LL库配置,可与HAL库一起使用,0级优化编译文件大小如下:
1.工程目录
2.代码配置
usart1.h
主要定义接收缓存,发送缓存,处理缓存大小
#ifndef _USART1_H
#define _USART1_H
#include "stm32h7xx.h"
#define USART1_TX_BUFFER_SIZE (1 * 1024)
#define USART1_RX_BUFFER_SIZE (1 * 1024)
#define USART1_RX_HANDLE_SIZE (1 * 1024)
extern uint8_t USART1_TX_BUFFER[USART1_TX_BUFFER_SIZE];
extern uint8_t USART1_RX_BUFFER[USART1_RX_BUFFER_SIZE];
extern uint8_t USART1_RX_HANDLE[USART1_RX_HANDLE_SIZE];
extern uint32_t USART_RX_CNT; //接收的字节数
void IAP_USART1_Init(void);
void DMA_START(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t *SRC_ADDR, uint32_t *DES_ADDR, uint32_t Data_Len, uint32_t Direction);
#endif
usart1.c
DMA1的USART1 TX RX都配置好了,但是一般不需要,所以虽然配置了但未使用
#include "usart1.h"
#include "string.h"
#include "stm32h7xx_ll_utils.h"
#include "stm32h7xx_ll_dma.h"
#include "stm32h7xx_ll_usart.h"
#include "stm32h7xx_ll_gpio.h"
uint8_t USART1_TX_BUFFER[USART1_TX_BUFFER_SIZE] = {
0};
uint8_t USART1_RX_BUFFER[USART1_RX_BUFFER_SIZE] = {
0};
uint8_t USART1_RX_HANDLE[USART1_RX_HANDLE_SIZE] = {
0};
uint32_t USART_RX_CNT = 0; //接收的字节数
/**
* @brief 配置USART1串口.
*/
void USART1_UART_Init(void)
{
LL_USART_InitTypeDef USART_InitStruct = {
0};
LL_GPIO_InitTypeDef GPIO_InitStruct = {
0};
//开启外设 USART1 时钟
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_USART1);
//开启 GPIOA 时钟
LL_AHB4_GRP1_EnableClock(LL_AHB4_GRP1_PERIPH_GPIOA);
//USART1 GPIO Configuration
//PA9 ------> USART1_TX
//PA10 ------> USART1_RX
GPIO_InitStruct.Pin = LL_GPIO_PIN_9|LL_GPIO_PIN_10;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
GPIO_InitStruct.Alternate = LL_GPIO_AF_7;
//初始化 PA9 PA10
LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
USART_InitStruct.PrescalerValue = LL_USART_PRESCALER_DIV1; //时钟不分频
USART_InitStruct.BaudRate = 512000; //波特率512000
USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B; //数据宽度8位
USART_InitStruct.StopBits = LL_USART_STOPBITS_1; //一个停止位
USART_InitStruct.Parity = LL_USART_PARITY_NONE; //无奇偶校验
USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX; //开启TX RX
USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE; //无硬件流控制
USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16; //16倍过采样
//初始化 USART1
LL_USART_Init(USART1, &USART_InitStruct);
LL_USART_SetTXFIFOThreshold(USART1, LL_USART_FIFOTHRESHOLD_1_8);//1/8 FIFO
LL_USART_SetRXFIFOThreshold(USART1, LL_USART_FIFOTHRESHOLD_1_8);
//LL_USART_EnableFIFO(USART1);
LL_USART_DisableFIFO(USART1); //不使用 FIFO
LL_USART_ConfigA