1.关键设置


2.代码
2.1 bsp_usart.h
/***********************************************************************************
bsp_usart.h
***********************************************************************************/
#ifndef __BSP_USART_H__
#define __BSP_USART_H__
#include "stm32h7xx_hal.h"
#include "main.h"
#define RX_LEN 1024
typedef struct
{
uint8_t RX_flag:1; //IDLE receive flag
uint8_t TX_flag:1; //IDLE send flag
uint16_t RX_Size; //receive length
uint8_t RX_pData[RX_LEN]; //DMA receive buffer
}Usart_ReciveType;
extern Usart_ReciveType UsartType;
void EnableUsart_IT(void);
void Analysis_Serial_Data(void);
void UsartReceive_IDLE(UART_HandleTypeDef *huart);
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);
#endif
2.2 bsp_usart.c
/***********************************************************************************
bsp_usart.c
***********************************************************************************/
#include "bsp_usart.h"
#include "stm32h7xx_hal.h"
#include "main.h"
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
Usart_ReciveType UsartType;
/*****************************************************************************
* 函 数 名 : EnableUsart_IT
* 函数功能 : 使能串口中断
* 输入参数 :
* 返 回 值 :
* 其 它 :
*****************************************************************************/
void EnableUsart_IT(void)
{
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
HAL_UART_Receive_DMA(&huart1,UsartType.RX_pData,RX_LEN);
__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
}
/*****************************************************************************
* 函 数 名 : UsartReceive_IDLE
* 函数功能 : 串口接受空闲中断处理函数
* 输入参数 : UART_HandleTypeDef *huart 串口句柄
* 返 回 值 :
* 其 它 :
*****************************************************************************/
void UsartReceive_IDLE(UART_HandleTypeDef *huart)
{
uint32_t temp;
if((__HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE) != RESET))
{
__HAL_UART_CLEAR_IDLEFLAG(huart);
HAL_UART_DMAStop(huart);
temp = __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
if(huart->Instance==USART1)
{
UsartType.RX_Size = RX_LEN - temp;
UsartType.RX_flag = 1;
HAL_UART_Receive_DMA(huart,UsartType.RX_pData,RX_LEN);
}
}
}
/*****************************************************************************
* 函 数 名 : Analysis_Serial_Data
* 函数功能 : 串口接收数据直接转发函数
* 返 回 值 : void
* 其 它 :
*****************************************************************************/
void Analysis_Serial_Data(void)
{
if(UsartType.RX_flag)
{
UsartType.RX_flag=0;
HAL_UART_Transmit_DMA(&huart1, UsartType.RX_pData, UsartType.RX_Size);
}
}
/*****************************************************************************
* 函 数 名 : HAL_UART_TxCpltCallback
* 函数功能 : 串口发送完成回调函数
* 输入参数 : UART_HandleTypeDef *huart 串口操作句柄
* 返 回 值 :
* 其 它 : 使用DMA时需要将发送完成状态更新,否则DMA会出现bug
*****************************************************************************/
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
huart->gState = HAL_UART_STATE_READY;
}
/*****************************************************************************
* 函 数 名 : fputc
* 函数功能 : 实现printf函数重定向到串口1,即支持printf信息到USART1
* 输入参数 :
* 返 回 值 :
* 其 它 :
*****************************************************************************/
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
2.3 main.c
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : main.c
* @brief : Main program body
******************************************************************************
* @attention
*
* <h2><center>© Copyright (c) 2022 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under BSD 3-Clause license,
* the "License"; You may not use this file except in compliance with the
* License. You may obtain a copy of the License at:
* opensource.org/licenses/BSD-3-Clause
*
****************************************************************************

本文详细介绍了STM32H7系列微控制器的USART模块配置,包括初始化、中断处理和DMA传输。通过实例展示了如何设置关键配置,编写了驱动程序及中断服务例程,实现了串口数据的接收和发送,以及与DMA的高效配合。
最低0.47元/天 解锁文章
1017

被折叠的 条评论
为什么被折叠?



