Arm Community
Arm Community
  • Site
  • User
  • Site
  • Search
  • User
  • Groups
    • Research Collaboration and Enablement
    • DesignStart
    • Education Hub
    • Innovation
    • Open Source Software and Platforms
  • Forums
    • AI and ML forum
    • Architectures and Processors forum
    • Arm Development Platforms forum
    • Arm Development Studio forum
    • Arm Virtual Hardware forum
    • Automotive forum
    • Compilers and Libraries forum
    • Graphics, Gaming, and VR forum
    • High Performance Computing (HPC) forum
    • Infrastructure Solutions forum
    • Internet of Things (IoT) forum
    • Keil forum
    • Morello Forum
    • Operating Systems forum
    • SoC Design and Simulation forum
    • 中文社区论区
  • Blogs
    • AI and ML blog
    • Announcements
    • Architectures and Processors blog
    • Automotive blog
    • Graphics, Gaming, and VR blog
    • High Performance Computing (HPC) blog
    • Infrastructure Solutions blog
    • Innovation blog
    • Internet of Things (IoT) blog
    • Operating Systems blog
    • Research Articles
    • SoC Design and Simulation blog
    • Tools, Software and IDEs blog
    • 中文社区博客
  • Support
    • Arm Support Services
    • Documentation
    • Downloads
    • Training
    • Arm Approved program
    • Arm Design Reviews
  • Community Help
  • More
  • Cancel
中文社区
中文社区
中文社区博客 NucleoF429工程建立与FreeRTOS移植
  • Blogs
  • Forum
  • 视频和文件
  • Members
  • Mentions
  • Sub-Groups
  • Tags
  • Jump...
  • Cancel
  • New
中文社区 requires membership for participation - click to join
More blogs in 中文社区
  • ARM中国大学计划博客

  • Arm新闻

  • 中文mbed博客

  • 中文社区博客

  • 恩智浦汽车电子MCU讨论区博客

 

Tags
  • nucleof429
  • freertos
Actions
  • RSS
  • More
  • Cancel
Related blog posts
Related forum threads

NucleoF429工程建立与FreeRTOS移植

Xiaoya
Xiaoya
June 12, 2016
2 minute read time.

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 可自行下载。

第一步:建立工程模板

具体的建立过程和文件夹结构如下:

  1. 新建文件夹NucleoF429_FreeRTOS。
  2. 在NucleoF429_FreeRTOS 下新建三个文件夹Project和SysLib和User。
  3. 在SysLib新建四个文件夹:Startup、CMSIS、inc、src。

接下来在各文件中添加对应的文件

  • Startup:复制startup_stm32f429_439xx.s文件到Startup中,该文件位于...\Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm中。
  • CMSIS:复制stm32f4xx.h、system_stm32f4xx.h、system_stm32f4xx.c到CMSIS中。上述文件位于...\Libraries\CMSIS\Device\ST\STM32F4xx\Include

和...\Project\STM32F4xx_StdPeriph_Templates中。

  • Inc: 复制...\Libraries\STM32F4xx_StdPeriph_Driver\inc中的.h文件到Inc文件夹中,也可以按实际需要的外设选择相应的文件。
  • Src:复制...\Libraries\STM32F4xx_StdPeriph_Driver\src中的.c文件到src文件夹中,与inc文件对应,按需选择。
  • User:复制stm32f4xx_conf.h、stm32f4xx_it.c、stm32f4xx_it.h三个文件到User中,该文件位于...\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在附件中。

6319.zip
Anonymous
中文社区博客
  • Arm A-Profile构架2022扩展

    Zenon Xiu (修志龙)
    Zenon Xiu (修志龙)
    原文:Arm A-Profile Architecture Developments 2022 - Architectures and Processors blog - Arm Community blogs - Arm Community  作者:Martin Weidmann翻译:修志龙(Zenon Xiu) 与arm构架授权和生态伙伴一起,arm持续演进其构架,开发新功能以满足现有和新市场的要求…
    • October 17, 2022
  • 深入理解 Arm A-profile的non-maskable interrupt -NMI

    Zenon Xiu (修志龙)
    Zenon Xiu (修志龙)
    原文: https://community.arm.com/arm-community-blogs/b/architectures-and-processors-blog/posts/a-profile-non-maskable-interrupts  翻译: 修志龙 Zenon Xiu Arm A-profile构架一个长久以来的局限性是:缺乏对non-maskable interrupt (NMI…
    • August 24, 2022
  • Arm A-Profile 构架2021扩展

    Zenon Xiu (修志龙)
    Zenon Xiu (修志龙)
    原文: https://community.arm.com/arm-community-blogs/b/architectures-and-processors-blog/posts/arm-a-profile-architecture-developments-2021 Martin Weidmann September 8, 2021 翻译注释:Zenon Xiu Arm与arm构架授权公司及生态伙伴一起…
    • August 17, 2022