用LL库和hal库分别配置了一遍串口接收,可是接收的数据都一样,和正确的差几位,困扰了很长时间,求助! 这是错误的数据 这是应该接收到的数据 这是配置函数和中断函数 用的是不定长中断 uint8_t USART1_DMA_RX_BUF[BSP_USART1_DMA_RX_BUF_LEN];//定义一个数组用于存放从DMA接收到的遥控器数据 void USART1_Init(void) { LL_USART_InitTypeDef USART_InitStruct; LL_GPIO_InitTypeDef GPIO_InitStruct; /* Peripheral clock enable */ LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOB); LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_USART1); LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_DMA2); /**USART1 GPIO Configuration PB7 ------> USART1_RX PB6 ------> USART1_TX */ GPIO_InitStruct.Pin = LL_GPIO_PIN_7|LL_GPIO_PIN_6; GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; GPIO_InitStruct.Pull = LL_GPIO_PULL_UP; GPIO_InitStruct.Alternate = LL_GPIO_AF_7; LL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* USART1_RX Init */ USART_InitStruct.BaudRate = 100000; USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B; USART_InitStruct.StopBits = LL_USART_STOPBITS_1; USART_InitStruct.Parity = LL_USART_PARITY_EVEN; //偶校验 USART_InitStruct.TransferDirection = LL_USART_DIRECTION_RX; USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE; USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16; LL_USART_Init(USART1, &USART_InitStruct); LL_USART_ConfigAsyncMode(USART1); LL_USART_Enable(USART1); /* USART1 DMA Init */ LL_DMA_SetChannelSelection(DMA2, LL_DMA_STREAM_2, LL_DMA_CHANNEL_4); LL_DMA_SetDataTransferDirection(DMA2, LL_DMA_STREAM_2, LL_DMA_DIRECTION_PERIPH_TO_MEMORY); LL_DMA_SetStreamPriorityLevel(DMA2, LL_DMA_STREAM_2, LL_DMA_PRIORITY_HIGH); LL_DMA_SetMode(DMA2, LL_DMA_STREAM_2, LL_DMA_MODE_NORMAL); LL_DMA_SetPeriphIncMode(DMA2, LL_DMA_STREAM_2, LL_DMA_PERIPH_NOINCREMENT); LL_DMA_SetMemoryIncMode(DMA2, LL_DMA_STREAM_2, LL_DMA_MEMORY_INCREMENT); LL_DMA_SetPeriphSize(DMA2, LL_DMA_STREAM_2, LL_DMA_PDATAALIGN_BYTE); LL_DMA_SetMemorySize(DMA2, LL_DMA_STREAM_2, LL_DMA_MDATAALIGN_BYTE); LL_DMA_DisableFifoMode(DMA2, LL_DMA_STREAM_2); LL_DMA_SetPeriphAddress(DMA2, LL_DMA_STREAM_2, (u32)&USART1->DR); //配置外设地址 LL_DMA_SetMemoryAddress(DMA2, LL_DMA_STREAM_2, (u32)USART1_DMA_RX_BUF); //配置memory的地址 LL_DMA_SetDataLength(DMA2, LL_DMA_STREAM_2, BSP_USART1_DMA_RX_BUF_LEN); //大小要配合定义的数组类型 LL_USART_EnableDMAReq_RX(USART1); //发送DMA请求 通过控制usart_cr3寄存器使用dma传送 LL_USART_EnableIT_IDLE(USART1); //使能空闲中断 LL_DMA_DisableStream(DMA2, LL_DMA_STREAM_2); //失能数据流 while(LL_DMA_IsEnabledStream(DMA2, LL_DMA_STREAM_2) != 0); //等待是否清空 LL_DMA_EnableStream(DMA2, LL_DMA_STREAM_2); //使能数据流 } void USART1_IRQHandler(void) { if(LL_USART_IsActiveFlag_IDLE(USART1) != 0) { uint32_t this_time_rx_len = 0;//本次接收长度 = 0; LL_USART_ClearFlag_IDLE(USART1);//清空SR寄存器 先清SR才能//清空DR寄存器 LL_DMA_DisableStream(DMA2, LL_DMA_STREAM_2); //失能数据流 LL_DMA_ClearFlag_TC2(DMA2);//清除DMA相关标志位 LL_DMA_ClearFlag_HT2(DMA2); LL_USART_DisableDMAReq_RX(USART1); // this_time_rx_len = BSP_USART1_DMA_RX_BUF_LEN - LL_DMA_GetDataLength(DMA2, LL_DMA_STREAM_2); //获取这一次数据量大小(总长度-保留的长度) LL_DMA_SetDataLength(DMA2, LL_DMA_STREAM_2, BSP_USART1_DMA_RX_BUF_LEN); LL_DMA_SetMemoryAddress(DMA2, LL_DMA_STREAM_2, (u32)USART1_DMA_RX_BUF); //配置memory的地址 while(LL_DMA_IsEnabledStream(DMA2, LL_DMA_STREAM_2) != 0); //等待是否清空 LL_DMA_EnableStream(DMA2, LL_DMA_STREAM_2); //使能数据流 LL_USART_EnableDMAReq_RX(USART1); // } } |
楼主那个非标的波特率100000貌似应该改成国际标准值。举例使用115200比100000误码率要低很多的。
评分
查看全部评分