0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

教大家如何在STM32F4上跑freeRTOS

FPGA之家 ? 来源:嵌入式客栈 ? 作者:逸珺 ? 2021-07-23 10:21 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

[导读] 大家好,我是逸珺。

之前挖了图解freeRTOS的坑,挖了坑就得填。今天就从使用开始,先把freeRTOS用起来。先聊一聊在STM32F407上的如何电灯,如果只用freeRTOS点灯,无疑有点杀鸡用牛刀的感觉。但是想用freeRTOS做产品,先照类似步骤则可以验证最小系统,验证freeRTOS是否能正确跑起来,再在此基础上开始做应用开发,就把任务分解了。本文主要梳理一下如何利用官方移植例子,创建一个自己demo工程,对于没用过的有点参考价值。

注:本文基于IAR for ARM 8.22.1(个人喜欢IAR),硬件采用正点原子的STM32F407探索者开发板,STLink V2。

准备工作去官网https://www.freertos.org/a00104.html下载

按下载,目前最新为202104.00,这个带多种移植好的例子。解压出来,是这样的:

嵌入式客栈

tools为AWS iot配置工具,quick start例子以及cmake

FreeRTOS-Plus包含了MQTT,TCP,FAT等很多例子,先不去管

FreeRTOS为真正的操作系统源码以及多平台移植例子,如下:

嵌入式客栈

使用开源软件,记得看看README,一般会有些介绍信息。分别介绍一下该文件夹下的大体内容:

Demo:大部分硬件平台的官方移植例子

Source:内核代码,包含硬件独立文件与可移植文件

Test:内核测试代码

license:MIT开源协议,可以直接商业应用。

建立工程1.打开IAR,创建Workspace

2.创建工程

嵌入式客栈

选择空工程(Empty project),命名为demo保存。

嵌入式客栈

设置工程

右键选择Options,进入设置界面

嵌入式客栈

设置单片机为STM32F407VG

嵌入式客栈

Library Configuration使能CMSIS

953fb36a-e10c-11eb-9e57-12bb97331649.png

添加源文件

4.1 新建freeRTOS文件夹

95542db8-e10c-11eb-9e57-12bb97331649.png

4.2 添加内核文件,在工程文件夹下新建freeRTOS文件夹,将下列文件拷贝过来

4.3 添加进IAR工程

4.4 将freeRTOS下的include文件夹以及portable文件夹拷贝到当前工程下

9577ca52-e10c-11eb-9e57-12bb97331649.png

4.5 portable文件夹下保留下面这几个文件夹

嵌入式客栈

4.6 IAR文件夹下保留下面这两个文件夹

嵌入式客栈

注:全保留也可以,就是其他的用不到,会使工程文件夹变的很大,如果用版本控制软件管理,会增加仓库的大小。ARM_CM4F_MPU文件夹暂时没用,这个留做备用。

4.7 在IAR工程中新建portable文件夹,并加入相应的文件

嵌入式客栈

4.8 将下面几个文件从官方例子中拷贝过来,并加入工程

FreeRTOSConfig.h是内核配置文件,本文配置如下:

#define configUSE_PREEMPTION 1#define configUSE_IDLE_HOOK 0#define configUSE_TICK_HOOK 0#define configCPU_CLOCK_HZ ( SystemCoreClock )#define configTICK_RATE_HZ ( ( TickType_t ) 1000 )#define configMAX_PRIORITIES ( 5 )#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 130 )#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 75 * 1024 ) )#define configMAX_TASK_NAME_LEN ( 10 )#define configUSE_TRACE_FACILITY 1#define configUSE_16_BIT_TICKS 0#define configIDLE_SHOULD_YIELD 1#define configUSE_MUTEXES 1#define configQUEUE_REGISTRY_SIZE 8#define configCHECK_FOR_STACK_OVERFLOW 0#define configUSE_RECURSIVE_MUTEXES 1#define configUSE_MALLOC_FAILED_HOOK 0#define configUSE_APPLICATION_TASK_TAG 0#define configUSE_COUNTING_SEMAPHORES 1#define configGENERATE_RUN_TIME_STATS 0/* Co-routine definitions. */#define configUSE_CO_ROUTINES 0#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )/* Software timer definitions. */#define configUSE_TIMERS 1#define configTIMER_TASK_PRIORITY ( 2 )#define configTIMER_QUEUE_LENGTH 10#define configTIMER_TASK_STACK_DEPTH ( configMINIMAL_STACK_SIZE * 2 )/* Set the following definitions to 1 to include the API function, or zero

