目录
一、新建STM32工程
为了示范完整的移植过程,我们从0开始,新建一个标准的STM32点灯工程。
(本篇以CubeMX作示范,CubeIDE操作近同,可作对比参考)
1、新建工程
选择 芯片型号 新建工程

2、搜索芯片型号
输入芯片型号进行搜索 (注意:如果输入框为粉红色,可能是因为前面有空格,要删除)双击搜索结果中的目标芯片型号,即可进入配置。

3、配置Debug调试方式
新建工程时,养成习惯:先配置Debug选项(即调试模式);如果没有使能Debug:烧录一次程序后,将关闭调试引功能,无法再烧录(得解锁芯片);

4、选择 晶振源
HSE,外部高速时钟源,选择: Crystal/Ceramic Resonator

5、配置 时钟树
下图参数,通用STM32F407xx系列 ,(更换为你所用芯片的时钟树参数即可通过)。1、3两项,要填写实物晶振值,可以查看晶振上丝印, 也可以查看原理图。目前市面的F407系列开发板,常用晶振有8MHz、25MHz两种,修改下图1、2两处即可。

6、配置 LED灯 引脚
这里,我们增加LED的引脚配置,将用于验证STM32工程配置的正确性。
每个开发板上,都会有LED灯,在调试程序时可以配合作为各种状态指示输出。
小编所用的STM32板子,查得LED原理图如下:
红灯使用PC5、蓝灯使用PB2低电平时通路

依据此图,我们对这两个引脚进行配置:
引脚 PC5,工作模式:GPIO_Output(推出模式),修改别名:LED_RED引脚 PB2,工作模式:GPIO_Output(推出模式),修改别名:LED_BLUE如果希望程序运行后默认为:熄灯,还可以配置:上拉,这样程序运行后电路就是断路状态。


7、工程选项
进入工程管理页面,设置4项:工程名称、存放目录、开发环境、堆栈大小。
目录、名称:重点:不能使用中文!否则无法正常生成。开发环境:选MDK-ARM, 即Keil工程。堆栈大小:都修改成0x1000(或者更大),以适配FreeRTOS、LVGL等移植。

提示:
CubeMX:生成后,工程文件夹,可以复制到其它中文路径下存放,也可以修改成中文的文件夹名称,以便管理。但工程的名称,不能修改!CubeIDE:生成后,工程文件夹,可以复制到其它英文路径下存放。路径、名称都不支持中文。
8、文件选项
这一页,打勾两个选择:
标记2处:只生成需要的库文件(可以有效减少代码体积)。标记3处:为各种外设生成独立c、h文件(不打勾时,外设的初始化代码会堆在main.c中)。

至此,已完成新建工程所需全部配置。
9、生成工程

生成后,弹窗:

小编的习惯:打开文件夹,再手动打开工程。

二、验证工程
这一部分,我们通过编写代码,使LED每500ms闪烁一次,以验证工程的配置是否完整。
1、设置 仿真器 参数
选择 CMSIS DAP打勾自动复位、运行

2、添加LED闪烁代码
很多新手不重视LED,觉得太简单太无聊了,没味道。
请认真看待LED的使用,它是大杀器般的存在。
如,规律地闪烁,可以帮助我们判断:系统时钟是否正常、程序有没有卡死等等。
双击打开main.c在while中的 /* USER CODE BEGIN 3 */ 下方,编写规律闪烁LED的代码,如下:
/** 1ms延时 **/
HAL_Delay(1 - 1); // 延时函数,参数:ms; 注意:CubeMX生成的HAL_Delay(), 函数内部为避免无效操作,会对传入参数+1,因此,如果只需要几ms延时建议传入参数时-1,如果需要大几百ms的非精准延时,那参数不-1也影响不大
/** 每500ms闪烁一次蓝色LED **/
static uint16_t msLED = 0;
if (++msLED == 500) // 每500ms执行一次
{
msLED = 0; // 计数清0
HAL_GPIO_TogglePin(LED_BLUE_GPIO_Port, LED_BLUE_Pin); // 规律地闪烁蓝色LED,方便外部观察系统是否正常运行
}
完成后,是这个样子的:

3、编译
新工程的第一次编译,时间会有点长,大约几十秒。

编译完成后,信息栏的输出,是这个样子:

重点:必须 0 Erros,才能生成烧录文件。
4、 烧录
点击"烧录",下方的烧录进度条,大约要跑10秒左右。
烧录完成后,芯片将会自动复位,运行里面的程序。
如果程序一切正常,这时,我们观察开发板:蓝色LED,将会每0.5秒反转闪烁一次。
至此,我们的STM32点灯工程,已通过验证,可以使用它,进行FreeRTOS的移植了 !
三、移植 FreeRTOS
以前,移植FreeRTOS的底层代码,是需要自己复制、增删、修改代码,很是麻烦,相当耗时。
而现在通过CubeMX、CubeIDE,只需简单地点击,就能自动生成已移植好FreeRTOS的工程。
1、回到图形化配置界面
如果已关闭了CubeMX,双击工程目录下的 ioc 文件再次打开。

2、修改HAL库的时基源
我们先理解两个时基源:FreeRTOS时基源、HAL库时基源。
首先是FreeRTOS的时基源,它将占用Systick定时器,每1ms产生1次计数,用作任务时基。
而CubeMX生成的HAL库代码,也需要一个时基源,也默认使用:SysTick。
HAL库的时基源,很多人以为只是被简单用于延时,如 HAL_Delay();
其实,它还用于HAL库代码中的超时监测等场景中,如:I2C通信的ACK等待超时。
如果上述两者都同时使用SysTick作时基源,潜在一定风险,在生成代码时,会弹窗警告!

所以,为了避免发生冲突,我们需要修改HAL库所用的时基源,使用其它闲置的TIM。
如:TIM7等。

3、使能FreeRTOS

上图中,在选择: CMSIS_V2后,就能使能FreeRTOS,其它参数,默认即可,不作修改。
(后续可以按项目需要进行修改,再生成更新后的配置。)
来到这一步,已完成了FreeRTOS的移植。
......是不是相当的意外,只是打了一个勾,就移植好了,就这么简单!!
4、默认生成的OS任务
(这个小节,原本想示范如何新建一个任务,但为了各篇章的独立,还是把这事独立一篇吧。)
在使能FreeRTOS后,会自动生成一个默认的任务:defaultTasK。
在选项页 "Tasks and Queues" ,可以查看这个任务的参数配置。
具体如下图所示:

这里,也不作任何修改,直接使用默认参数。
5、再次生成工程
(待更新。。。)
6、为任务编写执行代码
(待更新。。。)