【FreeRTOS快速入门】STM32工程移植指南

目录

一、新建STM32工程

为了示范完整的移植过程,我们从0开始,新建一个标准的STM32点灯工程。

本篇以 CubeMX+Keil 作示范,CubeIDE操作近同,可对比参考。

1、新建工程 

  • 打开CubeMX,选择 芯片型号 新建工程
  • 2、搜索芯片型号

  • 输入芯片型号进行搜索
  • 双击搜索结果中的目标芯片型号,即可进入配置。
  • 技巧提示 (输入框变了粉红色):

    可能是因为前面有空格,或其它非法字符,删除掉就好了。

    3、配置Debug调试方式

  • 新建工程时,养成习惯:先配置Debug选项(调试模式):Serial Wire;
  • 如果没有使能Debug:烧录一次程序后,将关闭调试引功能,无法再烧录、调试;
  • 技巧提示 (忘了使能Debug, 如何解锁):

    没有使能Debug:烧录一次程序后,将关闭调试引功能,无法再烧录;

    这种情况,俗称 “锁芯片”;

    首先,打开工程的CubeMX配置,修改好Debug选项,再次生成,及编译。

    方法1:

        如果是魔女开发板,按着板上的左1按键,不放手,再次烧录,即可解锁。

    方法2:

        Boot0引脚,用杜邦线接3.3V, 重新上电,再次烧录,即可解锁。

    4、选择 晶振源

  • HSE,外部高速时钟源,选择: Crystal/Ceramic Resonator
  • 5、配置 时钟树

  • 下图参数,通用STM32F407xx系列 , 如果你所用芯片不同,注意更换参数
  • 1、3两项,要填写实物晶振值,可以查看晶振上丝印, 也可以查看原理图。
  • 技巧提示 (关于晶振值):

  • 目前市面常用的F1系列开发板,基本用8MHz晶振;
  • 另一种常用的F407系列开发板,常用晶振有8MHz、25MHz两种,区分,修改下图1、2两处即可。        
  • 不同频率的晶振,在F系列上没区别,经倍频等配置后,均可设置为需要系统时钟。
  • 6、配置 LED灯 引脚

    我们增加LED的引脚配置,后面通过代码控制闪烁,验证工程配置的正确性。

    每个开发板上,都会有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、为任务编写执行代码

    (待更新。。。)

    作者:【 STM32开发 】

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【FreeRTOS快速入门】STM32工程移植指南

    发表回复