STM32的USART的DMA不定长度收发代码

Posted on 2020-08-12 08:31  单片机人生  阅读(462)  评论(0编辑  收藏  举报
/*
 * 函数名: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;
}

 

Copyright © 2024 单片机人生
Powered by .NET 9.0 on Kubernetes