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

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

3天内不再提示

STM32G0开发笔记:使用FreeRTOS系统

CHANBAEK 来源:电子技术攻城狮 作者: MakerInChina.c 2023-01-16 15:07 次阅读

使用Platformio平台的libopencm3开发框架来开发STM32G0,下面为使用FreeRTOS系统。

1 新建项目

  • PIO主页新建项目,框架选择libopencm3,开发板选择 MonkeyPi_STM32_G070RB;
  • 新建完成后在src目录新建主程序文件main.c;
  • 然后更改项目文件platformio.ini的烧写和调试方式:
1upload_protocol = cmsis-dap
2debug_tool = cmsis-dap

2 添加FreeRTOS源码

在freertos网站:https://www.freertos.org/a00104.html 下载好源码,这里下载最新版202112.00;

  • 添加源码到项目:

直接拷贝源码下的FreeRTOS文件夹到项目的lib目录中;

  • 添加到项目编译

在lib目录的FreeRTOS文件夹下新建 library.json 文件,内容如下:

1{
 2    "name": "FreeRTOS",
 3    "version": "202112.00",
 4    "build": {
 5        "flags": [
 6            "-Isource",
 7            "-Isource/include",
 8            "-Isource/portable/GCC/ARM_CM0",
 9            "-Isource/portable/RVDS/ARM_CM0"
10        ],
11        "srcFilter": [
12            "+",
13            "+",
14            "+"
15        ]
16    }
17}
  • 添加FreeRTOS配置

从FreeRTOS源码下的demo目录中拷贝一个FreeRTOSConfig.h文件到 lib/FreeRTOS/Source目录,并更改为如下内容:

1/**
 2 * @file FreeRTOSConfig.h
 3 * 
 4 * http://www.FreeRTOS.org
 5 * http://aws.amazon.com/freertos
 6 * 
 7 */
 8
 9#ifndef FREERTOS_CONFIG_H
10#define FREERTOS_CONFIG_H
11
12/*-----------------------------------------------------------
13 * Application specific definitions.
14 *
15 * These definitions should be adjusted for your particular hardware and
16 * application requirements.
17 *
18 * These parameters and more are described within the 'configuration' section of the
19 * FreeRTOS API documentation available on the FreeRTOS.org web site.
20 *
21 * See http://www.freertos.org/a00110.html
22 *----------------------------------------------------------*/
23
24/* USER CODE BEGIN Includes */
25/* Section where include file can be added */
26/* USER CODE END Includes */
27
28/* Ensure definitions are only used by the compiler, and not by the assembler. */
29#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
30  #include 
31#endif
32#define configENABLE_FPU                         0
33#define configENABLE_MPU                         0
34
35#define configUSE_PREEMPTION                     1
36#define configSUPPORT_STATIC_ALLOCATION          0
37#define configSUPPORT_DYNAMIC_ALLOCATION         1
38#define configUSE_IDLE_HOOK                      0
39#define configUSE_TICK_HOOK                      0
40#define configCPU_CLOCK_HZ                         ( ( unsigned long ) 64000000 ) 
41#define configTICK_RATE_HZ                       ((TickType_t)1000)
42#define configMAX_PRIORITIES                     ( 7 )
43#define configMINIMAL_STACK_SIZE                 ((uint16_t)256)
44#define configTOTAL_HEAP_SIZE                    ((size_t)1024*16)
45#define configMAX_TASK_NAME_LEN                  ( 16 )
46#define configUSE_16_BIT_TICKS                   0
47#define configUSE_MUTEXES                        1
48#define configQUEUE_REGISTRY_SIZE                8
49#define configUSE_PORT_OPTIMISED_TASK_SELECTION  0
50
51/*Software timer related definitions. */
52#define configUSE_TIMERS                        1
53#define configTIMER_TASK_PRIORITY               5
54#define configTIMER_QUEUE_LENGTH                10
55#define configTIMER_TASK_STACK_DEPTH            configMINIMAL_STACK_SIZE
56
57/* USER CODE BEGIN MESSAGE_BUFFER_LENGTH_TYPE */
58/* Defaults to size_t for backward compatibility, but can be changed
59   if lengths will always be less than the number of bytes in a size_t. */
60#define configMESSAGE_BUFFER_LENGTH_TYPE         size_t
61/* USER CODE END MESSAGE_BUFFER_LENGTH_TYPE */
62
63/* Co-routine definitions. */
64#define configUSE_CO_ROUTINES                    0
65#define configMAX_CO_ROUTINE_PRIORITIES          ( 2 )
66
67/* Set the following definitions to 1 to include the API function, or zero
68to exclude the API function. */
69#define INCLUDE_vTaskPrioritySet             1
70#define INCLUDE_uxTaskPriorityGet            1
71#define INCLUDE_vTaskDelete                  1
72#define INCLUDE_vTaskCleanUpResources        0
73#define INCLUDE_vTaskSuspend                 1
74#define INCLUDE_vTaskDelayUntil              0
75#define INCLUDE_vTaskDelay                   1
76#define INCLUDE_xTaskGetSchedulerState       1
77
78/* Normal assert() semantics without relying on the provision of an assert.h
79header file. */
80/* USER CODE BEGIN 1 */
81//void vAssertCalled(const char *file, int line);
82//#define configASSERT( x )       if( x == 0 ) { taskDISABLE_INTERRUPTS(); vAssertCalled(__FILE__,__LINE__); for(;;); }
83/* USER CODE END 1 */
84
85/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS
86standard names. */
87#define vPortSVCHandler    sv_call_handler
88#define xPortPendSVHandler pend_sv_handler
89
90/* IMPORTANT: This define is commented when used with STM32Cube firmware, when the timebase source is SysTick,
91              to prevent overwriting SysTick_Handler defined within STM32Cube HAL */
92
93#define xPortSysTickHandler sys_tick_handler
94
95/* USER CODE BEGIN Defines */
96/* Section where parameter definitions can be added (for instance, to override default ones in FreeRTOS.h) */
97/* USER CODE END Defines */
98
99#endif /* FREERTOS_CONFIG_H */

