NucleoF429工程建立与移植FreeRTOS
这一个帖子只讲怎么把FreeRTOS移植到NucleoF429上并运行三个任务,至于FreeRTOS的相关知识,网上也有许多文章和书籍,这里就不讲了(实际原因是我对FreeRTOS也一知半解,希望能和诸位一起讨论学习^_^)
事实上STM32CubeMx的自带了FreeRTOS的模块,只要勾选后进行一些简单的配置,就可以生成可用的工程,所以这一个帖子除了“重新发明轮子”之外,有一点可取之处就是可以理清移植FreeRTOS需要做那些事,不使用STM32CubeMx时或者在其他MCU上移植FreeRTOS该怎么做。
移植分两步:
一、使用F4的固件库建立一个工程模板。
二、在新建的工程上移植FreeRTOS。
在移植之前需要下载F4的固件库,我使用的固件库版本是:【STM32F4xx_DSP_StdPeriph_Lib_V1.7.1】。可以到ST的官网上下载,最新版地址:STM32F4xx_DSP_StdPeriph_Lib_V1.7.1
还需要FreeRTOS的Source Code,我使用的版本是FreeRTOSV8.2.3,FeeRTOS官网: http://www.freertos.org 可自行下载。
第一步:建立工程模板
具体的建立过程和文件夹结构如下:
接下来在各文件中添加对应的文件
和...\Project\STM32F4xx_StdPeriph_Templates中。
在User中建立一个main.c文件,包含stm32f4xx.h即可。
工程需要的文件已添加完成,现在开始建立Keil工程,在建立Keil工程之前,先查看你的Keil是否有STM32F429所需要的库。如图:
如果没有STM32F4的库就需要添加,第一种方式是在这个Pack Installer中添加
第二种是到Keil官网先下载F4 的.Pack文件,再用Pack Installer导入。第一种方式下载速度慢且不支持断点续传,往往下载到一半就提示下载失败,所以推荐第二种方式。Keil的Pack文件下载地址是:http://www.keil.com/dd2/Pack 找到需要的文件下载后再用Pack Installer导入即可。
接下来建立工程:
Project-->New uVision Project 选中NucleoF429_FreeRTOS下的Project文件夹,工程命名为NucleoF429_FreeRTOS 点击保存,在弹出的Select Device窗口选中ST的STM32F429ZITx型号后点击OK
这时会有另一个窗口弹出,不用理会直接OK即可。
按顺序编辑管理结构树:
四个文件中添加的文件为:
Startup:添加文件夹Startup中的.s文件,注意.s默认不会显示出来,在文件类型里选择.s格式
CMSIS:添加文件夹CMSIS中的.c文件。
SysLib:添加文件夹src中的.c文件。
User: 添加文件夹User中的.c文件。
完成后再进行头文件搜索路径设置
注意Define这一栏填写:【USE_STDPERIPH_DRIVER,STM32F429_439xx】
之后再进行一些其他设置:
调试方式选择SWD模式。
到此,基本的设置和建立都已完成,可以进行编译。
但这时候会报 identifier "FSMC_Bank1" is undefined 等30个错误,这是由于STM32F4xx.h中没有定义FSMC_Bank1等,只有FMC_Bank1,不知道这是Bug还是我哪里设置不对,因为现在暂时不用FSMC,所以将stm32f4xx_fsmc.c排除,不进行编译。
具体操作为,在SysLib下找到stm32f4xx_fsmc.c,右键options for file 'stm32f4xx_fsmc.c'
去掉下图中的四个勾,再进行编译就没错了
到此为止,已经建立了一个空白的F429工程模板。
第二步:移植FreeRTOS
1、FreeRTOS下载下来是一个执行文件:
点击运行后会解压出Source Code。我们只是用Source文件夹里的文件。
2、在工程模板文件夹下建立FreeRTOS文件夹,将解压出的Source中的文件全部复制到新建的FreeRTOS中,
3、在Keil工程里添加FreeRTOS需要的文件:
除了FreeRTOS文件夹中的所有.c文件以外,还需要Heap_2.c和Port.c文件,这两个文件分别位于:...FreeRTOS\portable\MemMang和...\FreeRTOS\portable\RVDS\ARM_CM4F 中
除了以上的C文件,还需要一个FreeRTOS的配置头文件,FreeRTOS的自带的Demo中有STM32F407的例程,复制...\FreeRTOSV8.2.3\FreeRTOS\Demo\CORTEX_M4F_STM32F407ZG-SK下的FreeRTOSConfig.h到工程的Include中。
4、添加FreeRTOS的头文件搜索路径。
以上基本完成了移植工作,但还有一些编译错误需要解决,可能是由于版本的原因和移植方式的原因,之前在STM32F103上移植是并没有多少错误,但这次F429上多了一些。
FreeRTOS的一些中断服务程序需要代替F429自带的程序,比如在FreeRTOSConfig.h定义了这三个中断服务程序,就需要把STM32F4xx_it.c中的SVC_Handler()/PendSV_Handler()/SysTick_Handler()这三个程序屏蔽掉,否则会报重复定义错误。(另一中解决办法是修改.s文件中的中断向量表,网上大多数采用这种方法。)
另一类错误就是FreeRTOSConfig.h定义了一些开关量,但实际的程序实现并没有给出,需要用户自己编写,所以我将这些都定义为0,默认不编译。
在FreeRTOS里添加任务之前,需要改一下默认的系统时钟,否则时间不准。在进入main之前,程序默认初始化了系统时钟,都是按照外接25MHz设置到180Mhz的,NucleoF429默认无外接高速晶振,所以要改变分频,在system_stm32F4xx.c 中PLL_M由原来的25为 8即可.
编译无错后,可以添加任务了。
我使用了板子上自带的三个LED,实现不同频率的闪烁。
步骤分别是1、硬件初始化,2、创建任务,3、启动任务序列。
其中,任务的实现为:
FreeRTOS在遇到延时时会自动让出CPU,所以三个任务会轮流执行。GPIOC是为了测量时间。
以上是建立工程和移植FreeRTOS的全部过程。如果里面有错误的地方,欢迎各位留言讨论。
-------------------------------------------------监介的分割线--------------------------------------------------
没错!下面进一段广告!!
众所周知,版主songbin在不久前发起了2016 Computex酷评集赞有奖竞赛 活动,深受欢迎。版主本人也自讨腰包设置了奖品,欢迎各位留言参加。还有一个:中文社区微信交流群
顺便也给自己打个广告,我在酷评集赞中的ID是【xiaoya】。如果我分享的东西对你有所帮助,欢迎你给我点赞,我的评论如下图,感谢!(酷评集赞传送门:戳我)
PS:我的前一片篇博客:NucleoF429 基础应用:TIM1+ADC+USART 波形显示 其中的串口波形显示软件很棒,欢迎下载使用,有什么问题可以留言给我,会及时回复。
PS2:为了方便阅读,移植FreeRTOS的文章(不含广告)已制作成了PDF,Source Code在附件中。