基于STM32CubeMX的LL库学习记录(五)USART_DMA_IDLE 串口接收空闲中断接收数据

时间:2024-03-14 15:43:17

管脚图:

基于STM32CubeMX的LL库学习记录(五)USART_DMA_IDLE 串口接收空闲中断接收数据

串口配置:

基于STM32CubeMX的LL库学习记录(五)USART_DMA_IDLE 串口接收空闲中断接收数据

基于STM32CubeMX的LL库学习记录(五)USART_DMA_IDLE 串口接收空闲中断接收数据

主要配置如上;

下面是主要的代码,cubemx的生成文件并未配置DMA接收数据的地址以及长度,还有dma的开关也没有打开,这个要自己写的:

/* USER CODE BEGIN 0 */
uint8_t Usart1_RxBuff[USART1_RXBUFF_SIZE];
__align(8) char Usart1_TxBuff[USART1_TXBUFF_SIZE];

void USART_DMA_CONFIG(void)
{
        LL_DMA_SetPeriphAddress(DMA1, LL_DMA_CHANNEL_5, (uint32_t)(&USART1->DR));// LL_USART_DMA_GetRegAddr(USART1->DR));
        LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_5, (uint32_t)Usart1_RxBuff);
        LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_5, USART1_RXBUFF_SIZE);
      LL_DMA_EnableIT_TC(DMA1, LL_DMA_CHANNEL_5);
        LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_5);
      LL_USART_EnableDMAReq_RX(USART1);
      LL_USART_EnableIT_IDLE(USART1);
 
}

void USART_RxIdleCallback(void)
{
      uint8_t cnt;
        if(LL_USART_IsActiveFlag_IDLE(USART1))
        {
            LL_DMA_DisableChannel(DMA1, LL_DMA_CHANNEL_5); //¹Ø±ÕDMA
        
            cnt = LL_DMA_GetDataLength(DMA1,LL_DMA_CHANNEL_5);
            
          u1_printf("data len is:%d\r\n",USART1_RXBUFF_SIZE-cnt);
          u1_printf("data rx is:%s\r\n",Usart1_RxBuff);
            
            LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_5, USART1_RXBUFF_SIZE);             
            LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_5);
            LL_USART_ClearFlag_IDLE(USART1);    
        }
}

基于STM32CubeMX的LL库学习记录(五)USART_DMA_IDLE 串口接收空闲中断接收数据

稍后上传代码,