0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于STM32F103RCT6移植LiteOS-M-V5.0.2-Release

tianbeibei 2025-02-26 16:26 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

STM32F103RCT6移植LiteOS-M-V5.0.2-Release

下载源码

kernel_liteos_m: OpenHarmony-v5.0.2-Release

third_party_bounds_checking_function: OpenHarmony-v5.0.2-Release

third_party_cmsis: OpenHarmony-v5.0.2-Release

进入gitee界面后点击克隆/下载按钮,下载ZIP压缩包后解压缩。下载路径自定义。

使用STM32CubeMX创建工程模板

配置晶振和烧写口

NVIC配置(默认配置,未修改)

晶振配置

系统配置

时钟配置

工程配置

生成路径根据实际情况配置

代码生成配置

生成代码

image-20250225111320517

配置使用Jlink+SWD方式下载程序

  1. 配置Jlink

image-20250225112003472

  1. 配置SWD模式image-20250225112051929

  2. 配置烧写成功后复位运行

    image-20250225112216209

编译成功

image-20250225112332868

模板添加目录

原有目录结构

image-20250225112612973

增加目录

  1. APP- 应用代码
  2. Config- 配置文件
  3. Lib- 库文件
  4. Middleware- 中间件

现有目录

image-20250225113306660

添加日志库-simplelogger

simplelogger: 一款简易的日库库,主要对接 J-Link RTT 使用 - Gitee.com

下载源文件

  1. 进入Middleware文件夹
  2. 使用Git Base Here进入Git控制台
  3. 执行命令git clone https://gitee.com/Newcapec_cn/simplelogger.git

image-20250225113528944

添加源文件

  1. 添加Middleware\simplelogger\src\*.c
  2. 添加Middleware\simplelogger\port\*.c
  3. 添加Middleware\simplelogger\rtt\*.c

image-20250225115603597

配置头文件路径

  1. 增加头文件路径..\Middleware\simplelogger\inc

image-20250225115839811

增加测试代码

  1. APP文件夹创建APP_main.c文件,文件内容为
#include "slog.h"

void app_main(void) {
    slog_test();

    while (1) {
        ;
    }
}

  1. 添加APP_main.c文件到工程

image-20250225120808761

  1. 在模板main函数的while循环中添加app_main函数
void app_main(void);
app_main();

完整main函数如下

	
/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    void app_main(void);
    app_main();
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

编译运行测试

测试成功界面

image-20250225134706999

移植LiteOS-M

移植源码

  1. kernel_liteos_m-OpenHarmony-v5.0.2-Releasearchkalkernelutils文件夹拷贝至项目Middleware\liteos-m文件夹

  2. 删除文件夹

    Middleware\liteos-m\arch\arm\arm9

    Middleware\liteos-m\arch\arm\arm4

    Middleware\liteos-m\arch\arm\arm7

    Middleware\liteos-m\arch\arm\arm33

    Middleware\liteos-m\arch\arm\arm55

    Middleware\liteos-m\arch\csky

    Middleware\liteos-m\arch\risc-v

    Middleware\liteos-m\arch\xtensa

    Middleware\liteos-m\kal\libc

    Middleware\liteos-m\kal\libsec

    Middleware\liteos-m\kal\posix

  3. Middleware\liteos-m路径下创建文件夹bounds_checking

  4. third_party_bounds_checking_function-OpenHarmony-v5.0.2-Releaseincludesrc文件夹拷贝至项目Middleware\liteos-m\bounds_checking文件夹中

  5. 删除非源码文件(可不操作)

文件结构为:

