STM32的串口1发送、接收DMA模式函数配置,已经调试可用,大家可以交流学习下

/**********************************************************************************
**函数名称:void USART1_Config(void)
**函数功能:USART1串口引脚初始化
**输入参数:无
**返回参数:无
**函数调用:内部调用
**********************************************************************************/
static void USART1_Config(void)
{
   GPIO_InitTypeDef GPIO_InitStructure;
   USART_InitTypeDef USART_InitStructure;

RCC_APB2PeriphClockCmd(USART1_RCC | RCC_APB2Periph_USART1, ENABLE);        //打开串口时钟
   
   
   /* USART1 GPIO config */
   /* Configure USART1 Tx (PA.9) as alternate function push-pull */
   GPIO_InitStructure.GPIO_Pin   = USART1_TX;
   GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(USART1_PORT, &GPIO_InitStructure); 
   
   /* Configure USART1 Rx (PA.10) as input floating */
   GPIO_InitStructure.GPIO_Pin  = USART1_RX;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
   GPIO_Init(USART1_PORT, &GPIO_InitStructure);
   
   /* USART1 mode config */
   USART_InitStructure.USART_BaudRate   = BOOTRATE;
   USART_InitStructure.USART_WordLength = USART_WordLength_8b;
   USART_InitStructure.USART_StopBits   = USART_StopBits_1;
   USART_InitStructure.USART_Parity     = USART_Parity_No ;
   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
   USART_InitStructure.USART_Mode       = USART_Mode_Rx | USART_Mode_Tx;
   
   USART_Init(USART1, &USART_InitStructure);

//USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);   //使能串口1中断

USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);            //使能USART1发送DMA请求 
   USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);          //使能USART1接收DMA请求
       
   USART_Cmd(USART1, ENABLE);                                                  //启动串口

}

/**********************************************************************************
**函数名称:void USART1_NVIC_Configuration(void)
**函数功能:USART1串口中断初始化
**输入参数:无
**返回参数:无
**函数调用:内部调用
**********************************************************************************/
static void USART1_NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;

//设置NVIC优先级分组为Group2:0-3抢占式优先级,0-3的响应式优先级
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
        
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;                                      //串口接收中断打开
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = USART1_IRQn_Priority;  //设置中断优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

}

/**********************************************************************************
**函数名称:void USART1_Init(void)
**函数功能:USART1串口初始化
**输入参数:无
**返回参数:无
**函数调用:内部调用
**********************************************************************************/
static void USART1_Init(void)
{
    USART1_Config();                    //USART1引脚功能初始化

USART1_NVIC_Configuration();        //USART1中断初始化
}

/**********************************************************************************
**函数名称:static void DMA1_USART1_TX_Configuration(void)
**函数功能:DMA1_USART1_TX初始化
**输入参数:无
**返回参数:无
**函数调用:外部调用
**********************************************************************************/
static void DMA1_USART1_TX_Configuration(void)
{
    DMA_InitTypeDef DMA_InitStructure;

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);            //开启DMA时钟

/*
         *  DMA设置:
     *  设置DMA源:内存地址&串口数据寄存器地址
     *  方向:内存-->外设
     *  每次传输位:8bit
     *  传输大小DMA_BufferSize=SENDBUFF_SIZE
     *  地址自增模式:外设地址不增,内存地址自增1
     *  DMA模式:一次传输,非循环
     *  优先级:高
         */    
    DMA_DeInit(DMA1_Channel4);                                         //串口1的DMA传输通道是通道4
                                                                                                                                           
    DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART1->DR);     //设置DMA源
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)USART1_SendBuff;           //DMA内存基地址
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;                 //外设作为DMA的目的端
    DMA_InitStructure.DMA_BufferSize = USART1_SENDBUFF_SIZE;           //传输大小
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;   //外设地址不增加
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;            //内存地址自增1
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;                //外设数据宽度8bit
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;                                //内存数据宽度8bit
    DMA_InitStructure.DMA_Mode =  DMA_Mode_Circular;                   //DMA_Mode_Normal(只传送一次), DMA_Mode_Circular (不停地传送)
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;                //(DMA传送优先级为高)
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                                           //非内存到内存
    
        DMA_Init(DMA1_Channel4, &DMA_InitStructure);

DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE);       //使能DMA通道4传输完成中断

}

/**********************************************************************************
**函数名称:static void DMA1_USART1_TX_NVIC_Configuration(void)
**函数功能:DMA中断初始化
**输入参数:无
**返回参数:无
**函数调用:外部调用
**********************************************************************************/
static void DMA1_USART1_TX_NVIC_Configuration(void)
{
   NVIC_InitTypeDef NVIC_InitStructure;
   
   NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;  
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;  
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;  
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
   NVIC_Init(&NVIC_InitStructure);

}