上面配置需要根据自己的需要进行更改,如CPU频率,是否需要打开某项功能等;

  • 配置好后的目录结构如下:

image-20220910154501074

3 FreeRTOS示例

  • 首先需要设置FreeRTOS需要的时钟
1/**
 2 * @brief systick setup for rtos tick
 3 */
 4static void systick_setup(void)
 5{
 6    systick_set_clocksource(STK_CSR_CLKSOURCE_AHB);
 7    systick_set_reload(64*1000);
 8
 9    systick_interrupt_enable();
10
11    /* Start counting. */
12    systick_counter_enable();
13}

这样在FreeRTOSConfig.h 文件中定义的

1#define xPortSysTickHandler sys_tick_handler

就可以通过systick中断提供FreeRTOS时钟;

  • LED任务函数
1static void led1_task(void *args)
 2{
 3    rcc_periph_clock_enable(RCC_GPIOC);
 4    gpio_mode_setup(GPIOC,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,GPIO12);
 5
 6    while (1)
 7    {
 8        gpio_toggle(GPIOC,GPIO12);
 9        vTaskDelay(pdMS_TO_TICKS(500));
10    }
11}
  • 主程序中创建任务并开启多任务调度
1#include 
 2#include 
 3#include 
 4
 5#include "FreeRTOS.h"
 6#include "task.h"
 7
 8
 9int main(void)
10{
11    //system clock
12    rcc_clock_setup(&rcc_clock_config[RCC_CLOCK_CONFIG_HSI_PLL_64MHZ]);
13
14    systick_setup();
15
16    xTaskCreate(led_task,"led task", 256, NULL,2,NULL);
17
18    vTaskStartScheduler();
19
20    while(1){}
21
22    return 0;
23}

通过xTaskCreate创建多任务函数,然后使用 vTaskStartScheduler 开始调度;

注:如果VSCode中提示 FreeRTOS.h 头文件include path问题,可以将项目文件夹关闭,再重新打开即可;如果是在Clion中,可以在添加lib文件夹后,右键platformio.ini文件选择re init即可;

4 烧写测试

点击 PlatformIO:Upload按钮或Ctrl+Alt+U快捷键可以直接编译烧写到目标板,看到LED按预定的程序闪烁运行。

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

    关注

    2264

    文章

    10852

    浏览量

    354094
  • 源码
    +关注

    关注

    8

    文章

    632

    浏览量

    29092
  • 函数
    +关注

    关注

    3

    文章

    4273

    浏览量

    62290
  • 开发板
    +关注

    关注

    25

    文章

    4872

    浏览量

    96971
  • FreeRTOS
    +关注

    关注

    12

    文章

    483

    浏览量

    61892
