/*
* 函数名:USART1_DMA_Config
* 描述  :串口1的DMA 的初始化配置
* 输入  :无
* 输出  : 无
* 调用  :在USART1_INIT()中被调用
*/
void USART1_DMA_Config(void)
{
    DMA_InitTypeDef DMA_InitStructure;         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);        //开启DMA时钟 //配置串口1发送DMA
         DMA_DeInit(DMA1_Channel4);
        /*设置DMA源:内存地址&串口数据寄存器地址*/
    DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;                   /*内存地址(要传输的变量的指针)*/
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)Txd1Buffer;         //发送的内存地址任意,请参考发送函数
       
        /*方向:从内存到外设*/               
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;       
       
        /*传输大小DMA_BufferSize=0*/       
    DMA_InitStructure.DMA_BufferSize = 0;                     //发送的数据个数任意,请参考发送函数
       
        /*外设地址不增*/            
    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;         
       
        /*DMA模式:一次传输,循环*/
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;         
       
        /*优先级:中*/       
    DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;  //DMA_Priority_VeryHigh;
       
        /*禁止内存到内存的传输        */
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;     DMA_Init(DMA1_Channel4, &DMA_InitStructure);
               
        /*配置DMA1的4通道*/                     
        DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);   //配置DMA发送完成后产生中断
        DMA_Cmd (DMA1_Channel4,DISABLE); //配置串口1接收DMA         /*设置DMA源:内存地址&串口数据寄存器地址*/
        DMA_DeInit(DMA1_Channel5);
    DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;                   /*内存地址(要传输的变量的指针)*/
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)Rcv1Buffer;         //接收缓存是固定不变的
       
        /*方向:从内存到外设*/               
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;       
       
        /*传输大小DMA_BufferSize=BUFFSIZE*/       
    DMA_InitStructure.DMA_BufferSize = Rcv1_BUFFSIZE;          //必须这样设置
       
        /*外设地址不增*/            
    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;         
       
        /*DMA模式:一次传输,循环*/
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;                  /*优先级:中*/       
    DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; // DMA_Priority_VeryHigh;
       
        /*禁止内存到内存的传输        */
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
       
        /*配置DMA1的5通道*/                  
    DMA_Init(DMA1_Channel5, &DMA_InitStructure);           
        DMA_ITConfig(DMA1_Channel5,DMA_IT_TC,DISABLE);   //DMA接收不产生中断
        DMA_Cmd (DMA1_Channel5,ENABLE); }