/**********************************************************************************
**函数名称:static void DMA1_USART1_TX_Init(void)
**函数功能:USART1串口初始化
**输入参数:无
**返回参数:无
**函数调用:外部调用
**********************************************************************************/
static void DMA1_USART1_TX_Init(void)
{
           DMA1_USART1_TX_Configuration();

DMA1_USART1_TX_NVIC_Configuration();
}

/**********************************************************************************
**函数名称:static void DMA1_USART1_RX_Configuration(void)
**函数功能:DMA1_RX初始化
**输入参数:无
**返回参数:无
**函数调用:外部调用
**********************************************************************************/
static void DMA1_USART1_RX_Configuration(void)
{        
        DMA_InitTypeDef DMA_InitStructure;

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

DMA_DeInit(DMA1_Channel5);

DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART1->DR;           //DMA外设基地址
        DMA_InitStructure.DMA_MemoryBaseAddr = (u32)USART1_RecvBuff;                    //DMA内存基地址
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                                             //外设作为数据传输的来源
        DMA_InitStructure.DMA_BufferSize = USART1_RECVBUFF_SIZE;                            //DMA缓存大小
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;            //外设地址寄存器不变
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                             //内存地址寄存器递增
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//外设数据宽度8bit 
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;            //内存数据宽度8bit
        DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                                            //循环模式
        DMA_InitStructure.DMA_Priority = DMA_Priority_High;                                //优先级:高
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                                                //非内存到内存

DMA_Init(DMA1_Channel5, &DMA_InitStructure);                                                   //初始化DMA

DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE); //使能DMA通道5传输完成中断
        DMA_Cmd(DMA1_Channel5, ENABLE);                                        //使能DMA通道5

}

/**************************************************************
** 函数名称 :DMA1_USART1_RX_NVIC_Configuration(void)
** 功能说明 :NVIC初始化
** 输入参数 :无
** 输出参数 :无
** 返回参数 :无
** 注    意 :无
***************************************************************/
static void DMA1_USART1_RX_NVIC_Configuration(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel5_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);        
}

/**********************************************************************************
**函数名称:void DMA1_USART1_RX_Init(void)
**函数功能:USART1串口初始化
**输入参数:无
**返回参数:无
**函数调用:外部调用
**********************************************************************************/
static void DMA1_USART1_RX_Init(void)
{
           DMA1_USART1_RX_Configuration();

DMA1_USART1_RX_NVIC_Configuration();
}

/**********************************************************************************
**函数名称:static void DMA1_USART1_Init(void)
**函数功能:DMA1串口初始化
**输入参数:无
**返回参数:无
**函数调用:外部调用
**********************************************************************************/
static void DMA1_USART1_Init(void)
{
           DMA1_USART1_TX_Init();

DMA1_USART1_RX_Init();
}

/**********************************************************************************
**函数名称:void USART1_Send_Buf(u8 *buf , unsigned int len)
**函数功能:通过DMA发送串口数据
**输入参数:data -- 发送数据
**返回参数:0--发送不成功
**          1--发送成功
**函数调用:外部调用
**********************************************************************************/
void USART1_Send_Buf(u8 *buf , unsigned int len)
{
        DMA_InitTypeDef DMA_InitStructure;

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);            //开启DMA时钟

/*
         *  DMA设置:
     *  设置DMA源:内存地址&串口数据寄存器地址
     *  方向:内存-->外设
     *  每次传输位:8bit
     *  传输大小DMA_BufferSize=SENDBUFF_SIZE
     *  地址自增模式:外设地址不增,内存地址自增1
     *  DMA模式:一次传输,非循环
     *  优先级:高
         */    
    DMA_DeInit(DMA1_Channel4);                                         //串口1的DMA传输通道是通道4
                                                                                                                                           
    DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART1->DR);     //设置DMA源
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)buf;                               //DMA内存基地址
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;                 //外设作为DMA的目的端
    DMA_InitStructure.DMA_BufferSize = len;                            //传输大小
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;   //外设地址不增加
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;            //内存地址自增1
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;                //外设数据宽度8bit
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;                                //内存数据宽度8bit
    DMA_InitStructure.DMA_Mode =  DMA_Mode_Normal;                     //DMA_Mode_Normal(只传送一次), DMA_Mode_Circular (不停地传送)
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;                //(DMA传送优先级为高)
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                                           //非内存到内存
    
        DMA_Init(DMA1_Channel4, &DMA_InitStructure);

DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE);       //使能DMA通道4传输完成中断 
                                      
        DMA_Cmd(DMA1_Channel4, ENABLE);
         
}

stm32 DMA 配置 串口程序相关推荐

  1. stm32之配置串口中断服务函数

    在学习51单片机的时候,配置串口中断服务函数,只需要查看串口中断的中断号,然后在编写中断服务函数的时候,在函数名后面加上中断号.而在stm32中,中断的数量较多,对于中断的管理也会稍微复杂一点,而且中 ...

  2. STM32寄存器配置USART1串口及USART->BRR值的计算

    STM32寄存器配置串口USART1及USART->BRR值的计算 main.c #include "stm32f10x.h" // Device header #inclu ...

  3. STM32使用DMA从串口读可变长度数据到内存

    首先要解决DMA怎么知道要接收的数据何时开始,何时结束的问题.而且每次传输完数据,要改变下一次数据长度. 如果把DMA设成循环模式肯定是不行的,所以把DMA设置成正常模式. STM32的串口有监测总线 ...

  4. STM32的USART串口通讯程序

    文章目录 一.STM32 USART串口通信 1.串口通信简介 1.1.物理层 1.2.协议层 2.STM32 的 USART 简介 二.STM32的USART串口通讯程序 1.创建项目 2.添加.s ...

  5. STM32学习之串口采用DMA收发数据:需要利用状态机加DMA加串口

    写在前面 在学习这一节知识点的时候,真的是感觉太抽象了,没有一个合适的视频讲的我有那种豁然开朗的感觉,直到我看到了这篇文章,大家可以去看看,里面的描述特别形象. 链接:https://blog.csd ...

  6. STM32使用DMA从串口读数据到内存

    使用DMA从串口读数据到内存和从内存搬数据到串口一样,只是要注意所使用的DMA通道不一样. 当配置好后,如果串口上有数据传输,DMA就自动把数据搬到内存中. 当工作在正常模式,DMA搬运了设定长度的数 ...

  7. STM32 HAL库 串口DMA(收发)和STM32串口中断接收(接收时间管理机制)+ESP8266 wifi模组通信问题

    一.HAL库 串口 DMA+ESP8266模组通信问题 用STM32 HAL库串口的DMA发送和空闲中断接收处理数据,单片机发送AT指令给ESP8266 wifi模组问题:单片机连续几次给wifi模组 ...

  8. STM32使用DMA发送串口数据

    1.概述 上一篇文章<STM32使用DMA接收串口数据>讲解了如何使用DMA接收数据,使用DMA外设和串口外设,使用的中断是串口空闲中断.本篇文章主要讲解使用DMA发送数据,不会讲解基础的 ...

  9. STM32使用DMA接收串口数据

    目录 01.概述 02.DMA接收 03.中断 04.代码 01.概述 在之前的文章里<STM32串口详解>和<STM32 DMA详解>文章中,详细讲解了STM32的串口和DM ...

最新文章

  1. numpy 数组合并
  2. 105、Replicated Mode VS Global Mode (Swarm12)
  3. 将ResultSet转为List
  4. Leetcode 252, 253. Meeting Rooms
  5. WIN10 右键 powershell 修改
  6. Go 语言 cannot find module providing package github.com/
  7. 计算机视觉与深度学习 | SLAM综述(自主移动机器人同时定位与地图创建)
  8. OData API 和 Restful API 这两个概念的区别和联系
  9. QT操作sqlite概念
  10. 面试题 为什么用线程池?解释下线程池参数
  11. 单行溢出文字省略号显示(HTML、CSS)
  12. 喜马拉雅音频批量下载源码
  13. 我们什么都没有,只有爱
  14. 【加法器】——模拟电路设计简单的二进制数加法器
  15. 钠离子电池翻红:“锂焦虑”之下的望梅止渴
  16. 阿里云账号登录名修改方法(图文详解)
  17. 3d Max人物动画学习笔记(二)蒙皮
  18. Linux强制修改root用户密码
  19. 【汇正财经】股权结构有哪些分类?
  20. CopyWebpackPlugin的ignore

热门文章

  1. 7 Steps for becoming Deep Learning Expert
  2. 《漫画算法》源码整理-1 时间复杂度 空间复杂度
  3. ThreadLocal源码剖析
  4. 中科大刘和刚老师的计算机图形学资料 for students
  5. 用Maven构建Mahout项目
  6. Vim 实用技术,第 2 部分: 常用插件
  7. 算法时间复杂度分析基础
  8. Python基础教程(一):简介、环境搭建、中文编码
  9. Hadoop Shell命令
  10. 【caffe】使用draw_net绘制net结构