OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3618|回复: 0

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

[复制链接]
回帖奖励 5 金钱 回复本帖可获得 5 金钱奖励! 每人限 1 次

2

主题

2

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2018-5-4
在线时间
7 小时
发表于 2018-5-31 09:33:12 | 显示全部楼层 |阅读模式
本帖最后由 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;//设置字体为蓝色
    //显示提示信息        
        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接收,待续





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

6.66 MB, 下载次数: 136

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-5 12:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表