liteos-m
├── arch
│ ├── arm
│ │ ├── common
│ │ │ ├── los_common_interrupt.c
│ │ │ └── los_common_interrupt.h
│ │ ├── cortex-m3
│ │ │ └── keil
│ │ │     ├── los_arch_atomic.h
│ │ │     ├── los_arch_context.h
│ │ │     ├── los_arch_interrupt.h
│ │ │     ├── los_arch_timer.h
│ │ │     ├── los_atomic.S
│ │ │     ├── los_context.c
│ │ │     ├── los_dispatch.S
│ │ │     ├── los_exc.S
│ │ │     ├── los_interrupt.c
│ │ │     ├── los_startup.s
│ │ │     └── los_timer.c
│ │ └── include
│ │     └── arch_elf.h
│ └── include
│     ├── los_arch.h
│     ├── los_atomic.h
│     ├── los_context.h
│     ├── los_interrupt.h
│     ├── los_mpu.h
│     └── los_timer.h
├── bounds_checking
│ ├── include
│ │ ├── securec.h
│ │ └── securectype.h
│ └── src
│     ├── fscanf_s.c
│     ├── fwscanf_s.c
│     ├── gets_s.c
│     ├── input.inl
│     ├── memcpy_s.c
│     ├── memmove_s.c
│     ├── memset_s.c
│     ├── output.inl
│     ├── scanf_s.c
│     ├── secinput.h
│     ├── securecutil.c
│     ├── securecutil.h
│     ├── secureinput_a.c
│     ├── secureinput_w.c
│     ├── secureprintoutput_a.c
│     ├── secureprintoutput.h
│     ├── secureprintoutput_w.c
│     ├── snprintf_s.c
│     ├── sprintf_s.c
│     ├── sscanf_s.c
│     ├── strcat_s.c
│     ├── strcpy_s.c
│     ├── strncat_s.c
│     ├── strncpy_s.c
│     ├── strtok_s.c
│     ├── swprintf_s.c
│     ├── swscanf_s.c
│     ├── vfscanf_s.c
│     ├── vfwscanf_s.c
│     ├── vscanf_s.c
│     ├── vsnprintf_s.c
│     ├── vsprintf_s.c
│     ├── vsscanf_s.c
│     ├── vswprintf_s.c
│     ├── vswscanf_s.c
│     ├── vwscanf_s.c
│     ├── wcscat_s.c
│     ├── wcscpy_s.c
│     ├── wcsncat_s.c
│     ├── wcsncpy_s.c
│     ├── wcstok_s.c
│     ├── wmemcpy_s.c
│     ├── wmemmove_s.c
│     └── wscanf_s.c
├── kal
│ └── cmsis
│     ├── cmsis_liteos2.c
│     ├── cmsis_os2.h
│     ├── cmsis_os.h
│     ├── hos_cmsis_adp.h
│     └── kal.h
├── kernel
│ ├── include
│ │ ├── los_config.h
│ │ ├── los_event.h
│ │ ├── los_membox.h
│ │ ├── los_memory.h
│ │ ├── los_mux.h
│ │ ├── los_queue.h
│ │ ├── los_sched.h
│ │ ├── los_sem.h
│ │ ├── los_sortlink.h
│ │ ├── los_swtmr.h
│ │ ├── los_task.h
│ │ └── los_tick.h
│ └── src
│     ├── los_event.c
│     ├── los_init.c
│     ├── los_mux.c
│     ├── los_queue.c
│     ├── los_sched.c
│     ├── los_sem.c
│     ├── los_sortlink.c
│     ├── los_swtmr.c
│     ├── los_task.c
│     ├── los_tick.c
│     └── mm
│         ├── los_membox.c
│         └── los_memory.c
└── utils
    ├── internal
    │ ├── los_hook_types.h
    │ └── los_hook_types_parse.h
    ├── los_compiler.h
    ├── los_debug.c
    ├── los_debug.h
    ├── los_error.c
    ├── los_error.h
    ├── los_hook.c
    ├── los_hook.h
    ├── los_list.h
    └── los_reg.h

19 directories, 106 files

项目添加源文件

image-20250225164219708

image-20250225164227728

image-20250225164237060

image-20250225164245180

添加头文件路径

..\Middleware\simplelogger\inc
..\Middleware\liteos-m\arch\include
..\Middleware\liteos-m\arch\arm\include
..\Middleware\liteos-m\arch\arm\cortex-m3\keil
..\Middleware\liteos-m\arch\arm\common
..\Middleware\liteos-m\kernel\include
..\Middleware\liteos-m\utils
..\Middleware\liteos-m\bounds_checking\include

image-20250225164411780

编译器选择

Use default compiler version 6

Use MicroLlB

C语言使用C11规则

C语言优化等级-0

