基于STM32CubeMX——HAL库开发的串口通讯(DMA模式)

STM32CubeMX配置

首先打开STM32CubeMX选择你开发的芯片型号,这里我选择的是F103R6Tx的芯片。然后第一步选择SYS里面的debug模式,如果用HAL库不进行SWD或JTAG配置,单片机只能进行下载一次程序,要进行第二次或更多次程序下载,需要按复位键(如果你的单片机有复位按键的话),或者用镊子夹住复位线路上的电容使其短路,点击Keil下载,再松开镊子。

在这里插入图片描述然后RCC时钟源选择外部高速时钟,自接外部晶振
在这里插入图片描述然后配置时钟树
在这里插入图片描述然后打开USART1选择异步通讯模式
在这里插入图片描述打开DMA添加,注意RX的DMA传输模式选择为循环模式circular,不然只会接受一次。
在这里插入图片描述如果用DMA方式发送,则需要使能USART1的中断,注意:如果不开启串口中断,则程序只能发送一次数据,程序不能判断DMA传输是否完成,USART一直处于busy状态
在这里插入图片描述这里注意选择环境,且路径不要出现中文名
在这里插入图片描述在这里插入图片描述

相关函数

HAL_UART_Transmit();串口轮询发送数据,使用超时管理机制
HAL_UART_Receive();串口轮询接收数据,使用超时管理机制
HAL_UART_Transmit_IT();串口中断模式发送
HAL_UART_Receive_IT();串口中断模式接收
HAL_UART_Transmit_DMA();串口DMA模式发送
HAL_UART_Receive_DMA();串口DMA模式接收
HAL_UART_DMAPause() 暂停串口DMA
HAL_UART_DMAResume(); 恢复串口DMA
HAL_UART_DMAStop(); 结束串口DMA

重新配置printf与scanf

在 stm32f1xx_hal.c中包含#include <stdio.h>

#include "stm32f1xx_hal.h"
#include <stdio.h>
extern UART_HandleTypeDef huart1;   //声明串口

在 stm32f1xx_hal.c 中重写fget和fput函数

/**
  * 函数功能: 重定向c库函数printf到DEBUG_USARTx
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明:无
  */
int fputc(int ch, FILE *f)
{
    
    
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}
 
/**
  * 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明:无
  */
int fgetc(FILE *f)
{
    
    
  uint8_t ch = 0;
  HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
  return ch;
}

配置代码

在主函数内添加代码

uint8_t buffer[20];
HAL_UART_Transmit_DMA(&huart1,buffer,20);

开启DMA接受,然后在回调函数里面写接受完后需要的操作,例如用DMA发送接收到的数据

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) 
{
    
    
if(huart->Instance == USART1)  //判断是否是串口1接受中断
 {
    
       
      HAL_UART_Transmit_DMA(&huart1,buffer,20);
 }
}

猜你喜欢

转载自blog.csdn.net/lxzdsg/article/details/113101417