[其他ST产品] STM32系列单片机标准库移植FreeRTOS

[复制链接]
3868|64
 楼主| qsrg51 发表于 2023-12-26 19:39 | 显示全部楼层
双击错误提示,跳转到代码中。 822658abb8005038.png
 楼主| qsrg51 发表于 2023-12-26 19:39 | 显示全部楼层
 这里主要是头文件的路径错误,将sys.h 和 usart.h前面的路径删除掉,再次编译。 59178658abb8e14979.png
 楼主| qsrg51 发表于 2023-12-26 19:40 | 显示全部楼层
此时编译错误减少了,但是还有一个led.h的路径错误。双击错误提示,跳转到文件中。

18378658abb9d530d3.png
 楼主| qsrg51 发表于 2023-12-26 19:40 | 显示全部楼层
 这个freertos_demo.c文件中是FreeRTOS任务相关的代码,正点原子的示例中用到了液晶屏和LED灯,在这里删除液晶屏相关代码,只保留LED灯相关代码。同时要修改LED头文件路径。 27639658abbadc10c8.png
 楼主| qsrg51 发表于 2023-12-26 19:40 | 显示全部楼层
删除文件中LCD相关的代码 52462658abbbcad2a8.png
 楼主| qsrg51 发表于 2023-12-26 19:41 | 显示全部楼层
修改LED相关代码,修改后代码如下:
  1. #include "freertos_demo.h"
  2. #include "usart.h"
  3. #include "led.h"

  4. /*FreeRTOS*********************************************************************************************/
  5. #include "FreeRTOS.h"
  6. #include "task.h"

  7. /******************************************************************************************************/
  8. /*FreeRTOS配置*/

  9. /* START_TASK 任务 配置
  10. * 包括: 任务句柄 任务优先级 堆栈大小 创建任务
  11. */
  12. #define START_TASK_PRIO 1                   /* 任务优先级 */
  13. #define START_STK_SIZE  128                 /* 任务堆栈大小 */
  14. TaskHandle_t            StartTask_Handler;  /* 任务句柄 */
  15. void start_task(void *pvParameters);        /* 任务函数 */

  16. /* TASK1 任务 配置
  17. * 包括: 任务句柄 任务优先级 堆栈大小 创建任务
  18. */
  19. #define TASK1_PRIO      2                   /* 任务优先级 */
  20. #define TASK1_STK_SIZE  128                 /* 任务堆栈大小 */
  21. TaskHandle_t            Task1Task_Handler;  /* 任务句柄 */
  22. void task1(void *pvParameters);             /* 任务函数 */

  23. /* TASK2 任务 配置
  24. * 包括: 任务句柄 任务优先级 堆栈大小 创建任务
  25. */
  26. #define TASK2_PRIO      3                   /* 任务优先级 */
  27. #define TASK2_STK_SIZE  128                 /* 任务堆栈大小 */
  28. TaskHandle_t            Task2Task_Handler;  /* 任务句柄 */
  29. void task2(void *pvParameters);             /* 任务函数 */

  30. /******************************************************************************************************/


  31. /**
  32. * [url=home.php?mod=space&uid=247401]@brief[/url]       FreeRTOS例程入口函数
  33. * @param       无
  34. * @retval      无
  35. */
  36. void freertos_demo(void)
  37. {
  38.      xTaskCreate((TaskFunction_t )start_task,            /* 任务函数 */
  39.                 (const char*    )"start_task",          /* 任务名称 */
  40.                 (uint16_t       )START_STK_SIZE,        /* 任务堆栈大小 */
  41.                 (void*          )NULL,                  /* 传入给任务函数的参数 */
  42.                 (UBaseType_t    )START_TASK_PRIO,       /* 任务优先级 */
  43.                 (TaskHandle_t*  )&StartTask_Handler);   /* 任务句柄 */
  44.     vTaskStartScheduler();
  45. }

  46. /**
  47. * @brief       start_task
  48. * @param       pvParameters : 传入参数(未用到)
  49. * @retval      无
  50. */
  51. void start_task(void *pvParameters)
  52. {
  53.     taskENTER_CRITICAL();           /* 进入临界区 */
  54.     /* 创建任务1 */
  55.     xTaskCreate((TaskFunction_t )task1,
  56.                 (const char*    )"task1",
  57.                 (uint16_t       )TASK1_STK_SIZE,
  58.                 (void*          )NULL,
  59.                 (UBaseType_t    )TASK1_PRIO,
  60.                 (TaskHandle_t*  )&Task1Task_Handler);
  61.     /* 创建任务2 */
  62.     xTaskCreate((TaskFunction_t )task2,
  63.                 (const char*    )"task2",
  64.                 (uint16_t       )TASK2_STK_SIZE,
  65.                 (void*          )NULL,
  66.                 (UBaseType_t    )TASK2_PRIO,
  67.                 (TaskHandle_t*  )&Task2Task_Handler);
  68.     vTaskDelete(StartTask_Handler); /* 删除开始任务 */
  69.     taskEXIT_CRITICAL();            /* 退出临界区 */
  70. }

  71. /**
  72. * @brief       task1
  73. * @param       pvParameters : 传入参数(未用到)
  74. * @retval      无
  75. */
  76. void task1(void *pvParameters)
  77. {
  78.     while(1)
  79.     {        
  80.         LED0=!LED0;                                                  /* LED0闪烁 */
  81.         vTaskDelay(100);                                               /* 延时1000ticks */
  82.     }
  83. }

  84. /**
  85. * @brief       task2
  86. * @param       pvParameters : 传入参数(未用到)
  87. * @retval      无
  88. */
  89. void task2(void *pvParameters)
  90. {
  91.     while(1)
  92.     {
  93.        LED1=!LED1;
  94.         vTaskDelay(200);                           /* 延时1000ticks */
  95.     }
  96. }

 楼主| qsrg51 发表于 2023-12-26 19:53 | 显示全部楼层
