STM32G0开发笔记:使用FreeRTOS系统

发布时间:2023-06-27  

使用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频率,是否需要打开某项功能等;


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

f85a0cfc446480f98278cecc86eb1219_poYBAGPE90WAWzvUAAJdbkXfW9k951.png

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按预定的程序闪烁运行。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    电路用的并不多。 很多人可能会反驳,模电一定要学,不然注定做不出稳定产品。 我并不是说模拟电路不用学,而是新手学到什么程度的问题,我个人建议最多学到负反馈放大电路就够了。 现在......
    学好单片机好找工作吗?单片机学到什么程度可以找工作?;曾经我和很多应届生、转行的一样,对未来又憧憬又恐惧。 憧憬是学了20多年,终于能靠自己双手挣钱,恐惧是不知道自己学的东西到底有没有用。 现在10......
    、单片机编程怎么入门? 关于单片机编程怎么入门我历史文章里有写,每个环节学到什么程度,都写的很清楚,包含了全部教程和工具。 这里就只给大家大概介绍一下。 单片机编程入门有3个必备知识点: 1. 基础......
    最终放弃单片机学习。 3.C语言需要学习到什么程度? C语言是一门课程,如果要全面的掌握C语言知识,没有个几个月肯定搞不定,那我们单片机开发C语言需要学习到什么程度呢? 入门单片机编程,需要......
    对每个新学员进行基础评测,然后再规划系统学习路径的原因。 学习路径就像你的地图,你要去寻找宝藏,没有地图指路很容易就走偏了。 还有就是对电路这块学到什么程度心里也没底,以为......
    都放弃了,所以大家千万不要走我的老路。 那要做单片机开发,C语言基础学习到什么程度就可以开始了? 对于刚入门的学员,大家学习单片机的一些基础就OK了,下面我给大家简单的列举一下: 1. 学习二进制,十进......
    是我们无际单片机编程的学员可以随时来问我们, 2.做单片机开发硬件要学到什么程度? 这个也是走弯路最多的一个问题,就是总是去纠结电路看不懂,就以为自己硬件基础太差。 然后就回过头去学习模拟电路,数字电路。 等你......
    是电气工程,看到师兄那苦逼样决定转行。 实习期比较自由,我就开始自学,从入门到转行成功,前后花了4个月左右。 刚开始,我也很焦虑…. 自己能不能学得会?学到什么程度能去找工作? 万一花了几个月时间学习,找不......
    RTX51 Tiny 操作系统第一篇:为什么要学操作系统;1、为什么要使用操作系统(1)平常写代码的时候,我们都会这样子写: #include 'reg51.h'void main(){ while......
    方式降低纹波电压的 二、陶瓷电容需要将buck电路输入纹波电压降低到什么程度?(陶瓷电容的选型) 1.容值......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>