大家好了解了Stm32微控制器的编程后,我决定尝试安装(实时操作系统)RTOS-FreeRTOS,并遇到了许多困难。互联网上有很多文章,但是我没有找到任何明确的说明,所以我问每个对cat感兴趣的人。因此,对于初学者来说,让我们决定您需要具备的条件:- Stm32VL发现调试板
- 已安装IDE Keil ARM 5及更高版本
- 梳理新事物的愿望
如果您已经在Keil中为STM32F1x系列开发了任何东西,则可以跳过本段。首先,您需要安装STM32F1x系列的开发包,方法如下:- 我们启动Keil。
- 单击面板中的Pack Installer按钮

- 在打开的窗口中,单击“检查更新”按钮(我们正在等待要更新的软件包列表)
- 在树中,选择STMicroelectronics-> STM32F1系列-> STM32F100并安装所有软件包
这样就完成了开发环境的准备。我们直接使用FreeRTOS进行项目的创建。首先要做的是从官方网站www.freertos.org下载最新的RTOS发行版,在撰写本文时,最新版本是FreeRTOSv9.0.0。因此,我们有了一个令人印象深刻的档案,将其解压缩到任何地方(我马上说我们不需要99%的档案,因此不要担心生成的文件夹的大小,我有200 MB以上)。现在我们需要在Keil中创建一个新项目。
我将其命名为FreeRTOSDemo,您可以选择任何合适的名称,主要是项目路径中不应包含空格和俄语字母。现在我们需要选择我们使用STM32F100RB芯片在STM32VLDiscovery调试板上测试过的芯片,所以我选择了它。
选择芯片后,您需要选择我们将使用的库。我们将需要CMSIS库和StdPeriph。下图显示了最少的组件选择,以检查RTOS的运行并通过二极管闪烁(这适用于StdPeriph库,需要CMSIS)。

因此,我们创建了一个项目,如下所示:
接下来,为了方便起见,我们在项目中创建了多个组,以便稍后会有文件混搭。
一切准备就绪,可以将RTOS文件复制到项目中。在项目文件夹中创建一个FreeRTOS文件夹。从FreeRTOSv9.0.0 \ FreeRTOS \ Source \文件夹中,将所有* .s文件复制到创建的FreeRTOS文件夹中。在那里,我们复制了include文件夹。从FreeRTOSv9.0.0 \ FreeRTOS \ Source \ Portable \ RVDS \ ARM_CM3 \文件夹中,将* .s和* .h文件复制到我们项目的FreeRTOS文件夹中的相应位置。从FreeRTOSv9.0.0 \ FreeRTOS \ Source \ Portable \ MemMang \文件夹中,复制heap_2.c文件。从文件夹FreeRTOSv9.0.0 \ FreeRTOS \ Demo \ CORTEX_STM32F103_Keil \复制文件FreeRTOSConfig.h。完成所有操作后,将发生以下情况:
接下来,我们需要将文件添加到项目中的相应组,并使用程序的主体文本创建main.cc文件。结果,应获得以下项目结构。
为了使项目能够在其设置中进行编译,必须指定* .h文件的所有路径,并注册指令USE_STDPERIPH_DRIVER。
现在仍然需要更改文件FreeRTOSConfig.h中的几行,以进行正确的操作:#define configCPU_CLOCK_HZ ( ( unsigned long ) 72000000 )
#define configCPU_CLOCK_HZ ( ( unsigned long ) 24000000 )
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 17 * 1024 ) )
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 5 * 1024 ) )
并在#define FREERTOS_CONFIG_H之后添加以下行#define xPortSysTickHandler SysTick_Handler
#define xPortPendSVHandler PendSV_Handler
#define vPortSVCHandler SVC_Handler
之后,在main.c文件中,我们编写了用于闪烁LED的最简单程序。#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
GPIO_InitTypeDef port;
uint8_t state;
void vFreeRTOSInitAll()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_StructInit(&port);
port.GPIO_Mode = GPIO_Mode_Out_PP;
port.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_8;
port.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &port);
}
void vLedTask (void *pvParameters)
{
while(1)
{
if (state == 0)
{
GPIO_SetBits(GPIOC,GPIO_Pin_9);
GPIO_ResetBits(GPIOC,GPIO_Pin_8);
state = 1;
vTaskDelay(500);
}
else
{
GPIO_ResetBits(GPIOC,GPIO_Pin_9);
GPIO_SetBits(GPIOC,GPIO_Pin_8);
state = 0;
vTaskDelay(500);
}
}
vTaskDelete(NULL);
}
int main(void)
{
vFreeRTOSInitAll();
xTaskCreate(vLedTask,(signed char*)"LedTask", configMINIMAL_STACK_SIZE,
NULL, tskIDLE_PRIORITY + 1, NULL);
vTaskStartScheduler();
}
现在,您可以组装项目并将固件填充到微控制器中,重启后,观察闪烁的LED。