打印

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

[复制链接]
453|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
3月的尾巴|  楼主 | 2018-7-14 16:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基于原子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;//设置字体为蓝色
    //显示提示信息        
        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;//设置字体为蓝色         
        i=0;
       while(1)
        {
        t=KEY_Scan(0);
                if(t==KEY0_PRES)  //KEY0按下
                {
                        printf("\r\nDMA DATA:\r\n");            
                        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;
                }                  
        }
}

红色部分代码,我用发送完成中断回调函数来清除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接收,待续

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

433

主题

433

帖子

0

粉丝