解决target_config.h未找到问题

  1. Config文件夹下创建空文件ARMCM3.htarget_config.h

  2. target_config.h添加以下内容

    /*
     * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
     * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
     *
     * Redistribution and use in source and binary forms, with or without modification,
     * are permitted provided that the following conditions are met:
     *
     * 1. Redistributions of source code must retain the above copyright notice, this list of
     *    conditions and the following disclaimer.
     *
     * 2. Redistributions in binary form must reproduce the above copyright notice, this list
     *    of conditions and the following disclaimer in the documentation and/or other materials
     *    provided with the distribution.
     *
     * 3. Neither the name of the copyright holder nor the names of its contributors may be used
     *    to endorse or promote products derived from this software without specific prior written
     *    permission.
     *
     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
     * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
     * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
     * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     */
    
    /**@defgroup los_config System configuration items
     * @ingroup kernel
     */
    
    #ifndef _TARGET_CONFIG_H
    #define _TARGET_CONFIG_H
    
    #include "ARMCM3.h"
    #include "stm32f1xx_hal.h"
    #include "los_common_interrupt.h"
    
    #ifdef __cplusplus
    #if __cplusplus
    extern "C" {
    #endif /* __cplusplus */
    #endif /* __cplusplus */
    
    /*=============================================================================
                                            System clock module configuration
    =============================================================================*/
    #define OS_SYS_CLOCK                            SystemCoreClock
    #define LOSCFG_BASE_CORE_TICK_PER_SECOND        (1000UL)
    #define LOSCFG_BASE_CORE_TICK_WTIMER            0
    #define LOSCFG_BASE_CORE_TICK_RESPONSE_MAX      (0xFFFFFFFFUL)
    /*=============================================================================
                                            Hardware interrupt module configuration
    =============================================================================*/
    #define LOSCFG_PLATFORM_HWI                     0
    #define LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT     0
    #define LOSCFG_PLATFORM_HWI_LIMIT               128
    /*=============================================================================
                                           Task module configuration
    =============================================================================*/
    #define LOSCFG_BASE_CORE_TSK_LIMIT              24
    #define LOSCFG_BASE_CORE_TSK_IDLE_STACK_SIZE    (0x500U)
    #define LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE (0x2D0U)
    #define LOSCFG_BASE_CORE_TSK_MIN_STACK_SIZE     (0x130U)
    #define LOSCFG_BASE_CORE_TIMESLICE              1
    #define LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT      20000
    /*=============================================================================
                                           Semaphore module configuration
    =============================================================================*/
    #define LOSCFG_BASE_IPC_SEM                     1
    #define LOSCFG_BASE_IPC_SEM_LIMIT               48
    /*=============================================================================
                                           Mutex module configuration
    =============================================================================*/
    #define LOSCFG_BASE_IPC_MUX                     1
    #define LOSCFG_BASE_IPC_MUX_LIMIT               24
    /*=============================================================================
                                           Queue module configuration
    =============================================================================*/
    #define LOSCFG_BASE_IPC_QUEUE                   1
    #define LOSCFG_BASE_IPC_QUEUE_LIMIT             24
    /*=============================================================================
                                           Software timer module configuration
    =============================================================================*/
    #define LOSCFG_BASE_CORE_SWTMR                  1
    #define LOSCFG_BASE_CORE_SWTMR_ALIGN            1
    #define LOSCFG_BASE_CORE_SWTMR_LIMIT            48
    /*=============================================================================
                                           Memory module configuration
    =============================================================================*/
    #define LOSCFG_SYS_EXTERNAL_HEAP                0
    #define LOSCFG_SYS_HEAP_SIZE                    0x00008000
    #define LOSCFG_MEM_MUL_POOL                     1
    #define OS_SYS_MEM_NUM                          20
    /*=============================================================================
                                           Exception module configuration
    =============================================================================*/
    #define LOSCFG_PLATFORM_EXC                     0
    /* =============================================================================
                                           PM module configuration
    ============================================================================= */
    #define LOSCFG_KERNEL_PM                        0
    /* =============================================================================
                                           printf module configuration
    ============================================================================= */
    #define LOSCFG_KERNEL_PRINTF                    2
    
    #ifdef __cplusplus
    #if __cplusplus
    }
    #endif /* __cplusplus */
    #endif /* __cplusplus */
    
    #endif /* _TARGET_CONFIG_H */
    
    
  3. 添加Config文件夹为头文件路径

    image-20250225164349678

解决HWI_PROC_FUNC未定义问题

Middleware\liteos-m\arch\arm\common\los_common_interrupt.h中添加以下代码

/* ---> liteos-m add */
#if (LOSCFG_PLATFORM_HWI_WITH_ARG == 1)
typedef VOID (*HWI_PROC_FUNC)(VOID *parm);
#else
typedef VOID (*HWI_PROC_FUNC)(void);
#endif
/* ---/ */

image-20250225143651754

强制内存池4字节对齐

Middleware\liteos-m\kernel\src\mm\los_memory.c53行 由STATIC UINT8 g_memStart[LOSCFG_SYS_HEAP_SIZE];修改为STATIC UINT8 __attribute__((aligned(4))) g_memStart[LOSCFG_SYS_HEAP_SIZE];增加__attribute__((aligned(4)))预处理

