OpenEdv-开源电子网

标题: 阿波罗H743串口DMA接收及发送+空闲中断 [打印本页]

作者: 翼行园子    时间: 2019-5-9 16:38
标题: 阿波罗H743串口DMA接收及发送+空闲中断
定义两个BUF 一个用于接收:uint8_t rx_buffer[100];
                    一个用于发送:uint8_t tx_buffer[10] = {"ALIENTEK\r\n"};

然后就是配置DMA H7有个优点就是,STM32H7 的 DMA 配置更加灵活,无需固定通道对应固定外设请求,可以随意设置
[mw_shl_code=c,true]void MYDMA_Config(void)
{
        __HAL_RCC_DMA2_CLK_ENABLE();//DMA2时钟使能       
       
        HAL_NVIC_SetPriority(DMA2_Stream7_IRQn,0,0);
        HAL_NVIC_EnableIRQ(DMA2_Stream7_IRQn);
       
        HAL_NVIC_SetPriority(DMA2_Stream6_IRQn,0,0);
        HAL_NVIC_EnableIRQ(DMA2_Stream6_IRQn);
       
        //Tx DMA配置
        UART1TxDMA_Handler.Instance=DMA2_Stream7;                            //数据流选择
        UART1TxDMA_Handler.Init.Request=DMA_REQUEST_USART1_TX;                                //USART1发送DMA
        UART1TxDMA_Handler.Init.Direction=DMA_MEMORY_TO_PERIPH;             //存储器到外设
        UART1TxDMA_Handler.Init.PeriphInc=DMA_PINC_DISABLE;                 //外设非增量模式
        UART1TxDMA_Handler.Init.MemInc=DMA_MINC_ENABLE;                     //存储器增量模式
        UART1TxDMA_Handler.Init.PeriphDataAlignment=DMA_PDATAALIGN_BYTE;    //外设数据长度:8位
        UART1TxDMA_Handler.Init.MemDataAlignment=DMA_MDATAALIGN_BYTE;       //存储器数据长度:8位
        UART1TxDMA_Handler.Init.Mode=DMA_NORMAL;                            //外设流控模式
        UART1TxDMA_Handler.Init.Priority=DMA_PRIORITY_MEDIUM;               //中等优先级
        UART1TxDMA_Handler.Init.FIFOMode=DMA_FIFOMODE_DISABLE;              
        UART1TxDMA_Handler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;      
        UART1TxDMA_Handler.Init.MemBurst=DMA_MBURST_SINGLE;                 //存储器突发单次传输
        UART1TxDMA_Handler.Init.PeriphBurst=DMA_PBURST_SINGLE;              //外设突发单次传输
        HAL_DMA_DeInit(&UART1TxDMA_Handler);   
        HAL_DMA_Init(&UART1TxDMA_Handler);
        __HAL_LINKDMA(&UART1_Handler,hdmatx,UART1TxDMA_Handler);    //将DMA与USART1联系起来(发送DMA)
       
        //Rx DMA配置
        UART1RxDMA_Handler.Instance=DMA2_Stream6;                            //数据流选择
        UART1RxDMA_Handler.Init.Request=DMA_REQUEST_USART1_RX;
        UART1RxDMA_Handler.Init.Direction=DMA_PERIPH_TO_MEMORY;             //外设到存储器
        UART1RxDMA_Handler.Init.PeriphInc=DMA_PINC_DISABLE;                 //外设非增量模式
        UART1RxDMA_Handler.Init.MemInc=DMA_MINC_ENABLE;                     //存储器增量模式
        UART1RxDMA_Handler.Init.PeriphDataAlignment=DMA_PDATAALIGN_BYTE;    //外设数据长度:8位
        UART1RxDMA_Handler.Init.MemDataAlignment=DMA_MDATAALIGN_BYTE;       //存储器数据长度:8位
        UART1RxDMA_Handler.Init.Mode=DMA_NORMAL;                            //外设流控模式
        UART1RxDMA_Handler.Init.Priority=DMA_PRIORITY_MEDIUM;               //中等优先级
        UART1RxDMA_Handler.Init.FIFOMode=DMA_FIFOMODE_DISABLE;              
        UART1RxDMA_Handler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;      
        UART1RxDMA_Handler.Init.MemBurst=DMA_MBURST_SINGLE;                 //存储器突发单次传输
        UART1RxDMA_Handler.Init.PeriphBurst=DMA_PBURST_SINGLE;              //外设突发单次传输
        HAL_DMA_DeInit(&UART1RxDMA_Handler);   
        HAL_DMA_Init(&UART1RxDMA_Handler);
        __HAL_LINKDMA(&UART1_Handler,hdmarx,UART1RxDMA_Handler);    //将DMA与USART1联系起来(接收DMA)
} [/mw_shl_code]


接下来是串口空闲中断部分代码:[mw_shl_code=c,true]                        tmp_flag =__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_IDLE); //获取IDLE标志位
                        if((tmp_flag != RESET))//idle标志被置位
                        {
                                recv_end_flag = 1;  // 接收完成标志置1
                                __HAL_UART_CLEAR_IDLEFLAG(&UART1_Handler);  //清除标志位
                                 HAL_UART_DMAStop(&UART1_Handler);                     //先停止DMA,暂停接收   
                                temp  =  __HAL_DMA_GET_COUNTER(&UART1RxDMA_Handler);// 获取DMA未传输个数                     
                                rx_len =  BUFFER_SIZE - temp; //总数减去未传输个数,得到已接收数据的个数
                                         
                                HAL_UART_Receive_DMA(&UART1_Handler,rx_buffer,BUFFER_SIZE);//重新打开DMA接收
                        }[/mw_shl_code]

当从串口调试助手网串口一发送数据时会进入空闲中断 之后将串口数据通过dma往前面定义的一个接收rx_buffer里效果如图:

(, 下载次数: 1)