赞
踩
该文章参考了_杰杰_博主的文章,如有涉及侵权,将删除该文章。
首先复制裸机开发的工程模板,并且在其目录下创建文件夹FreeRTOS。之后,打开源代码(FreeRTOS的Source文件夹),将以下文件移动至工程中的FreeRTOS文件夹中:
文件 | 文件夹 |
---|---|
croutine.c | include |
event_groups.c | portable |
list.c | |
queue.c | |
stream_buffer.c | |
tasks.c | |
timers.c |
之后,打开FreeRTOS源码中的portable文件夹,需要移动Kiel、MemMang和RVS三个文件夹即可。
移植成功后如下图所示:
FreeRTOS_CORE
中的文件在FreeRTOS
目录下;
FreeRTOS_PORTABLE
heap_4.c
:portable -> MemMangport.c
:portable -> RVDS -> ARM_CM3 对于STM32F1而言,在"FreeRTOSv202212.01\FreeRTOS\Demo\CORTEX_STM32F103_Keil"目录下找到FreeRTOSConf.h
文件,将其移动至FreeRTOS工程模板的include
文件中。如图所示:
SysTick中断服务函数是一个非常重要的函数,FreeRTOS所有跟时间相关的事情都在里面处理,SysTick就是FreeRTOS的一个心跳时钟,驱动着FreeRTOS的运行,就像人的心跳一样,假如没有心跳,我们就相当于“死了”,同样的,FreeRTOS没有了心跳,那么它就会卡死在某个地方,不能进行任务调度,不能运行任何的东西,因此我们需要实现一个FreeRTOS的心跳时钟,FreeRTOS帮我们实现了SysTick的启动的配置:在port.c文件中已经实现vPortSetupTimerInterrupt()函数,并且FreeRTOS通用的SysTick中断服务函数也实现了:在port.c文件中已经实现xPortSysTickHandler()函数,所以移植的时候只需要我们在stm32f10x_it.c文件中实现我们对应(STM32)平台上的SysTick_Handler()函数即可。FreeRTOS为开发者考虑得特别多,PendSV_Handler()与SVC_Handler()这两个很重要的函数都帮我们实现了,在在port.c文件中已经实现xPortPendSVHandler()与vPortSVCHandler()函数,防止我们自己实现不了,那么在stm32f10x_it.c中就需要我们注释掉PendSV_Handler()与SVC_Handler()这两个函数了。
stm32f10x_it.c修改后的代码如下图:
与STM32F4不同,STM32F1的文件中并没有相关的宏来定义SysTick_Handler()、PendSV_Handler()与SVC_Handler()函数,故需要在FreeRTOSConf.h文件中添加以下宏定义:
/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS
standard names. */
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler
FreeRTOSConf.h添加宏定义后如图所示:
5. 执行
main.c文件代码如下:
#include "stm32f10x.h" // Device header #include "LEDTest.h" #include "FreeRTOS.h" #include "task.h" void led1_task(void* arg) { LEDTest_ON(); while(1) { LEDTest_Turn(); vTaskDelay(1000); } } int main(void) { LEDTest_Init(); xTaskCreate(led1_task, "led1_task", 64, NULL, 3, NULL); vTaskStartScheduler(); while(1) { } }
LEDTest.c文件代码如下:
#include "stm32f10x.h" // Device header #include "LEDTest.h" #define LEDTEST_RCC RCC_APB2Periph_GPIOC #define LEDTEST_GPIO GPIOC #define LEDTEST_PIN GPIO_Pin_13 void LEDTest_Init(void) { RCC_APB2PeriphClockCmd(LEDTEST_RCC, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = LEDTEST_PIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(LEDTEST_GPIO, &GPIO_InitStructure); GPIO_SetBits(LEDTEST_GPIO, LEDTEST_PIN); } void LEDTest_ON(void) { GPIO_ResetBits(LEDTEST_GPIO, LEDTEST_PIN); } void LEDTest_OFF(void) { GPIO_SetBits(LEDTEST_GPIO, LEDTEST_PIN); } void LEDTest_Turn(void) { if (GPIO_ReadOutputDataBit(LEDTEST_GPIO, LEDTEST_PIN) == 0) { GPIO_SetBits(LEDTEST_GPIO, LEDTEST_PIN); } else { GPIO_ResetBits(LEDTEST_GPIO, LEDTEST_PIN); } }
LEDTest.h文件代码如下:
#ifndef __LEDTEST_H
#define __LEDTEST_H
void LEDTest_Init(void);
void LEDTest_ON(void);
void LEDTest_OFF(void);
void LEDTest_Turn(void);
#endif
运行,STM32F1开始闪烁。至此,STM32F1的系统移植已经完成!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。