基于原子UART1DMA例程上修改UART2_DMA发送

2019-07-20 07:54发布

本帖最后由 cepoly 于 2018-5-31 14:10 编辑

基于原子UART1DMA例程上修改UART2_DMA发送
int main(void)
{
        u16 i;
        u8 t=0;
        u8 j,mask=0;
        float pro=0;                    //进度
    HAL_Init();                     //初始化HAL库   
    Stm32_Clock_Init(360,25,2,8);   //设置时钟,180Mhz
    delay_init(180);                //初始化延时函数
    uart_init(115200);              //初始化USART
          uart2_init(115200);
    LED_Init();                     //初始化LED
    KEY_Init();                     //初始化按键
    SDRAM_Init();                   //初始化SDRAM
    LCD_Init();                     //初始化LCD

    MYDMA_Config(DMA1_Stream6,DMA_CHANNEL_4);//初始化DMA
    POINT_COLOR=RED;
        LCD_ShowString(30,50,200,16,16,"Apollo STM32F4/F7");        
        LCD_ShowString(30,70,200,16,16,"DMA TEST");        
        LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
        LCD_ShowString(30,110,200,16,16,"2016/1/24");         
        LCD_ShowString(30,130,200,16,16,"KEY0:Start");         
        POINT_COLOR=BLUE;//设置字体为蓝 {MOD}
    //显示提示信息        
        j=sizeof(TEXT_TO_SEND);           
        for(i=0;i<SEND_BUF_SIZE;i++)//填充ASCII字符集数据
    {
                if(t>=j)//加入换行符
                {
                        if(mask)
                        {
                                SendBuff=0x0a;
                                t=0;
                        }else
                        {
                                SendBuff=0x0d;
                                mask++;
                        }        
                }else//复制TEXT_TO_SEND语句
                {
                        mask=0;
                        SendBuff=TEXT_TO_SEND[t];
                        t++;
                }              
    }   
        POINT_COLOR=BLUE;//设置字体为蓝 {MOD}         
        i=0;
       while(1)
        {
        t=KEY_Scan(0);
                if(t==KEY0_PRES)  //KEY0按下
                {
                        printf(" DMA DATA: ");            
                        LCD_ShowString(30,150,200,16,16,"Start Transimit....");
                        LCD_ShowString(30,170,200,16,16,"   %") ;     //显示百分号
                        
      MYDMA_USART_Transmit(&UART2_Handler,(u8*)SendBuff,SEND_BUF_SIZE); //启动传输      

                        //  HAL_UART_Transmit_DMA(&UART1_Handler,SendBuff,SEND_BUF_SIZE);
                        //使能串口1的DMA发送 //等待DMA传输完成,此时我们来做另外一些事,点灯
                    //实际应用中,传输数据期间,可以执行另外的任务
                    while(1)
                    {
                                                        if(__HAL_DMA_GET_FLAG(&UART2TxDMA_Handler,DMA_FLAG_TCIF2_6))//等待DMA1_Steam6传输完成
                                                        {
                                                                        __HAL_DMA_CLEAR_FLAG(&UART2TxDMA_Handler,DMA_FLAG_TCIF2_6);//清除DMA1_Steam6传输完成标志
                                                                        HAL_UART_DMAStop(&UART2_Handler);      //传输完成以后关闭串口DMA
                                break;
                                                        }
                                pro=__HAL_DMA_GET_COUNTER(&UART2TxDMA_Handler);//得到当前还剩余多少个数据
                                pro=1-pro/SEND_BUF_SIZE;    //得到百分比         
                                pro*=100;                                  //扩大100倍
                                LCD_ShowNum(30,170,pro,3,16);            
                    }
                        LCD_ShowNum(30,170,100,3,16);//显示100%         
                    LCD_ShowString(30,150,200,16,16,"Transimit Finished!");//提示传送完成
                }
                i++;
                delay_ms(10);
                if(i==20)
                {
                        LED0=!LED0;//提示系统正在运行        
                        i=0;
                }                  
        }
}

红 {MOD}部分代码,我用发送完成中断回调函数来清除DMA1_Steam6传输完成标志及传输完成以后关闭串口DMA

在stm32f4xx_it.c文件中加入
extern DMA_HandleTypeDef  UART2TxDMA_Handler;      //DMA句柄

void DMA1_Stream6_IRQHandler(void)
{
  HAL_DMA_IRQHandler(&UART2TxDMA_Handler);
}

在DMA初始化中加入
HAL_NVIC_SetPriority(DMA1_Stream6_IRQn, 3, 3);
HAL_NVIC_EnableIRQ(DMA1_Stream6_IRQn);

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
    if (huart == &UART2_Handler)
   {
        if(__HAL_DMA_GET_FLAG(&UART2TxDMA_Handler,DMA_FLAG_TCIF2_6))//等待DMA1_Steam6传输完成
        {
                        __HAL_DMA_CLEAR_FLAG(&UART2TxDMA_Handler,DMA_FLAG_TCIF2_6);//清除DMA1_Steam6传输完成标志
                        HAL_UART_DMAStop(&UART2_Handler);      //传输完成以后关闭串口DMA
        }
    }
}


接下来做一个DMA接收,待续





0条回答

一周热门 更多>