[其他ST产品]

STM32CubeMX 真的太好用了

[复制链接]
856|41
手机看帖
扫描二维码
随时随地手机跟帖
lalallalala|  楼主 | 2022-1-28 15:21 | 显示全部楼层 |阅读模式
我需要用的外设有 usb 接口和一个普通的 GPIO,需要使用的中间件库有 FreeRTOS 和 USB_DEVICE,要完成的功能是实现一个虚拟串口,然后适配上 FreeRTOS 的 CLI 制作一个虚拟串口终端,同时让一个 LED 闪烁,这里我选用经典的 STM32F103C8T6 来完成这些。

使用特权

评论回复
lalallalala|  楼主 | 2022-1-28 15:23 | 显示全部楼层
让我们开始吧,

第一步,直接打开 STM32CubeMX,在主界面选到 ACCESS TO MCU SELECTOR 开始一个工程,这里需要注意的一点是此时 STM32CubeMX 会去联网检查一些更新,如果你的防火墙是开的话,很可能会检测失败,关掉防火墙就好。

使用特权

评论回复
lalallalala|  楼主 | 2022-1-28 15:23 | 显示全部楼层
第二步,在 MCU Filters 栏直接输入我们使用的型号,只需要输入 103C8 就找到啦,然后选中它,右边有它的介绍,而且还可以直接下载它的 Datasheet 也不要太方便了,然后点击 Start Project 按钮开始一个工程。

使用特权

评论回复
lalallalala|  楼主 | 2022-1-28 15:25 | 显示全部楼层
第三步,把我们需要的外设和中间件库选上,有 USB 接口,GPIO 接口,FREERTOS 和 USB_DEVICE 的支持,最后如下图:

4310161f39a4c1ad4b.png

使用特权

评论回复
lalallalala|  楼主 | 2022-1-28 15:26 | 显示全部楼层
配置的时候有以下几点要注意的:

1、时钟的配置在 RCC 选项,根据实际情况是选内部 RC 还是外部晶振,外部晶振的话要占用两个引脚,我这里是 8 Mhz 外部晶振,配置如下:

使用特权

评论回复
lalallalala|  楼主 | 2022-1-28 15:28 | 显示全部楼层
9070861f39ac196e36.png

使用特权

评论回复
lalallalala|  楼主 | 2022-1-28 15:29 | 显示全部楼层
2、关于 debug 口子的配置,默认它是认为我们不需要 debug 口的,所以如果不更改的话生成代码下载进去后 debug 口就关闭了,

使用特权

评论回复
lalallalala|  楼主 | 2022-1-28 15:30 | 显示全部楼层
如果你真的不小心 debug 口子被关闭了也不用担心,可以通过如下方法再次下载程序:

按住复位按钮要不要放,然后在 Keil 下点击下载按钮,等它提示错误并说检测到被锁掉 debug 口的片子,然后点击确定的同时,松开复位按钮就可以下载啦,如果不行则再多试几次,时序和时机很重要。
————————————————

使用特权

评论回复
lalallalala|  楼主 | 2022-1-28 15:31 | 显示全部楼层
然后在 SYS 里面选择 debug 工具连接的类型,我这里是 SWD 的方式连接的,选择串行线,如下图:

使用特权

评论回复
lalallalala|  楼主 | 2022-1-28 15:32 | 显示全部楼层
4971661f39bc2e8e9f.png

使用特权

评论回复
lalallalala|  楼主 | 2022-1-28 15:34 | 显示全部楼层
3、由于 STM32CubeMX 使用的 HAL 库有一个 delay 接口默认是使用 SysTick 定时器来实现的,而由于这里我们选用了 FreeRTOS,它使用的心跳时钟在 Cortex 内核上的移植都是依赖于 SysTick 定时器,这里会有冲突,这一点在点击生成代码按钮时 STM32CubeMX 也会发出警告,这里我们为 HAL 库使用的定时器选过一个就可以了,如下图,这里我把它选到了 TIM1,

使用特权

评论回复
lalallalala|  楼主 | 2022-1-28 15:35 | 显示全部楼层
9441861f39cb055c43.png

使用特权

评论回复
lalallalala|  楼主 | 2022-1-28 15:36 | 显示全部楼层
4、由于后续我们还要在 FreeRTOS 上加入许多线程,我们把他的堆大小设置大一点,在 FREERTOS 的 Config parameters 里面的 TOTAL_HEAP_SIZE,这里比较任性,我配置了 1024 字节

第四步,我们再来为 FreeRTOS 上加入一个 LED 闪烁的线程。这里我们选到 FREERTOS 的 Taks and Queues,然后点击 Add 按钮即可添加了,取名为 ledTask。

使用特权

评论回复
lalallalala|  楼主 | 2022-1-28 15:38 | 显示全部楼层
到这里配置工作就差不多了,接下来见证奇迹的时刻到了,点击 GENERATE CODE 然后整个工程就生成了,然后编译下载到板子上,插上电脑,叮咚,成功识别为串口,在 win10 上驱动都不用自己装,





到这里我们的 LED 还是不能闪的,这需要我们加入几条代码,这个简单,找到我们在工具上创建的 ledTask 线程,在线程函数实体里面加入如下代码再编译下载后灯就开始闪了,简单吧。

使用特权

评论回复
lalallalala|  楼主 | 2022-1-28 15:39 | 显示全部楼层
7893861f39d9e13d9c.png

使用特权

评论回复
lalallalala|  楼主 | 2022-1-28 15:40 | 显示全部楼层
我想我的介绍就到这里结束吧,这才简单嘛,哈哈哈,但等等,说好的虚拟终端呢,

那好吧,那我们先再说个注意点,接下来往上加代码的时候,往由工具生成的文件里面加代码一定要加在标注了 USER CODE BEGIN 和 USER CODE END 的注释里面,这样下次更新配置的时候你加的代码才不会消失,自己加入的文件则无所谓。

串口终端我们都上 FreeRTOS 了当然有现成的实现了,这里我们主要做的工作就是把 FreeRTOS 提供的串口终端实现即 CLI ,对接上我们的虚拟串口。

使用特权

评论回复
lalallalala|  楼主 | 2022-1-28 15:40 | 显示全部楼层
第一步,下载 FreeRTOS 的 CLI 扩展库,这里 STM32CubeMX 默认是没有提供的,没关系,我们去 FreeRTOS 的官网下载,注意最好下载当前使用 FreeRTOS 版本对应版本的完整包,然后解压得到 CLI 扩展库加入到我们的工程,同时把它的 Demo 也加进来。

使用特权

评论回复
lalallalala|  楼主 | 2022-1-28 15:41 | 显示全部楼层
第二步,经阅读 CLI 的 Demo 后发现它依赖的如下四个接口我们实现一下就好了。我们要做的内容就是完善这四个接口,把虚拟串口下来的数据传进来,然后把输出传回去。

使用特权

评论回复
lalallalala|  楼主 | 2022-1-28 15:42 | 显示全部楼层
xComPortHandle xSerialPortInitMinimal(int baudRate, int queueLength);

int xSerialGetChar(xComPortHandle xPort, signed char *cRxedChar, int timeout);

int vSerialPutString(xComPortHandle xPort, signed char *pcWelcomeMessage, unsigned short len);

int xSerialPutChar(xComPortHandle xPort, signed char c, int timeout);

使用特权

评论回复
lalallalala|  楼主 | 2022-1-28 15:42 | 显示全部楼层
这里实际上设计是依赖实际的串口的,但没关系我们虚拟的也可以,只要把数据接收发送打通即可。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

82

帖子

0

粉丝