美文网首页
5. 基于STM32CubeIDE搭建开发环境 --- 移植Fr

5. 基于STM32CubeIDE搭建开发环境 --- 移植Fr

作者: mz8023yt | 来源:发表于2019-12-28 01:55 被阅读0次

    本博客中示例代码下载路径: https://github.com/maziot-stm32/A1/releases/tag/v0.5

    移植策略

    移植 FreeRTOS 到 STM32CubeIDE 工程, 有两个策略:

    1. 参考野火的文档, 从官网下载源码, 手动移植到 A1 工程中.
    2. 直接在 STMCubeIDE 创建工程的时候, 勾选 FreeRTOS 组件.
    新建工程时勾选FreeRTOS组件

    由于使用 STMCubeIDE 自带的 FreeRTOS 组件必须要使用 CMSIS 二次封装后的接口(上图下拉列表项), 这里我选择策略1, 基于野火的文档, 手动移植官网源码.

    前期准备

    需要准备好以下资源:

    1. FreeRTOSv9.0.0.zip 源码包
    2. 《FreeRTOS 内核实现与应用开发实战—基于STM32》
    3. 野火提供的 FreeRTOSConfig.h 文件

    这些资源我都已经上传到 github 上的资源仓库中, 仓库路径: https://github.com/maziot-stm32/A1.Resource

    移植FreeRTOS

    移植的步骤概述:

    1. 解压 FreeRTOSv9.0.0.zip 源码包

    2. 在工程中 MAZ_Vendors 目录下创建 FreeRTOS 目录, 并按照下图结构依次创建 include、portable/GCC/ARM_CM3、portable/MemMang、source 目录


      工程下创建目录
    3. 将解压后 FreeRTOS 源码中 source/include、source/portable/GCC/ARM_CM3、source/portable/MemMang、source 目录下的文件拷贝到工程对应目录中. 将 A1.Resource 中提供的 FreeRTOSConfig.h 拷贝到 MAZ_Vendors/FreeRTOS 目录下.

    拷贝文件到工程中
    1. 修改 stm32f1xx_it.c 文件
      删除 SVC_Handler 和 PendSV_Handler 函数,
      修改 SysTick_Handler 函数,
      添加使用的API接口对应的头文件

      #include "FreeRTOS.h"
      #include "port.h"
      #include "task.h"
      
      #if 0 // 删除 SVC_Handler 和 PendSV_Handler 函数
      /**
        * @brief This function handles System service call via SWI instruction.
        */
      void SVC_Handler(void)
      {
      
      }
      
      /**
        * @brief This function handles Pendable request for system service.
        */
      void PendSV_Handler(void)
      {
      
      }
      #endif
      
      /**
        * @brief This function handles System tick timer.
        */
      void SysTick_Handler(void)
      {
          HAL_IncTick();
      #if (INCLUDE_xTaskGetSchedulerState == 1 )
          if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) {
      #endif /* INCLUDE_xTaskGetSchedulerState */
              xPortSysTickHandler();
      #if (INCLUDE_xTaskGetSchedulerState == 1 )
          }
      #endif /* INCLUDE_xTaskGetSchedulerState */
      }
      
    2. 最后, 编译并解决编译错误.

    至此 FreeRTOS 移植结束. 准确的说, 只能说 FreeRTOS 集成结束, 因为配置文件我们使用的是野火配置好的 FreeRTOSConfig.h 文件, 板级支持文件我们使用的是 ST 为 FreeRTOS 编写好的 port.c 文件. 我们仅仅只是代码的搬运工.

    创建点灯task

    FreeRTOS 移植好了, 现在得跑一个 Demo 验证下是否移植 OK.
    这里依然使用是 STM32F103RC 最小系统板点个灯验证.

    在 main.c 添加如下代码:

    #include "main.h"
    #include "FreeRTOS.h"
    #include "task.h"
    
    static TaskHandle_t MAZ_App_led_tsk_handle = NULL;
    static void MAZ_App_led_task(void *pvParameters);
    
    #define LED0_Pin        GPIO_PIN_8
    #define LED0_GPIO_Port  GPIOA
    #define LED1_Pin        GPIO_PIN_2
    #define LED1_GPIO_Port  GPIOD
    
    #define LED_ON          GPIO_PIN_RESET
    #define LED_OFF         GPIO_PIN_SET
    
    /**
     * @brief  Init led
     * @retval None
     */
    void led_init(void)
    {
        GPIO_InitTypeDef GPIO_InitStruct = { 0 };
    
        /* GPIO Ports Clock Enable */
        __HAL_RCC_GPIOD_CLK_ENABLE();
        __HAL_RCC_GPIOA_CLK_ENABLE();
    
        /*Configure GPIO pin : LED0_Pin */
        GPIO_InitStruct.Pin = LED0_Pin;
        GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
        GPIO_InitStruct.Pull = GPIO_PULLUP;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
        HAL_GPIO_Init(LED0_GPIO_Port, &GPIO_InitStruct);
    
        /*Configure GPIO pin : LED1_Pin */
        GPIO_InitStruct.Pin = LED1_Pin;
        GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
        GPIO_InitStruct.Pull = GPIO_PULLUP;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
        HAL_GPIO_Init(LED1_GPIO_Port, &GPIO_InitStruct);
    }
    
    /**
     * @brief  The application entry point.
     * @retval int
     */
    int main(void)
    {
        HAL_Init();
        SystemClock_Config();
        MX_GPIO_Init();
        led_init();
    
        BaseType_t xReturn = pdPASS;
        xReturn = xTaskCreate((TaskFunction_t) MAZ_App_led_task,
                              (const char*) "MAZ_App_led_task", (uint16_t) 512,
                              (void*) NULL, (UBaseType_t) 2,
                              (TaskHandle_t*) &MAZ_App_led_tsk_handle);
        if (pdPASS == xReturn)
            vTaskStartScheduler();
    
        return -1;
    }
    
    static void MAZ_App_led_task(void *parameter)
    {
        while (1)
        {
            HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, LED_ON);
            HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, LED_ON);
            vTaskDelay(200);
            HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, LED_OFF);
            HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, LED_OFF);
            vTaskDelay(200);
        }
    }
    

    编译, 烧写, 运行, 可以在板子上看到两个 LED 循环闪烁.

    相关文章

      网友评论

          本文标题:5. 基于STM32CubeIDE搭建开发环境 --- 移植Fr

          本文链接:https://www.haomeiwen.com/subject/afbjoctx.html