STM32H7 LL库 串口+DMA 实现空闲中断接收数据
·
(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); //等待下次接收
}
}
更多推荐



所有评论(0)