to exclude the API function. */#define INCLUDE_vTaskPrioritySet 1#define INCLUDE_uxTaskPriorityGet 1#define INCLUDE_vTaskDelete 1#define INCLUDE_vTaskCleanUpResources 1#define INCLUDE_vTaskSuspend 1#define INCLUDE_vTaskDelayUntil 1#define INCLUDE_vTaskDelay 1

将IDLE_HOOK/TICK_HOOK禁止了,先不去关注这两个功能。

将STM32相关文件搬过来,如下加入到工程

建立main.c

正点原子的板子,有两个LED,我们就建立两个任务来闪灯吧,相当于hello world,容易理解。

嵌入式客栈

/* 操作系统头文件。 */

#include “FreeRTOS.h”#include “task.h”#include “timers.h”#include “semphr.h”#include “stm32f4xx.h”

//LED管脚

#define LED1_PIN GPIO_Pin_9#define LED1_GPIO_PORT GPIOF#define LED1_GPIO_CLK RCC_AHB1Periph_GPIOF

#define LED2_PIN GPIO_Pin_10#define LED2_GPIO_PORT GPIOF#define LED2_GPIO_CLK RCC_AHB1Periph_GPIOF

static void prvLedInitialise()

{

GPIO_InitTypeDef GPIO_InitStructure;

/* LED1时能时钟 */

RCC_AHB1PeriphClockCmd(LED1_GPIO_CLK, ENABLE);

/* LED1 GPIO 配置为输出 */

GPIO_InitStructure.GPIO_Pin = LED1_PIN;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);

/* LED2时能时钟 */

RCC_AHB1PeriphClockCmd(LED2_GPIO_CLK, ENABLE);

/* LED2 GPIO配置为输出 */

GPIO_InitStructure.GPIO_Pin = LED2_PIN;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);

}

static void prvSetupHardware( void )

{

/* 配置时钟,PLL,FLASH */

SystemInit();

/* 配置NVIC优先级。 */

NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );

/*LED GPIO配置*/

prvLedInitialise();

}

//500ms LED1灯状态翻转一次

static void led1Task( void * pvParameters )

{

while(1)

{

LED1_GPIO_PORT-》ODR ^= LED1_PIN;

vTaskDelay(500);

}

}

//1000ms LED2灯状态翻转一次

static void led2Task( void * pvParameters )

{

while(1)

{

LED2_GPIO_PORT-》ODR ^= LED2_PIN;

vTaskDelay(1000);

}

}

int main(void)

{

prvSetupHardware();

xTaskCreate(led1Task,“LED1”,256,NULL,100,(TaskHandle_t *)NULL);

xTaskCreate(led2Task,“LED2”,256,NULL,101,(TaskHandle_t *)NULL);

/* 启动任务调度器。 */

vTaskStartScheduler();

}

5.设置包含路径

5.1 右键打开options,设置C/C++编译器包含路径

5.2 设置包含路径为:

$PROJECT_DIR$是一个变量,表示当前路径,不要设成绝对路径,否则拷贝到不同路径就无法编译了。

$PROJ_DIR$

$PROJ_DIR$halCMSISDeviceSTSTM32F4xxInclude

$PROJ_DIR$halSTM32F4xx_StdPeriph_Driverinc

$PROJ_DIR$freeRTOSinclude

$PROJ_DIR$freeRTOSportableIARARM_CM4F

$PROJ_DIR$Commoninclude示当前工程目录,利用这个变量就可以设置和工程相关的路径了,不要设置为绝对路径,否则如果工程拷贝到其他路径,就无法正确编译了。

并设置两个宏:

USE_STDPERIPH_DRIVER

STM32F4XX

5.3 设置汇编器包含路径

嵌入式客栈

6. 设置链接配置文件

嵌入式客栈

注:如果遇到下面的错误,应该是你使用了老版本的startup_stm32f4xx.s

Warning[25]: Label ‘CAN2_SCE_IRQHandler’ is defined pubweak in a section implicitly declared root

官方例子中下面路径的startup_stm32f4xx.s为老版本

CMSISDeviceSTSTM32F4xxSourceTemplatesiar

该警告详细信息可参考:

https://www.iar.com/knowledge/support/technical-notes/assembler/warning25-label-xxxxx-is-defined-pubweak-in-a-section-implicitly-declared-root/

编译运行

嵌入式客栈

设置ST-Link

嵌入式客栈

总结一下官方的例子,要直接拿来开发产品有很多不需要的文件,可以按照本文的步骤做些删减,先建立这样一个基本工程,然后就可以结合自己的实际硬件以及需求,开始做应用开发了。

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32F4
    +关注

    关注

    3

    文章

    203

    浏览量

    29132

