学习目标
- 熟悉STM32CubeMX配置流程
- 掌握串口发送和接收
- 掌握串口DMA发送和DMA接收
- 掌握printf配置
学习内容
开发流程
- 配置芯片串口功能
- 编写串口代码
- 调试
串口功能配置
串口功能开启

发送功能测试
/* USER CODE BEGIN WHILE */
uint8_t cnt = 0;
while (1)
{
HAL_UART_Transmit(&huart1, &cnt, 1, HAL_MAX_DELAY);
cnt++;
HAL_Delay(1000);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
通过HAL_UART_Transmit
函数发送数据。
中断接收功能测试
/* USER CODE BEGIN WHILE */
HAL_UART_Receive_IT(&huart1, usart1_buffer, USART1_BUFFER_LEN);
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
/* USER CODE BEGIN 0 */
#define USART1_BUFFER_LEN 1
uint8_t usart1_buffer[USART1_BUFFER_LEN];
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
HAL_UART_Transmit(&huart1, (const uint8_t *)usart1_buffer, USART1_BUFFER_LEN, HAL_MAX_DELAY);
// 开启中断接收
HAL_UART_Receive_IT(&huart1, usart1_buffer, USART1_BUFFER_LEN);
}
/* USER CODE END 0 */
printf配置
#include <stdio.h>
int fputc(int ch, FILE* f) {
HAL_UART_Transmit(&huart1, (uint8_t *)&ch,1, 0xFFFF);
return ch;
}
DMA收发
配置

DMA发送
/* USER CODE BEGIN WHILE */
uint8_t cnt = 0;
while (1)
{
HAL_UART_Transmit_DMA(&huart1, &cnt, 1);
cnt++;
HAL_Delay(1000);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
DMA接收
#define USART1_BUFFER_LEN 8
uint8_t usart1_buffer[USART1_BUFFER_LEN];
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
HAL_UART_Transmit_DMA(&huart1, (const uint8_t *)usart1_buffer, USART1_BUFFER_LEN);
// 开启中断接收
HAL_UART_Receive_DMA(&huart1, usart1_buffer, USART1_BUFFER_LEN);
}
练习
- 使用CubeMX配置串口的收发