使用软件:STM32CubeMX
keil
首先打开STM32CubeMX,创建一个新的工程项目,我是用的单片机是stm32f108c8t6,创建好项目后,我们就可以设置stm32的引脚和其他选项了。首先点击RCC,将High Speed Clock选择下图中的选项,这个选项是设置系统的时钟。
接着我们可以选择Connectivity选项卡里的USART1,将Mode设置为异步通信(Asynchronous) 。在Parameter Setting选项中我们可以对波特率,字节长度,校验位和停止位进行设置,这里我们使用默认配置。
这里我们使用的是DMA及直接存储器访问,使用这种方式可以大大提高cpu的效率。选择DMA Setting选项,点击Add添加USART1_RX和USART1_TX,其他设置默认。
接着选择NVIC Setting(中断设置),因为在我们完成接收数据后,需要触发一个中断来完成中断事件。本文中这个中断事件是将接受到的数据在通过串口发送出去。完成中断设置只需要在USART1 global interrupt后面的选项打勾就行。
现在看看我们的串口状态,这里的I2C是我用来链接屏幕的,与本次的通信无关。
完成以上的配置后我们就完成了用DMA来接受不定长的数据,接着我们只要对Clock Configuration中的HCLK设置为72就完成了时钟的配置。
接下来我们就将配置好的项目保存,这里我是用keil打开,详细配置见下图。
完成以上步骤后我们就可以进入keil去写代码了。点击Generate Code,我们就可以进入Keil了,进入keil界面后,首先我们需要一个数组变量来接受不定长的数据。
接着我们用HAL_UARTEx_ReceiveToIdle_DMA(&huart1,receiveData,sizeof(receiveData))来接收不定长的数据,相关参数含义可以查询函数定义,这里就不详细介绍了。
当我们收到数据后,会触发一个中断事件来完成相关操作,这里我们是使用void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)函数,详细代码的如下,其含义为通过DMA发送接受的数据,然后进入接受不定长数据的状态。这段代码是中断函数所以在主函数之外。
完成代码后,我们就可以找一个串口助手来测试我们的代码了,这里我是用B站keysking制作的波特律动 串口助手 (keysking.com)来测试。
效果和预期的一样 ,以上就是hal库接收不定长数据的全部内容。