STM32CubeMX 串口
我们首先讲串口, 这样之后我们可以使用stm32的串口来输出调试信息或给开发板发送信息。这样操作起来也方便很多。
如何配置晶振这些在这里不再赘述,需要知道的看我之前的博客。
我用的是STM32F103ZET6,使用的是串口一, 外部晶振用的是8M, 芯片主频配置的是72M。配上工程配置页与时钟树。
Figure1工程配置页
Figure2时钟树
我用的都是默认配置,大家可以配置成其他选项试试看。
如果要使用接收中断的话, 记得打开串口中断。
只需要在主函数上写两行代码就完成了串口发送函数(其实一行就可以了,多了一行是延时函数,如果少了这一行串口就会疯狂的往外发送信息)。
HAL_UART_Transmit这个api是stm32cubemx下的串口发送函数,他就四个输入参数:
1, Huart: 串口句柄, 每一个串口的句柄名称都是有stm32cubemx自己生成, 串口1就是huart1, 串口2就是huart2,以此类推
2, pData: 发送字符缓冲区
3, Size: 发送字符长度
4, Timeout: 等待时间(单位是ms)
很多人都喜欢使用 printf 函数, 用这个来输出调试信息会方便很多, 只需要在程序的任意位置(当然不能在函数里面加)加上这一段,就可以使用。
串口接收可以选择中断或者不中断,选择不中断的话,也是只要两行代码就可以完成串口的发生回调。
HAL_UART_Receive这个api是stm32cubemx下的串口接收函数,他也是四个输入参数:
1. Huart: 串口句柄
2. pData: 接收字符缓冲区
3. Size: 接收字符长度
4. Timeout: 等待时间(单位是ms)
如果使用这个api的话程序就会阻塞在这个函数里面, 然后一直到串口完整接收到你想要的字符串长度或者超过等待时间才会退出这个函数,这样可能满足不了大部分的需求,所以我们基本都是使用串口中断函数,代码如下。
HAL_UART_Receive_IT这个api是stm32cubemx下的串口接收中断注册函数,他是三个输入参数:
1. Huart: 串口句柄
2. pData: 接收字符缓冲区
3. Size: 接收字符长度
HAL_UART_RxCpltCallback这个是api是stm32cubemx下的串口接收中断回调函数, 当串口中断并接收完需要长度的串口信息以后就会调用这个函数, 它只有一个形参:
Huart: 串口句柄
这就引入了一个新的问题:如何接收不定长的数据
我们可以将接收的长度调为1,然后进入中断以后用一个数组将数据一个一个存起来,然后开一个定时器将中断时间定为30ms,每接收到一个数据就重启定时器,如果定时器时间到了就说明串口不再收到数据,将这一段数据当作一帧数据来处理。这个程序比较麻烦,简单的语句解决不了,所以等讲完FreeRTOS的软件定时器,我再教大家这个方法
如果有兴趣跟我一起聊技术的话, 可以加我的qq群: 641065525