STM32CubeMX配置STM32G071UART+DMA收发数据(HAL库开发)

时钟配置HSI主频配置64M

配置好串口,选择异步模式

配置DMA TX,RX,选择循环模式。

NVIC中勾选使能中断

勾选生成独立的.c和h文件

配置好需要的开发环境并获取代码

串口重定向勾选Use Micro LIB

main.c文件修改

增加头文件和串口重定向

复制代码
#include <string.h>

int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);

  return ch;
}

main函数修改

复制代码
  printf("hello world\r\n");
  while (1)
  {
	if(USART1_RECV_FLAG == 1)
	{
		printf("rx_len = %d \r\n",USART1_RX_LEN);
		HAL_UART_Transmit(&huart1,USART1_RX_BUF, USART1_RX_LEN,200);

		memset(USART1_RX_BUF,0,USART1_RX_BUF_SIZE);
		USART1_RX_LEN = 0;
		USART1_RECV_FLAG = 0;
	}
	HAL_UART_Receive_DMA(&huart1,USART1_RX_BUF,USART1_RX_BUF_SIZE);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

usart.c文件修改

增加定义

复制代码
uint8_t USART1_RX_LEN = 0;             
uint8_t USART1_RECV_FLAG = 0;     
uint8_t USART1_RX_BUF[USART1_RX_BUF_SIZE]={0};   

修改void MX_USART1_UART_Init(void)函数

复制代码
void MX_USART1_UART_Init(void)
{

  /* USER CODE BEGIN USART1_Init 0 */

  /* USER CODE END USART1_Init 0 */

  /* USER CODE BEGIN USART1_Init 1 */

  /* USER CODE END USART1_Init 1 */
  huart1.Instance = USART1;
  huart1.Init.BaudRate = 115200;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
  huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN USART1_Init 2 */

  /* USER CODE END USART1_Init 2 */
  __HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
  HAL_UART_Receive_DMA(&huart1,USART1_RX_BUF,USART1_RX_BUF_SIZE);
}

usart.h文件修改

增加头文件和定义声明

复制代码
#include "stdio.h"

#define USART1_RX_BUF_SIZE 512
extern  uint8_t USART1_RX_LEN;             
extern  uint8_t USART1_RECV_FLAG;     
extern uint8_t USART1_RX_BUF[USART1_RX_BUF_SIZE];  

stm32g0xx_it.c文件修改

增加头文件

复制代码
#include "usart.h"

修改void USART1_IRQHandler(void)函数

复制代码
void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
	uint32_t temp;

  if((__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE) != RESET))
  {
	  __HAL_UART_CLEAR_IDLEFLAG(&huart1);
	  HAL_UART_DMAStop(&huart1);
	  temp  =  __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
	  USART1_RX_LEN =  USART1_RX_BUF_SIZE - temp; 

	  USART1_RECV_FLAG = USART1_RX_LEN ? 1 : 0;  
	  HAL_UART_Receive_DMA(&huart1,USART1_RX_BUF,USART1_RX_BUF_SIZE);
  }

  /* USER CODE END USART1_IRQn 1 */
}

编译后连上串口工具调试

相关推荐
糖糖单片机设计3 小时前
基于 STM32 与中移 OneNet 的智慧电梯监控平台系统
stm32·单片机·嵌入式硬件·51单片机·语音识别
创界工坊工作室6 小时前
55-基于STC89C52宠物智能饲喂控制系统设计
stm32·单片机·嵌入式硬件·51单片机·proteus·宠物
极客 - L U9 小时前
卡尔曼滤波从零到精通
c语言·数据结构·单片机·嵌入式硬件·mcu
AMASENSYS艾马斯10 小时前
变频器滤波器选型与EMC合规建议
驱动开发·单片机·其他·硬件工程·精益工程
码小文11 小时前
CAM350使用笔记(6)---Gerber文件铺铜间距检查
嵌入式硬件·cam350软件·cam350使用笔记
Zw-awa12 小时前
编译器工具链:GCC、Clang、MSVC、ICC、armclang
stm32
Yiran_G12 小时前
双频 Wi-Fi 6 + 蓝牙 5.4:无声讯通 WS8712 模组的开发与集成要点
网络·嵌入式硬件·物联网·智能家居
凯基迪科技13 小时前
STM32G系列(G0/G4)芯片解密程序提取RDP读保护解析
网络·stm32·安全
光子物联单片机13 小时前
ESP32传感器模块编程实践(一)DIY智能WIFI视频控制小车
嵌入式硬件·esp32·智能硬件·硬件
2501_9226395813 小时前
率能半导体 SS6628E直流双向马达驱动芯片:20V/7A,覆盖电子锁、玩具、无线充电、机器人四大应用场景
单片机·嵌入式硬件·硬件工程