OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 510|回复: 0

《M144Z-M3最小系统板使用指南——STM32F103版》第五十七章 FreeRTOS移植实验

[复制链接]

1117

主题

1128

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
4667
金钱
4667
注册时间
2019-5-8
在线时间
1224 小时
发表于 2024-5-30 17:51:43 | 显示全部楼层 |阅读模式
本帖最后由 正点原子运营 于 2024-5-29 16:49 编辑

第五十七章 FreeRTOS移植实验
1)实验平台:正点原子 M144Z-M3 STM32F103最小系统板

2) 章节摘自【正点原子】M144Z-M3最小系统板使用指南——STM32F103版


4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boar ... _mini_sysboard.html

5)正点原子官方B站:https://space.bilibili.com/394620890

6)正点原子STM32技术交流QQ群:725095144

155537c2odj87vz1z9vj6l.jpg

155537nfqovl2gg9faaol9.png

前面章节中的实验都是在裸机环境下实现,本章将介绍FreeRTOS的简单使用,对RTOS感兴趣的读者,可以参考正点原子推出的FreeRTOS或µC/OS-III的全套教程资料,包含教学视频、开发指南并配套有例程源码。通过本章的学习,读者将学习到FreeRTOS的简单应用。
本章分为如下几个小节:
57.1 硬件设计
57.2 程序设计
57.3 下载验证

57.1 硬件设计
57.1.1 例程功能
1. LED0由LED0任务控制80毫秒亮,920毫秒灭
2. LED1由LED1任务控制300毫秒亮,300毫秒灭

57.1.2 硬件资源
1. LED
       LED0 - PB5
       LED1 - PE5

57.1.3 原理图
本章实验使用的FreeRTOS为软件库,因此没有对应的连接原理图。

57.2 程序设计
57.2.1 FreeRTOS的移植
FreeRTOS的源码可参考正点原子推出的《FreeRTOS开发指南》或相关的配套教学视频至FreeRTOS的官网下载,也可在A盘à6,软件资料àFreeRTOS学习资料中找到。
FreeRTOS的移植请读者参考正点原子推出的《FreeRTOS开发指南》或相关的配套教学视频,在上述资料中,对FreeRTOS的移植和使用都做了非常详细地介绍,是入门FreeRTOS的一个非常好的选择。

57.2.2 实验应用代码
本章实验的应用代码,如下所示:
  1. int main(void)
  2. {
  3.    HAL_Init();                         /* 初始化HAL库 */
  4.    sys_stm32_clock_init(RCC_PLL_MUL9); /* 配置时钟,72MHz */
  5.    delay_init(72);                     /* 初始化延时 */
  6.    usart_init(115200);                 /* 初始化串口 */
  7.    led_init();                         /* 初始化LED */
  8.    
  9.    xTaskCreate( (TaskFunction_t )start_task,            /* 任务函数 */
  10.                  (const char*    )"start_task",          /* 任务名称 */
  11.                  (uint16_t       )START_STK_SIZE,        /* 任务堆栈大小 */
  12.                  (void*          )NULL,                  /* 传入给任务函数的参数 */
  13.                  (UBaseType_t    )START_TASK_PRIO,       /* 任务优先级 */
  14.                  (TaskHandle_t*  )&StartTask_Handler);  /* 任务句柄 */
  15.    vTaskStartScheduler();
  16. }
复制代码
从上面的代码中可以看出,在完成必要的初始化后,便创建了“start_task”任务,随后便开始了任务调度,“start_task”任务的入口函数为函数start_task(),如下所示:
  1. /**
  2. *@brief   start_task
  3. *@param   pvParameters: 传入参数(未用到)
  4. *@retval  无
  5. */
  6. void start_task(void *pvParameters)
  7. {
  8.    taskENTER_CRITICAL();                               /* 进入临界区 */
  9.    
  10.     /* 创建LED0任务 */
  11.    xTaskCreate( (TaskFunction_t )led0_task,
  12.                  (const char*    )"led0_task",
  13.                  (uint16_t       )LED0_STK_SIZE,
  14.                  (void*          )NULL,
  15.                  (UBaseType_t    )LED0_PRIO,
  16.                  (TaskHandle_t*  )&LED0Task_Handler);
  17.    
  18.     /* 创建LED1任务 */
  19.    xTaskCreate( (TaskFunction_t )led1_task,
  20.                  (const char*    )"led1_task",
  21.                  (uint16_t       )LED1_STK_SIZE,
  22.                  (void*          )NULL,
  23.                  (UBaseType_t    )LED1_PRIO,
  24.                  (TaskHandle_t*  )&LED1Task_Handler);
  25.    
  26.    vTaskDelete(StartTask_Handler);                     /* 删除开始任务 */
  27.    taskEXIT_CRITICAL();                                /* 退出临界区 */
  28. }
复制代码
从上面的代码中可以看出,“start_task”任务主要用于创建“led0_task”和“led1_task”任务,这两个任务的入口函数,如下所示:
  1. /**
  2. *@brief   LED0任务
  3. *@param   pvParameters: 传入参数(未用到)
  4. *@retval  无
  5. */
  6. void led0_task(void *pvParameters)
  7. {
  8.     while(1)
  9.     {
  10.          LED0(0);
  11.          vTaskDelay(80);
  12.          LED0(1);
  13.          vTaskDelay(920);
  14.     }
  15. }
  16. /**
  17. *@brief   LED1任务
  18. *@param   pvParameters: 传入参数(未用到)
  19. *@retval  无
  20. */
  21. void led1_task(void *pvParameters)
  22. {
  23.     while(1)
  24.     {
  25.          LED1(0);
  26.          vTaskDelay(300);
  27.          LED1(1);
  28.          vTaskDelay(300);
  29.     }
  30. }
复制代码
可以看到,两个任务分别控制开发板板载的两个LED闪烁,但其闪烁的频率和亮灭时间都不相同,因此因该能看到开发板板载的两个LED以不同的频率和不同的亮灭时间进行闪烁。

57.3 下载验证
在完成编译和烧录操作后,可以看到开发板板载的两个LED以不用的频率和不同的亮灭时间闪烁着,其中LED0在一个闪烁周期内的亮灭时间约分别为80毫秒和920毫秒,LED1在一个闪烁周期内的亮灭时间约分别为300毫秒和300毫秒。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 19:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表