(1)STM32CubeMx配置:

(2)串口DMA空闲中断接收功能代码实现:

(3)串口DMA发送功能代码实现:

(4)测试代码:

	LL_DMA_SetPeriphAddress(DMA1,LL_DMA_STREAM_0,LL_USART_DMA_GetRegAddr(USART3,LL_USART_DMA_REG_DATA_RECEIVE));
    LL_DMA_SetMemoryAddress(DMA1,LL_DMA_STREAM_0,(uint32_t)buff);
	LL_DMA_SetDataLength(DMA1,LL_DMA_STREAM_0,sizeof(buff));
	LL_DMA_EnableIT_TC(DMA1,LL_DMA_STREAM_0);
	LL_USART_EnableIT_IDLE(USART3);
	LL_USART_EnableDMAReq_RX(USART3);
	LL_DMA_EnableStream(DMA1,LL_DMA_STREAM_0);
	
	LL_DMA_SetPeriphAddress(DMA1,LL_DMA_STREAM_1,LL_USART_DMA_GetRegAddr(USART3,LL_USART_DMA_REG_DATA_TRANSMIT));
	LL_DMA_EnableIT_TC(DMA1,LL_DMA_STREAM_1);
	LL_USART_EnableDMAReq_TX(USART3);
uint8_t buff[100];
void DMA_IRQHandler(void)	
{
	if(LL_DMA_IsActiveFlag_TC0(DMA1))	
	{
		LL_DMA_ClearFlag_TC0(DMA1);	//DMA中断函数里面只清楚中断标准位
	}
	
	if(LL_DMA_IsActiveFlag_TC1(DMA1))
	{
		LL_DMA_ClearFlag_TC1(DMA1); //DMA中断函数里面只清楚中断标准位
	}
}

void USART_IRQHandler(void)
{
	if (LL_USART_IsActiveFlag_IDLE(USART3) && LL_USART_IsEnabledIT_IDLE(USART3)) /*串口空闲回调函数*/
	{
		uint16_t Lenth;
		LL_USART_ClearFlag_IDLE(USART3);
		LL_DMA_DisableStream(DMA1,LL_DMA_STREAM_0);													//使能通道
		
		Lenth = sizeof(buff) - LL_DMA_GetDataLength(DMA1,LL_DMA_STREAM_0);	//获取DMA接收的数据长度
		
		LL_DMA_DisableStream(DMA1,LL_DMA_STREAM_1);													//使能通道
		LL_DMA_SetMemoryAddress(DMA1,LL_DMA_STREAM_1,(uint32_t)buff);				//重新设置地址
		LL_DMA_SetDataLength(DMA1,LL_DMA_STREAM_1,Lenth);										//设置DMA传输长度
		LL_DMA_EnableStream(DMA1,LL_DMA_STREAM_1);													//开启传输
		
		LL_DMA_SetDataLength(DMA1,LL_DMA_STREAM_0,sizeof(buff));						//重新设置地址
		LL_DMA_EnableStream(DMA1,LL_DMA_STREAM_0);													//等待下次接收
	}
}
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