你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103移植freeRTOS(使用官方源码)

[复制链接]
STMCU小助手 发布时间:2022-10-28 15:57
1.准备工作

2.新建文件夹及复制必要文件

2.1、新建7个文件夹

.\freeRTOS

.\freeRTOS\include

.\freeRTOS\port

.\freeRTOS\src

.\Library

.\Project

.\User

2.2、把源码FreeRTOSv9.0.0\FreeRTOS\Source\include中的文件全部复制到新建的include文件夹

2.3、把源码FreeRTOSv9.0.0\FreeRTOS\Source\portable中MemMang文件夹复制到新建的port文件夹中

2.4、把源码portable\RVDS中的ARM_CM3复制到port文件夹中

2.5、把源码FreeRTOSv9.0.0\FreeRTOS\Source文件夹中的*.c文件全部复制到新建的src文件夹中

2.6、把CMSIS和FWlib文件夹复制到新建Library文件夹中

2.7、User文件中新建一个main.c,然后复制标准库中的stm32f10x_conf.h、stm32f10x_it.c、stm32f10x_it.h文件到User文件夹中

2.8、把FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil中FreeRTOSConfig.h复制到include文件夹中

3.添加c文件
3.1、打开Keil uVision5新建工程,Project-NEW uVision project,选中Project文件夹,输入工程名称,保存。

3.2、芯片选择STM32F103C8,确定,再确定。

3.3、打开管理工程项目,分别新建freeRTOS/port、freeRTOS/src、CMSIS、FWLIB、USER

20201108161635983.png

3.4、freeRTOS/port中分别添加ARM_CM3\port.c和MemMang\heap_4.c两个文件

20201108161917372.png

3.5、freeRTOS/src添加freeRTOS\src文件夹下的所有c文件

2020110816205047.png

3.6、CMSIS添加Library\CMSIS\startup\startup_stm32f10x_md.s、Library\CMSIS\core_cm3.c、Library\CMSIS\system_stm32f10x.c三个文件

20201108162313840.png

3.7、FWLIB添加Library\FWlib\src文件夹下所有的*.c文件

20201108162421951.png

3.8、USER添加main.c、stm32f10x_it.c,如果这里有其他自己编写的代码,也可以放再这里。比如LED,KEY,USART相关代码

20201108162900407.png

4.配置运行环境
4.1、在C/C++选项卡,Define输入:STM32F10X_MD,USE_STDPERIPH_DRIVER

4.2、在C/C++中,包含include路径:freeRTOS\include、freeRTOS\port\ARM_CM3、Library\CMSIS、Library\FWlib\inc、User

如果还有自己编写的其他头文件,也一起包含在里面。如LED,KEY,USART

20201108173801445.png

4.3、使用MicroLIB库,

20201108172915724.png

20201108172935585.png 20201108173014700.png

5.代码修改
5.1、在freeRTOS中,已经为用户实现了SVC_Handle()和PendSV_Handler()函数,需要注释掉,修改stm32f10x_it.c文件

  1. *
  2. //void SVC_Handler(void)
  3. //{
  4. //}
  5. *
  6. //void PendSV_Handler(void)
  7. //{
  8. //}
  9. *
  10. /*在c文件中添加如下代码*/
  11. /*freeRTOS中的systick中断函数*/
  12. extern void xPortSysTickHandler(void);
  13. void SysTick_Handler(void)
  14. {
  15.   #if(INCLUDE_xTaskGetSchedulerState==1)
  16.     if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED){
  17.   #endif
  18.     xPortSysTickHandler();
  19.   #if (INCLUDE_xTaskGetSchedulerState==1)               
  20.   }
  21.   #endif
  22. }
复制代码

5.2、修改一下"FreeRTOSConfig.h",这里我使用软件定时器,需要打开对应宏定义,还要配置FreeRTOS与中断服务函数有关定义

  1. /*FreeRTOS与中断服务函数的配置选项*/
  2. #define xPortPendSVHandler         PendSV_Handler
  3. #define vPortSVCHandler         SVC_Handler

  4. /*启用软件定时器相关宏定义*/
  5. #define configUSE_TIMERS                           1
  6. #define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-1)        
  7. #define configTIMER_QUEUE_LENGTH                       10                              
  8. #define configTIMER_TASK_STACK_DEPTH               (configMINIMAL_STACK_SIZE*2)