收藏 人收藏

    评论

    相关推荐

    AN5096_介绍STM32G0系列硬件开发

    AN5096_介绍STM32G0系列硬件开发
    发表于 11-21 08:11 4次下载
    AN5096_介绍<b class='flag-5'>STM32G0</b>系列硬件<b class='flag-5'>开发</b>

    STM32G0开发笔记FreeRTOS和FreeModbus库使用

    使用Platformio平台的libopencm3开发框架来开发STM32G0,以下为FreeRTOS和FreeModbus库使用。
    的头像 发表于 01-16 14:44 5320次阅读
    <b class='flag-5'>STM32G0</b><b class='flag-5'>开发笔记</b>:<b class='flag-5'>FreeRTOS</b>和FreeModbus库使用

    STM32G0开发笔记FreeRTOS和CLI组件使用

    使用Platformio平台的libopencm3开发框架来开发STM32G0,以下为FreeRTOS和CLI组件使用。
    的头像 发表于 01-16 14:47 3244次阅读
    <b class='flag-5'>STM32G0</b><b class='flag-5'>开发笔记</b>:<b class='flag-5'>FreeRTOS</b>和CLI组件使用

    STM32G0开发笔记:使用FreeRTOS系统的队列Queue

    使用Platformio平台的libopencm3开发框架来开发STM32G0,下面为使用FreeRTOS系统的队列Queue。
    的头像 发表于 01-16 14:50 1300次阅读

    STM32G0开发笔记:使用ADC进行NTC温度采集

    使用Platformio平台的libopencm3开发框架来开发STM32G0,以下使用ADC进行NTC温度采集。
    的头像 发表于 01-16 15:12 8816次阅读
    <b class='flag-5'>STM32G0</b><b class='flag-5'>开发笔记</b>:使用ADC进行NTC温度采集

    STM32G0开发笔记:用PWM来实现LED呼吸灯效果

    使用Platformio平台的libopencm3开发框架来开发STM32G0,下面使用PWM来实现LED呼吸灯效果。
    的头像 发表于 01-16 15:15 2163次阅读
    <b class='flag-5'>STM32G0</b><b class='flag-5'>开发笔记</b>:用PWM来实现LED呼吸灯效果

    STM32G0开发笔记:EEPROM M24C02的使用方法

    使用Platformio平台的libopencm3开发框架来开发STM32G0,以下为EEPROM M24C02的使用方法。
    的头像 发表于 01-16 15:19 2667次阅读
    <b class='flag-5'>STM32G0</b><b class='flag-5'>开发笔记</b>:EEPROM M24C02的使用方法

    STM32G0开发笔记:SD卡模块的使用方法

    使用Platformio平台的libopencm3开发框架来开发STM32G0,下面介绍SD卡模块的使用方法。
    的头像 发表于 01-19 16:27 2124次阅读
    <b class='flag-5'>STM32G0</b><b class='flag-5'>开发笔记</b>:SD卡模块的使用方法

    STM32G0开发笔记:SPI接口的基本使用

    使用Platformio平台的libopencm3开发框架来开发STM32G0,下面介绍SPI接口的基本使用。
    的头像 发表于 01-17 10:38 2985次阅读
    <b class='flag-5'>STM32G0</b><b class='flag-5'>开发笔记</b>:SPI接口的基本使用

    STM32G0开发笔记:多通道ADC与DMA的使用

    使用Platformio平台的libopencm3开发框架来开发STM32G0,以下为多通道ADC与DMA的使用。
    的头像 发表于 01-17 10:41 6672次阅读
    <b class='flag-5'>STM32G0</b><b class='flag-5'>开发笔记</b>:多通道ADC与DMA的使用

    STM32G0开发笔记:定时器timer的基本使用方法

    使用Platformio平台的libopencm3开发框架来开发STM32G0,以下为定时器timer的基本使用方法。
    的头像 发表于 01-17 10:43 3539次阅读
    <b class='flag-5'>STM32G0</b><b class='flag-5'>开发笔记</b>:定时器timer的基本使用方法

    STM32G0开发笔记:串口中断的使用

    使用Platformio平台的libopencm3开发框架来开发STM32G0,以下为串口中断的使用。
    的头像 发表于 01-17 10:46 2230次阅读

    STM32G0开发笔记:GPIO接按键的使用方式

    使用Platformio平台的libopencm3开发框架来开发STM32G0,下面为GPIO接按键的使用方式。
    的头像 发表于 01-17 10:48 1681次阅读

    STM32G0开发笔记:LED灯示例

    使用Platformio平台的libopencm3开发框架来开发STM32G0,下面为LED灯示例。
    的头像 发表于 01-17 10:52 1347次阅读
    <b class='flag-5'>STM32G0</b><b class='flag-5'>开发笔记</b>:LED灯示例

    STM32G0开发笔记:使用libopencm3库

    使用Platformio平台的libopencm3开发框架来开发STM32G0开发环境为VSCode+PIO插件,这里以开发
    的头像 发表于 01-17 10:56 1776次阅读
    <b class='flag-5'>STM32G0</b><b class='flag-5'>开发笔记</b>:使用libopencm3库