|

楼主 |
发表于 2021-9-9 17:04:54
|
显示全部楼层
/*
*********************************************************************************************************
* 函 数 名: MYDMA_Config
* 功能说明: DMA初始化配置函数
* 形 参:DMA_Streamx_tx MA发送数据流,DMA_Streamx_rx MA接收数据流
* 返 回 值: 无
*********************************************************************************************************
*/
void MYDMA_Config(DMA_Stream_TypeDef *DMA_Streamx_tx,DMA_Stream_TypeDef *DMA_Streamx_rx)
{
__HAL_RCC_DMA2_CLK_ENABLE();//DMA2时钟使能
/* USART1 DMA Init */
//Tx DMA配置
UART1TxDMA_Handler.Instance=DMA_Streamx_tx; //数据流选择
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_LINKDMA(&UART1_Handler,hdmatx,UART1TxDMA_Handler); //将发送DMA与USART1联系起来(发送DMA)
/* USART1_RX Init */
UART1RxDMA_Handler.Instance = DMA_Streamx_rx;
UART1RxDMA_Handler.Init.Request=DMA_REQUEST_USART1_RX; //USART1接收DMA
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; //禁止FIFO
UART1RxDMA_Handler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL; //禁止FIFO此位不起作用,用于设置阀值
UART1RxDMA_Handler.Init.MemBurst=DMA_MBURST_SINGLE; //禁止FIFO此位不起作用,存储器突发单次传输
UART1RxDMA_Handler.Init.PeriphBurst=DMA_PBURST_SINGLE; //禁用FIFO此位不起作用,外设突发单次传输
__HAL_LINKDMA(&UART1_Handler,hdmarx,UART1RxDMA_Handler); //将接收DMA与USART1联系起来(接收DMA)
/* 设置DMA接收中断 */
HAL_DMA_RegisterCallback(&UART1TxDMA_Handler, HAL_DMA_XFER_CPLT_CB_ID, HAL_UARTDMA_TxCpltCallback);
HAL_DMA_DeInit(&UART1TxDMA_Handler);
HAL_DMA_DeInit(&UART1RxDMA_Handler);
HAL_DMA_Init(&UART1TxDMA_Handler);
HAL_DMA_Init(&UART1RxDMA_Handler);
/* DMA interrupt init */
/* DMA2_Stream6_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA2_Stream6_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA2_Stream6_IRQn);
/* DMA2_Stream7_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA2_Stream7_IRQn, 0, 1);
HAL_NVIC_EnableIRQ(DMA2_Stream7_IRQn);
}
/*
*********************************************************************************************************
* 函 数 名: HAL_UARTDMA_TxCpltCallback
* 功能说明: DMA模式串口中断的发送完成回调函数。
* 形 参:UartHandle,UART_HandleTypeDef结构体变量
* 返 回 值: 无
*********************************************************************************************************
*/
void HAL_UARTDMA_TxCpltCallback(DMA_HandleTypeDef *_hdma)
{
/*无效*/
}
void DMA2_Stream6_IRQHandler(void) //DMA接收
{
HAL_DMA_IRQHandler(&UART1RxDMA_Handler);
}
/**
* @brief This function handles DMA1 stream1 global interrupt.
*/
void DMA2_Stream7_IRQHandler(void) //DMA发送
{
HAL_DMA_IRQHandler(&UART1TxDMA_Handler);
if(__HAL_DMA_GET_FLAG(&UART1TxDMA_Handler,DMA_FLAG_TCIF3_7) != RESET)
{
__HAL_DMA_CLEAR_FLAG(&UART1TxDMA_Handler,DMA_FLAG_TCIF3_7); //清除DMA2_Steam7传输完成标志
HAL_UART_DMAStop(&UART1_Handler); //传输完成以后关闭串口DMA
}
if(__HAL_DMA_GET_FLAG(&UART1TxDMA_Handler,DMA_FLAG_TEIF3_7) != RESET)
{
__HAL_DMA_CLEAR_FLAG(&UART1TxDMA_Handler,DMA_FLAG_TEIF3_7); //清除错误标志位
}
}这个是DMA部分的配置 串口DMA模式配合空闲中断 |
|