修改SysTick_Config参数

Middleware\liteos-m\arch\arm\cortex-m3\keil\los_timer.c文件中调用SysTick_Config接口的参数 由LOSCFG_BASE_CORE_TICK_RESPONSE_MAX修改为OS_SYS_CLOCK / LOSCFG_BASE_CORE_TICK_PER_SECOND

移植PendSV_Handler

PendSV_Handler函数中调用HalPendSV接口

void PendSV_Handler(void)
{
  /* USER CODE BEGIN PendSV_IRQn 0 */
  void HalPendSV(void);
  HalPendSV();
  /* USER CODE END PendSV_IRQn 0 */
  /* USER CODE BEGIN PendSV_IRQn 1 */

  /* USER CODE END PendSV_IRQn 1 */
}

移植OsTickHandler

SysTick_Handler函数中调用OsTickHandler接口

/**
  * @brief This function handles System tick timer.
  */
void SysTick_Handler(void)
{
  /* USER CODE BEGIN SysTick_IRQn 0 */
  void OsTickHandler(void);
  OsTickHandler();
  /* USER CODE END SysTick_IRQn 0 */

  /* USER CODE BEGIN SysTick_IRQn 1 */

  /* USER CODE END SysTick_IRQn 1 */
}

增加内核打印接口

  1. HalConsoleOutput增加调用Jlink-RTT打印功能

    WEAK VOID HalConsoleOutput(LogModuleType type, INT32 level, const CHAR *fmt, ...)
    {
        /* ---> liteos-m add */
        #include "../rtt/SEGGER_RTT.h"
        va_list ParamList;
        
        va_start(ParamList, fmt);
        SEGGER_RTT_vprintf(0, fmt, &ParamList);
        va_end(ParamList);
        /* ---/ */
    }
    

测试LiteOS-M

  1. APP_main.c添加测试代码,其完整文件为:

    #include "slog.h"
    #include "los_task.h"
    
    VOID taskSampleEntry2(VOID) {
        while (1) {
            LOS_TaskDelay(1000);
            log_v("taskSampleEntry2 running...");
        }
    }
    
    VOID taskSampleEntry1(VOID) {
        while (1) {
            LOS_TaskDelay(2000);
            log_v("taskSampleEntry1 running...");
        }
    }
    
    UINT32 taskSample(VOID) {
        UINT32           uwRet;
        UINT32           taskID1, taskID2;
        TSK_INIT_PARAM_S stTask1 = {0};
        stTask1.pfnTaskEntry     = (TSK_ENTRY_FUNC)taskSampleEntry1;
        stTask1.uwStackSize      = 0X1000;
        stTask1.pcName           = "taskSampleEntry1";
        stTask1.usTaskPrio       = 6;
        uwRet                    = LOS_TaskCreate(&taskID1, &stTask1);
        if (uwRet != LOS_OK) {
            log_v("create task1 failed\n");
        }
    
        stTask1.pfnTaskEntry = (TSK_ENTRY_FUNC)taskSampleEntry2;
        stTask1.uwStackSize  = 0X1000;
        stTask1.pcName       = "taskSampleEntry2";
        stTask1.usTaskPrio   = 7;
        uwRet                = LOS_TaskCreate(&taskID2, &stTask1);
        if (uwRet != LOS_OK) {
            log_v("create task2 failed\n");
        }
        return LOS_OK;
    }
    
    void app_main(void) {
        unsigned int ret;
        
        slog_test();
        ret = LOS_KernelInit();
        if (ret == LOS_OK) {
            taskSample();
            LOS_Start();
        }
    
        while (1) {
            ;
        }
    }
    
    
  2. 测试成功界面为

image-20250225164639019

适配 CMSIS

添加源码

Middleware\liteos-m\kal\cmsis\cmsis_liteos2.c

修改源码

third_party_cmsis-OpenHarmony-v5.0.2-Release\CMSIS\RTOS2\Include\cmsis_os2.h覆盖Middleware\liteos-m\kal\cmsis\cmsis_os2.h

添加头文件路径

..\Middleware\liteos-m\kal\cmsis

image-20250225174721583

