• 大小: 110KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-01
  • 语言: 其他
  • 标签: STM32F429  HAL  USART  DMA  

资源简介

天下文章一般抄,只能靠自己实践。本代码用于STM32F429,使用HAL库版本:STM32Cube_FW_F4_V1.11.0。精简其他不需要的程序段,只留c和h文件,直接添加可用,已测试过。

资源截图

代码片段和文件信息

#include “BSP_USARTDMA.h“

//stm32f4xx_hal_conf.h文件中修改启用  #define HAL_UART_MODULE_ENABLED
//stm32f4xx_hal_conf.h文件中修改启用  #define HAL_DMA_MODULE_ENABLED

/*
1、STM32F429有2个DMA控制器(DMA1和DMA2)每个控制器有8个数据流,每个数据流有8个通道(请求)。
2、支持外设到存储器、存储器到外设、存储器到存储器传输的常规通道。(仅DMA2支持存储器到存储器的传输)
*/

UART_HandleTypeDef UARTDMA_HD;
DMA_HandleTypeDef UARTDMATX_HD;
DMA_HandleTypeDef UARTDMARX_HD;

uint8_t RX_BUF[RXBUF_SIZE];
volatile uint8_t RX_OK = 0;
volatile uint16_t RX_CNT = 0;

//初始化
void _BSP_USARTDMA_Configuration(uint32_t bRate)
{
  UARTDMA_HD.Instance = USARTx_NUM;                  //串口编号
  UARTDMA_HD.Init.BaudRate = bRate;                  //波特率
  UARTDMA_HD.Init.WordLength = UART_WORDLENGTH_8B;   //字长为8位格式
  UARTDMA_HD.Init.StopBits = UART_STOPBITS_1;        //一个停止位
  UARTDMA_HD.Init.Parity = UART_PARITY_NONE;         //无奇偶校验位
  UARTDMA_HD.Init.HwFlowCtl = UART_HWCONTROL_NONE;   //无硬件流控制
  UARTDMA_HD.Init.Mode = UART_MODE_TX_RX;            //全双工收发模式
  UARTDMA_HD.Init.OverSampling = UART_OVERSAMPLING_16;   //16倍过采样获取更好的容错性
  HAL_UART_Init(&UARTDMA_HD);                        //内部调用__HAL_UART_ENABLE(handler);函数
    
  __HAL_UART_ENABLE_IT(&UARTDMA_HD UART_IT_IDLE);   //开启IDLE中断,以帧方式接收不定长数据
  __HAL_DMA_ENABLE_IT(&UARTDMATX_HD DMA_IT_TC);     //开启DMA传输完成中断
  __HAL_DMA_ENABLE_IT(&UARTDMARX_HD DMA_IT_TC);
  HAL_UART_Receive_DMA(&UARTDMA_HD RX_BUF RXBUF_SIZE);
}

//调用初始化函数HAL_UART_Init时,会先调用MSP初始化回调函数,进行引脚配置和NVIC配置
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
  //GPIO端口设置
  GPIO_InitTypeDef GPIO_InitStructure;

  if(huart->Instance == USART1)     //如果是串口1,进行串口1 MSP初始化
  {
    __HAL_RCC_GPIOA_CLK_ENABLE();     //使能GPIOA时钟
    __HAL_RCC_USART1_CLK_ENABLE();    //使能USART1时钟
    __HAL_RCC_DMA2_CLK_ENABLE();      //DMA2时钟使能

    GPIO_InitStructure.Pin = GPIO_PIN_9 | GPIO_PIN_10; //PA9(USART1_TX)\PA10(USART1_RX)
    GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;              //复用推挽输出
    GPIO_InitStructure.Pull = GPIO_PULLUP;                  //上拉
    GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //高速
    GPIO_InitStructure.Alternate = GPIO_AF7_USART1;         //复用为USART1
    HAL_GPIO_Init(GPIOA &GPIO_InitStructure);              //初始化
        
    //Tx DMA配置
    //数据流选择
    UARTDMATX_HD.Instance = DMA2_Stream7;
    //通道选择
    UARTDMATX_HD.Init.Channel = DMA_CHANNEL_4;
    //存储器到外设
    UARTDMATX_HD.Init.Direction = DMA_MEMORY_TO_PERIPH;
    //外设非增量模式UART只有一个DR寄存器,地址不能变化
    UARTDMATX_HD.Init.PeriphInc = DMA_PINC_DISABLE;
    //存储器增量模式
    UARTDMATX_HD.Init.MemInc = DMA_MINC_ENABLE;
    //外设数据长度:8位一个字节
    UARTDMATX_HD.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
    //存储器数据长度:8位
    UARTDMATX_HD.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
    //外设普通模式
    UARTDMATX_HD.Init.Mode = DMA_NORMAL;
    //中等优先级
    UARTDMATX_HD.Init.Priority = DMA_PRIORITY_LOW;
    //关闭FIFO
    UARTDMATX_HD.Init.FIFOMode = DMA_FIFOMODE_DISABLE;              
    //FIFO阀值选择
    UARTDMATX_HD.Init.FIFOThres

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       6437  2019-06-03 00:13  USART使用DMA方式收发数据\BSP_USARTDMA.c

     文件        682  2019-06-03 00:06  USART使用DMA方式收发数据\BSP_USARTDMA.h

     文件       1019  2019-06-03 00:19  USART使用DMA方式收发数据\main.c

     文件         92  2019-06-03 00:21  USART使用DMA方式收发数据\readme.txt

     文件     195675  2019-06-03 00:22  USART使用DMA方式收发数据\USART.jpg

     目录          0  2019-06-03 00:22  USART使用DMA方式收发数据

----------- ---------  ---------- -----  ----

               203905                    6


评论

共有 条评论