/*
* 函数名:USART1_Send
* 描述  :串口1发送数据函数
* 输入  :要发送数据的首地址,发送数据的个数。发送数据的地址任意,并不用固定为Txd1Buffer
* 输出  : 无
* 举例         :Usart1_Send("Hello word!",11); Usart1_Send(Txd1Buffer,11);
*/ void USART1_Send(uint8_t *pbuffer, uint32_t size)
{
  
   DMA_Cmd (DMA1_Channel4,DISABLE);
   DMA1_Channel4->CMAR =  (u32)pbuffer;
   DMA1_Channel4->CNDTR = size;
   DMA_Cmd (DMA1_Channel4,ENABLE);                                        //使能DMA,开始发送
   Txd1_Flag=1;                                                                                //数据发送中
  // LED1(ON);                                                                                //灯亮
}
/*
* 函数名:USART1_SendOK_IQ
* 描述  :串口1发送数据完毕后,会调用的中断函数,将发送标志置0
* 输入  :无
* 输出  : 无
* 调用         :此函数需在stm32f10x_it.c 的 DMA1_Channel4_IRQHandler()中被调用
*/
void USART1_SendOK_IQ(void)
{
//判断是否为DMA发送完成中断
        if(DMA_GetFlagStatus(DMA1_FLAG_TC4)==SET)
        {  
                DMA_ClearITPendingBit(DMA1_IT_GL4);
                DMA_ClearFlag(DMA1_FLAG_TC4);
                DMA_Cmd (DMA1_Channel4,DISABLE);
                Txd1_Flag = 0;                                                    //数据发送完毕
                //LED关闭   
        //        LED1(OFF);                }
       
}
/*
* 函数名:USART1_INIT
* 描述  :串口1初始化函数,包括引脚配置,串口配置,DMA配置及中断优先级配置
* 输入  :无
* 输出  : 无
*/
void USART1_INIT(void)
{
         USART1_Config();
         USART1_DMA_Config();
         USART1_NVIC_Config();          Rcv1Counter = 0;
         Rcv1_Flag = 0;
         Txd1_Flag = 0;
}

STM32的USART的DMA不定长度收发代码的更多相关文章

  1. STM32基础分析——USART的DMA模式

    有关USART的DMA传输模式,其基本的概念和配置,网上有很多博客和教程都有,这里不再赘述,只是记录一下比较容易忽视而造成调试不通的问题. 1. 串口发送和接收分属两个DMA通道 一般方式操作串口时, ...

  2. STM32CubeMX HAL库串口: 使用DMA数据发送、使用DMA不定长度数据接收

    转载自 https://blog.csdn.net/euxnijuoh/article/details/81638676

  3. STM32的USART DMA传输(转)

    源:STM32的USART DMA传输 问题描述: 我有一个需求,AD采得一定数目的数据之后,由串口DMA发出,由于AD使用双缓冲,所以每次开始DMA的时候都需要重新设置开始的内存地址以及传输的数目( ...

  4. Java 不定长度参数

    在调用某个方法时,若是方法的参数个数事先无法确定该如何处理?例如System.out.printf()方法中并没有办法事先决定要给的参数个数,像是: ? 1 2 3 System.out.printf ...

  5. STM32串行通信USART解说笔记

    STM32串行通信USART程序例举链接:http://blog.csdn.net/dragon12345666/article/details/24883111 1.STM32串行通信USART的相 ...

  6. 关于STM32的I2C硬件DMA实现

    关于STM32的I2C硬件DMA实现 网上看到很多说STM32的I2C很难用,但我觉得还是理解上的问题,STM32的I2C确实很复杂,但只要基础牢靠,并没有想象中的那么困难. 那么就先从基础说起,只说 ...

  7. STM32 HAL库利用DMA实现串口不定长度接收方法

    参考:https://blog.csdn.net/u014470361/article/details/79206352 我这里使用的芯片是 F1 系列的,主要是利用 DMA 数据传输方式实现的,在配 ...

  8. STM32 串口USART DMA方式发送接收数据

    硬件:stm32f103cbt6 软件:STM32F10x_StdPeriph_Lib_V3.5.0 文章目录 头文件 USART3_DR的地址 DMA的通道 DMA的中断 USART接收回调函数 头 ...

  9. STM32CubeMX HAL库串口+DMA数据发送不定长度数据接收

    参考资料:1.ST HAL库官网资料 2.https://blog.csdn.net/u014470361/article/details/79206352#comments 一.STM32CubeM ...

  10. stm32的dma缓冲区长度,,存放数据数组会不会冲掉

随机推荐

  1. vue的表单

    你可以用 v-model 指令在表单控件元素上创建双向数据绑定. 输入框 实例中演示了 input 和 textarea 元素中使用 v-model 实现双向数据绑定: <!DOCTYPE ht ...

  2. ubuntu 20.04 基于kubeadm部署kubernetes 1.22.4集群及部署集群管理工具

    一.环境准备: 集群版本:kubernetes 1.22.4 服务器系统 节点IP 节点类型 服务器-内存/CUP hostname Ubuntu 20.04 192.168.1.101 主节点 2G ...

  3. Spring boot jar包解压后重新压缩命令

    进入解压的目录/demo,运行 jar cvfM0 demo.jar * 压缩后的项目即可运行 参考:https://www.cnblogs.com/liyanbin/p/6088458.html

  4. 11.20 dom 浏览器对象模型

    1.window.open(url,ways) url 是打开的网页地址 ways 打开的方式 _self 2.window.close() 3.浏览器用户信息:Window.navigator 4. ...

  5. iview 自定义指令实现Table左右横向拖拽

    有时候表格内容会很多,需要横向滚动查看右边的内容,又不想到底部拖动滚动条,如果能直接在内容中拖动就好了,这个时候就可以用 vue 的自定义指令来实现了. 为了以后扩展指令方便,创建 directive ...

  6. C# DataTable.Select()根据条件筛选数据

    1.前言: 很多时候我们获取到一个表的时候需要根据表的包含的队列去筛选内容,一般来说可能想到的就是遍历整个表的内容进行条件筛选,但是这种方式增加了代码量且易出错,DataTable.Select()就 ...

  7. (论文笔记)Learning Deep Structured Semantic Models for Web Search using Clickthrough Data

    利用点击数据学习web搜索的深度学习模型   [总结] 该模型可以得到query和item的低维度向量表示,也可以得到二者的余弦语义相似度. 学习过程是通过最大化后验概率的极大似然估计得到的参数.   ...

  8. 【Android异常】关于Notification启动时,startForeground报错

    遇到两个报错: 第一个权限问题报错,好解决 startForeground requires android.permission.FOREGROUND_SERVICE Manifest给下权限就行 ...

  9. div隐藏、显示

    JS隐藏和显示div的方式有两种: 需要注意的是用JS设置div的属性,必须在ccs中设置对应属性,否则报错. 同理可以设置相同class,进行批量设置. display--隐藏后释放占用的页面空间. ...

  10. pycharm debug 等实用功能

    1.debug方法方法一: 1.打断点,代码会运行到断点前一行 2.step over 逐行运行代码 3.鼠标选中带有函数语句的当前行,点击 step into 再点击step over代码会跳转到函 ...