创建使用cmsis_os2接口的源码

  1. APP文件夹中创建源文件cmsis_os2_creat_thread.c,代码如下:

    /**
     * @file cmsis_os2_creat_thread.c
     * @author TianBeiBei (tianbeibei5628@dingtalk.com)
     * @brief
     * @version 0.1
     * @date 2025-02-25
     *
     * @copyright Copyright (c) 2025
     *
     */
    #include "slog.h"
    #include "cmsis_os2.h"
    
    #define MINI_TASK_DELAY_MS (1 * 1000)
    
    /* Definitions for BelowNormalTask */
    osThreadId_t         BelowNormalTaskHandle;
    const osThreadAttr_t BelowNormalTask_attributes = {
        .name       = "BelowNormalTask",
        .stack_size = 1024 * 4,
        .priority   = (osPriority_t)osPriorityBelowNormal,
    };
    /* Definitions for NormalTask */
    osThreadId_t         NormalTaskHandle;
    const osThreadAttr_t NormalTask_attributes = {
        .name       = "NormalTask",
        .stack_size = 1024 * 4,
        .priority   = (osPriority_t)osPriorityNormal,
    };
    /* Definitions for LowTask */
    osThreadId_t         LowTaskHandle;
    const osThreadAttr_t LowTask_attributes = {
        .name       = "LowTask",
        .stack_size = 1024 * 4,
        .priority   = (osPriority_t)osPriorityLow,
    };
    
    void low_task(void *argument) {
        for (;;) {
            log_v("low_task runing");
            osDelay(MINI_TASK_DELAY_MS * 3);
        }
    #if 0
        osThreadExit();/* 任务退出 */
    #endif
    }
    
    void normal_task(void *argument) {
        for (;;) {
            log_v("normal_task runing");
            osDelay(MINI_TASK_DELAY_MS * 2);
        }
    #if 0
        osThreadExit();/* 任务退出 */
    #endif
    }
    
    void below_normal_task(void *argument) {
        for (;;) {
            log_v("below_normal_task runing");
            osDelay(MINI_TASK_DELAY_MS * 1);
        }
    #if 0
        osThreadExit();/* 任务退出 */
    #endif
    }
    
    void liteos_m_thread_init(void) {
        /* Create the thread(s) */
        /* creation of NormalTask */
        NormalTaskHandle = osThreadNew(normal_task, NULL, &NormalTask_attributes);
        /* creation of BelowNormalTask */
        BelowNormalTaskHandle = osThreadNew(below_normal_task, NULL, &BelowNormalTask_attributes);
        /* creation of LowTask */
        LowTaskHandle = osThreadNew(low_task, NULL, &LowTask_attributes);
    }
    
    void cmsis_os2_main(void) {
        /* Init scheduler */
        osKernelInitialize();
    
        /* Call init function for freertos objects (in freertos.c) */
        liteos_m_thread_init();
    
        /* Start scheduler */
        osKernelStart();
    }
    
    
  2. cmsis_os2_creat_thread.c文件添加到工程中

image-20250225175348631

  1. 修改APP_main.c源码,添加调用cmsis_os2接口的代码,不再调用源码接口,修改后的源码如下:
    #include "slog.h"
    #include "los_task.h"
    
    VOID taskSampleEntry2(VOID) {
        while (1) {
            log_v("taskSampleEntry2 running...");
            LOS_TaskDelay(1000);
        }
    }
    
    VOID taskSampleEntry1(VOID) {
        while (1) {
            log_v("taskSampleEntry1 running...");
            LOS_TaskDelay(2000);
        }
    }
    
    UINT32 taskSample(VOID) {
        UINT32           uwRet;
        UINT32           taskID1, taskID2;
        TSK_INIT_PARAM_S stTask1 = {0};
        stTask1.pfnTaskEntry     = (TSK_ENTRY_FUNC)taskSampleEntry1;
        stTask1.uwStackSize      = 0X1000;
        stTask1.pcName           = "taskSampleEntry1";
        stTask1.usTaskPrio       = 6;
        uwRet                    = LOS_TaskCreate(&taskID1, &stTask1);
        if (uwRet != LOS_OK) {
            log_v("create task1 failed\n");
        }
    
        stTask1.pfnTaskEntry = (TSK_ENTRY_FUNC)taskSampleEntry2;
        stTask1.uwStackSize  = 0X1000;
        stTask1.pcName       = "taskSampleEntry2";
        stTask1.usTaskPrio   = 7;
        uwRet                = LOS_TaskCreate(&taskID2, &stTask1);
        if (uwRet != LOS_OK) {
            log_v("create task2 failed\n");
        }
        return LOS_OK;
    }
    
    void app_main(void) {
        unsigned int ret;
    
        slog_test();
    
    #if 1 /* 0-原接口 1-cmsis_os2接口 */
        void cmsis_os2_main(void);
        cmsis_os2_main();
    #else
        ret = LOS_KernelInit();
        if (ret == LOS_OK) {
            taskSample();
            LOS_Start();
        }
    #endif
    
        while (1) {
            ;
        }
    }
    
    

