为Stm32vlDiscovery安装FreeRTOS

大家好
了解了Stm32微控制器的编程后,我决定尝试安装(实时操作系统)RTOS-FreeRTOS,并遇到了许多困难。互联网上有很多文章,但是我没有找到任何明确的说明,所以我问每个对cat感兴趣的人。

因此,对于初学者来说,让我们决定您需要具备的条件:
  • Stm32VL发现调试板
  • 已安装IDE Keil ARM 5及更高版本
  • 梳理新事物的愿望

如果您已经在Keil中为STM32F1x系列开发了任何东西,则可以跳过本段。首先,您需要安装STM32F1x系列的开发包,方法如下:
  1. 我们启动Keil。
  2. 单击面板中的Pack Installer按钮
  3. 在打开的窗口中,单击“检查更新”按钮(我们正在等待要更新的软件包列表)
  4. 在树中,选择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。

Source: https://habr.com/ru/post/zh-CN399907/


All Articles