原文标题:手把手教你在STM32F4上跑freeRTOS

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    使用studio构建STM32F4工程报错的原因?

    使用studio 构建STM32F4 工程,什么都没有动报了以上错误.这是为什么 ?
    发表于 06-26 07:26

    STM32F4标准外设库资料

    stm32f4xx.h,标准外设库
    发表于 06-08 09:49 ?2次下载

    STM32F3系列、STM32F4系列、STM32L4系列和STM32L4+系列Cortex-M4编程手册

    电子发烧友网站提供《STM32F3系列、STM32F4系列、STM32L4系列和STM32L4+系列Cortex-M4编程手册.pdf》资料
    发表于 06-06 17:06 ?6次下载

    零知开源——STM32F4驱动MAX31865实现PT100高精度测温

    STM32F
    PCB56242069
    发布于 :2025年05月26日 18:25:17

    技术分享 | 如何在2k0300(LoongArch架构)处理器通qt开发流程

    技术分享 | 如何在2k0300开发板(LoongArch架构)处理器通qt开发流程
    的头像 发表于 05-20 11:05 ?331次阅读
    技术分享 | 如<b class='flag-5'>何在</b>2k0300(LoongArch架构)处理器<b class='flag-5'>上</b><b class='flag-5'>跑</b>通qt开发流程

    使用SPI进行通信,STM32F4做从机,通信时数据异常怎么解决?

    使用SPI进行通信,STM32F4做从机,通信时数据异常,SPI2中SR寄存器会出现0xc0,0xc1,0x80的异常状态值,大概就是BYS位,OVR位,RXEN位
    发表于 03-14 12:14

    Arduino中可以使用STM32F1或者STM32F4系列芯片的内置看门狗吗?

    Arduino中可以使用STM32F1或者STM32F4系列芯片的内置看门狗吗
    发表于 03-13 07:32

    使用STM32F4的ADC的时候,发现测量结果不准确,是什么原因导致的?

    请教各位大佬一个问题,我在使用STM32F4的ADC的时候,发现测量结果不准确。上网查看教程,发现F1系列有自动校准的函数,但是F4没有校准相关的设置,想请教一下是F4的HAL库把校准
    发表于 03-11 06:29

    stm32f4 sdio时钟如何获取通过什么函数?

    stm32f4系列sdio 时钟如何获取,stm32h7可以通过sdmmc_clk=HAL_RCCEx_GetPeriphCLKFreq(STM32_RCC_PERIPHCLK_SDMMC);这个函数获取
    发表于 03-07 08:26

    STM32项目实战:基于STM32F4的智能大棚温控系统(LVGL),附项目教程/源码

    今天小编来分享一个《智能大棚温控系统》的项目案例,硬件平台是STM32F4开发板+资源扩展板+显示触摸屏+仿真器,项目的演示界面如下图所示。智能大棚温控系统项目,需要一个风扇执行器件;一个温湿度
    的头像 发表于 10-25 13:54 ?1584次阅读
    <b class='flag-5'>STM32</b>项目实战:基于<b class='flag-5'>STM32F4</b>的智能大棚温控系统(LVGL),附项目教程/源码

    基于STM32F4的集中润滑系统的设计

    针对传统机械润滑设备存在的高能耗、劳动强度大、结构复杂及智能化程度低等问题,本文设计了一款基于STM32F407控制核心、esp8266无线Wi-Fi通信模块和KQ330电力载波模块的集中润滑系统
    的头像 发表于 10-18 08:03 ?941次阅读
    基于<b class='flag-5'>STM32F4</b>的集中润滑系统的设计

    STM32项目实战:基于STM32F4的智能灯光控制系统(LVGL),附项目教程/源码

    《智能灯光控制系统_STM32F4》项目完整文档、项目源码,私信小雯老师免费领取。STM32项目实战之“智能灯光控制系统”(基于STM32F4)今天小编来分享一个《智能灯光控制系统》的项目案例,硬件
    的头像 发表于 10-17 16:16 ?1940次阅读
    <b class='flag-5'>STM32</b>项目实战:基于<b class='flag-5'>STM32F4</b>的智能灯光控制系统(LVGL),附项目教程/源码

    何在RT-thread studio的裸机例程移植freertos

    何在RT-thread studio的裸机例程移植freertos
    发表于 09-13 06:32

    在TM4C MCU使用FreeRTOS开发高级应用

    电子发烧友网站提供《在TM4C MCU使用FreeRTOS开发高级应用.pdf》资料免费下载
    发表于 09-06 10:17 ?2次下载
    在TM<b class='flag-5'>4</b>C MCU<b class='flag-5'>上</b>使用<b class='flag-5'>FreeRTOS</b>开发高级应用

    STM32F40xxx、STM32F41xxx、STM32F42xxx、STM32F43xxx中文手册

    STM32F4系列单片机中文手册
    发表于 08-08 14:32 ?2次下载