测试成功界面如下:

image-20250225181020579

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 移植
    +关注

    关注

    1

    文章

    407

    浏览量

    29220
  • Liteos
    +关注

    关注

    10

    文章

    33

    浏览量

    48366
  • STM32F103RCT6
    +关注

    关注

    10

    文章

    24

    浏览量

    11018
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    STM32F103RCT6是什么?STM32F103RCT6有哪些特性?

    请问下STM32F103RCT6是什么?STM32F103RCT6有哪些特性?
    发表于 07-19 06:37

    STM32F103RCT6是什么

    STM32F103RCT6STM32F103RCT6是一种嵌入式-微控制器的集成电路(IC),32位 Cortex-M3内核处理器,速度是72MHz,程序存储器容量是256KB,程序存储器类型
    发表于 08-06 08:36

    STM32F103RCT6数据手册

    STM32F103RCT6芯片,相关学习资料,SYM32系列芯片,范围广,资料齐面,介绍全面。
    发表于 05-13 15:39 791次下载

    STM32F103RCT6用SPI和FATFS访问SD卡

    STM32F103RCT6用SPI和FATFS访问SD卡,参考了正点原子源码
    发表于 08-03 18:20 143次下载

    stm32f103rct6引脚图及使用手册

    本文介绍stm32f103rct6引脚图、stm32f103rct6电路图、stm32f103rct6芯片介绍、使用手册图解。
    发表于 08-03 16:44 22.5w次阅读
    <b class='flag-5'>stm32f103rct6</b>引脚图及使用手册

    STM32F103RCT6

    STM32F103RCT6引脚定义图
    发表于 02-15 23:52 125次下载

    STM32F103RCT6 数据手册

    STM32F103RCT6 数据手册
    发表于 09-20 10:40 302次下载
    <b class='flag-5'>STM32F103RCT6</b> 数据手册

    STM32F103RCT6的最小系统原理图免费下载

    本文档的主要内容详细介绍的是STM32F103RCT6的最小系统原理图免费下载。
    发表于 08-15 08:00 598次下载
    <b class='flag-5'>STM32F103RCT6</b>的最小系统原理图免费下载

    STM32F103RCT6移植STM32F103C8T6需要注意那些事项

    本文档的主要内容详细介绍的是STM32F103RCT6移植STM32F103C8T6需要注意那些事项。
    发表于 11-15 08:00 40次下载
    <b class='flag-5'>STM32F103RCT6</b><b class='flag-5'>移植</b>到<b class='flag-5'>STM32F103C8T6</b>需要注意那些事项

    STM32F103RCT6核心板-AD原理图

    STM32F103RCT6核心板-AD原理图免费下载。
    发表于 05-21 11:19 205次下载

    基于STM32F103RCT6 移植W5500 最新ioLibrary_Driver(一)

    基于STM32F103RCT6 移植W5500 最新ioLibrary_Driver1. ioLibrary_Driver 1.1 ​​​​​​​概述The ioLibrary means
    发表于 12-04 16:21 42次下载
    基于<b class='flag-5'>STM32F103RCT6</b> <b class='flag-5'>移植</b>W5500 最新ioLibrary_Driver(一)

    STM32F103RCT6 基于STM32Cube_FW_F1_V1.8.0库建立工程模板

    STM32F103RCT6 基于STM32Cube_FW_F1_V1.8.0库建立工程模板
    发表于 12-08 20:36 47次下载
    <b class='flag-5'>STM32F103RCT6</b> 基于<b class='flag-5'>STM32Cube_FW_F1_V</b>1.8.0库建立工程模板

    STM32F103rct6标准版的电路原理图

    本文档的主要内容详细介绍的是STM32F103rct6标准版的电路原理图免费下载。
    发表于 03-21 14:56 0次下载

    STM32F103RCT6最小系统(高清PDF版)

    STM32F103RCT6最小系统全(高清PDF版)免费下载。
    发表于 07-31 11:04 0次下载

    STM32F103RCT6的原理图

    STM32F103RCT6的原理图免费下载。
    发表于 07-26 15:38 0次下载