复制代码

5.3、最后就是添加外设初始化代码,主函数里面添加任务代码。main.c代码如下

  1. #include "FreeRTOS.h"
  2. #include "task.h"
  3. #include "bsp_led.h"
  4. #include "bsp_usart.h"
  5. #include "bsp_key.h"
  6. #include "queue.h"
  7. #include "semphr.h"
  8. #include "event_groups.h"
  9. #include "timers.h"


  10. /*Function definition*/
  11. static void BSP_Init(void);

  12. static void Send_Task(void* pvParameters);
  13. static void Callback_LEDTOGGLE(void* pvParameters);

  14. static void AppTaskCreate(void);


  15. /*Task Handle*/
  16. static TaskHandle_t AppTaskCreate_Handle=NULL;
  17. static TaskHandle_t Send_Task_Handle=NULL;       //PRO:3


  18. /*Timer handle*/
  19. static TimerHandle_t Timer1=NULL;

  20. static void Callback_LEDTOGGLE(void* pvParameters)
  21. {
  22.   LED1_TOGGLE;
  23.   printf("TickValue=%d\n",(TickType_t)xTaskGetTickCount());
  24. }


  25. int main(void)
  26. {  
  27.   BaseType_t xReturn =pdPASS;

  28.   BSP_Init();

  29.   printf("FreeRTOS creates tasks dynamically!\r\n");

  30.   xReturn=xTaskCreate((TaskFunction_t)AppTaskCreate,\
  31.                       (const char *)"APPTASKCREATE",\
  32.                       (uint16_t)512,(void*)NULL,(UBaseType_t)1,\
  33.                       (TaskHandle_t*)&AppTaskCreate_Handle);
  34.   if(pdPASS==xReturn)
  35.     vTaskStartScheduler();
  36.   else
  37.     return -1;
  38.   while(1);
  39. }


  40. /*Hardware initialization*/
  41. static void BSP_Init(void)
  42. {
  43.   /*Use this priority grouping uniformly, never group again
  44.   * 4 bits for pre-emption priority
  45.   */

  46.   /*led initialization*/
  47.   LED_GPIO_Config();

  48.   /*Serial port initialization*/
  49.   USART_Config();

  50.   /*Key initialization*/
  51.   Key_GPIO_Config();
  52. }

  53. /***********
  54. *@Function name:SEND_Task
  55. *@description:SEND_Task body
  56. *@Parameter:None
  57. *@return:None
  58. *************/
  59. static void Send_Task(void* pvParameters)
  60. {

  61.   while(1)
  62.   {  
  63.     vTaskDelay(100);         //只是为了演示任务切换
  64.   }
  65. }

  66. static void AppTaskCreate(void)
  67. {
  68.   BaseType_t xReturn=pdPASS;
  69.   taskENTER_CRITICAL();

  70.   /* Create Timer1 Handle*/
  71.   Timer1=xTimerCreate((const char*)"1sec-toggle",(TickType_t)pdMS_TO_TICKS(1000),\
  72.                      (UBaseType_t)pdTRUE,(void*)1,(TimerCallbackFunction_t)Callback_LEDTOGGLE);
  73.   if(NULL!=Timer1)
  74.     printf("Timer1 created successfully.\r\n");
  75.   xTimerStart(Timer1,0);

  76.   /*SEND task*/
  77.   xReturn=xTaskCreate((TaskFunction_t)Send_Task,\
  78.                       (const char*)"SEND_TASK",\
  79.                       (uint16_t)512,(void*)NULL,(UBaseType_t)3,\
  80.                       (TaskHandle_t)&Send_Task_Handle);
  81.   if(pdPASS==xReturn)
  82.     printf("\r\nCreate Send_Task success!\r\n");

  83.   vTaskDelete(AppTaskCreate_Handle);
  84.   taskEXIT_CRITICAL();
  85. }

  86. /*********************************************END OF FILE**********************/
复制代码


————————————————
版权声明:SCCELE

收藏 评论0 发布时间:2022-10-28 15:57

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版