金牌会员
 
- 积分
- 2099
- 金钱
- 2099
- 注册时间
- 2017-2-11
- 在线时间
- 306 小时
|
发表于 2020-6-19 11:26:10
|
显示全部楼层
你这是开启DMA发送中断,貌似没啥用处,我也不清楚这个HAL库为啥清除不了。但是我可以给你发个通过查询状态的方式发送DMA,这个我已经调通了。
DMA_HandleTypeDef UART1TxDMA_Handler; //DMA句柄
//DMAx的各通道配置
//这里的传输形式是固定的,这点要根据不同的情况来修改
//从存储器->外设模式/8位数据宽度/存储器增量模式
//DMA_Streamx MA数据流,DMA1_Stream0~7/DMA2_Stream0~7
//chx MA通道选择,@Ref DMA_channel DMA_CHANNEL_0~DMA_CHANNEL_7
void MYDMA2_Config(DMA_Stream_TypeDef *DMA_Streamx,u32 chx)
{
if((u32)DMA_Streamx>(u32)DMA2)//得到当前stream是属于DMA2还是DMA1
{
__HAL_RCC_DMA2_CLK_ENABLE();//DMA2时钟使能
}else
{
__HAL_RCC_DMA1_CLK_ENABLE();//DMA1时钟使能
}
__HAL_LINKDMA(&UART1_Handler,hdmatx,UART1TxDMA_Handler); //将DMA与USART1联系起来(发送DMA)
//Tx DMA配置
UART1TxDMA_Handler.Instance=DMA_Streamx; //数据流选择
UART1TxDMA_Handler.Init.Channel=chx; //通道选择
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_NVIC_SetPriority(DMA2_Stream7_IRQn,3,0); //抢占优先级3,子优先级0
// HAL_NVIC_EnableIRQ(DMA2_Stream7_IRQn); //使能DMA2_Stream7中断通道
}
void DMA2_Init(void)
{
//DMA2,STEAM7,CH4,外设为串口1,存储器为SendBuff,长度为:SEND_BUF_SIZE.
MYDMA2_Config(DMA2_Stream7,DMA_CHANNEL_4);
}
void DMA2_Enable(UART_HandleTypeDef *huart, u8 *pData, u16 Size)
{
HAL_UART_Transmit_DMA(huart,pData,Size);
while(!__HAL_DMA_GET_FLAG(&UART1TxDMA_Handler,DMA_FLAG_TCIF3_7)){};//等待DMA2_Steam7传输完成
__HAL_DMA_CLEAR_FLAG(&UART1TxDMA_Handler,DMA_FLAG_TCIF3_7);//清除DMA2_Steam7传输完成标志
HAL_UART_DMAStop(&UART1_Handler); //传输完成以后关闭串口DMA
}
void DMA2_Stream7_IRQHandler(void)
{
HAL_DMA_IRQHandler(&UART1TxDMA_Handler);
} |
|