资深版主
- 积分
- 14287
- 金钱
- 14287
- 注册时间
- 2018-8-3
- 在线时间
- 1147 小时
|
定义两个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里效果如图:
|
|