修改完成后再次编译工程,这时还有一个错误。

95766658abc0bacba9.png
 楼主| qsrg51 发表于 2023-12-26 19:53 | 显示全部楼层
 双击错误提示,定位到代码中。

15057658abec4bcc1d.png
 楼主| qsrg51 发表于 2023-12-26 19:53 | 显示全部楼层
 错误提示声明语句不能出现在可执行语句之后。将这行代码移动到函数开始位置处。再次编译工程。

30000658abed2d3819.png
 这时候工程0错误,0警告。
 楼主| qsrg51 发表于 2023-12-26 19:54 | 显示全部楼层
下载验证
  在工程中可以看到正点原子的这个芯片用的是103RC系列的芯片,LED口为PA8和PD2口,如果自己有板子的话就可以下载程序验证了。

93666658abef58be2c.png
 楼主| qsrg51 发表于 2023-12-26 19:54 | 显示全部楼层
 电路板运行效果
81690658abf06ee6fd.png
 楼主| qsrg51 发表于 2023-12-26 19:55 | 显示全部楼层
 示波器测量LED波形。
77490658abf1525a78.png
 楼主| qsrg51 发表于 2023-12-26 19:55 | 显示全部楼层
 通过示波器波形可以看出,一个LED100ms闪烁一次,一个LED200ms闪烁一次。和代码中设置的一样,说明程序功能正常。FreeRTOS的移植已经成功了。
 楼主| qsrg51 发表于 2023-12-26 19:55 | 显示全部楼层
将工程移植到其他型号MCU上
  这个工程用只能用到STM32F103RC系列的MCU上,但是我们自己不一定都用的是这个系类的MCU,如果我们用的是其他系列的MCU,那么此时还需要将次工程移植到我们自己的MCU上去。
 楼主| qsrg51 发表于 2023-12-26 19:55 | 显示全部楼层
下面就将这个工程移植到STM32F103C8T6芯片上去,首先将刚才的工程复制一份,并重命名。
63107658abf2f921ff.png
 楼主| qsrg51 发表于 2023-12-26 19:55 | 显示全部楼层
将工程重命名为 FreeRTOS_demo_103C8T6,打开工程。
 楼主| qsrg51 发表于 2023-12-26 19:55 | 显示全部楼层
修改单片机型号
  单击魔术棒按钮,选择Device选项,将单片机型号选为STM32F103C8


84836658abf4326104.png
 楼主| qsrg51 发表于 2023-12-26 19:56 | 显示全部楼层
修改单片机类型
  由于STM32F103C8系列MCU是中等容量单片机,而工程默认的STM32F103RC系列MCU是大容量单片机,这里要在C/C++ 选项中将单片机宏定义的类型修改为STM32F10X_MD
13894658abf517a6e7.png
 楼主| qsrg51 发表于 2023-12-26 19:56 | 显示全部楼层
修改下载文件
  选择debug选项,单击setting按钮,打开Flash Download 选项,选择这个512K的下载文件,然后单击Remove按钮,将默认的这个下载文件删除掉。
5114658abf5e90d1b.png
 楼主| qsrg51 发表于 2023-12-26 19:56 | 显示全部楼层
 单击Add按钮,添加新的下载文件。
34055658abf6af085b.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部