赞
踩
目录
之前就了解到Liteos,想要移植到STM32,奈何资料太少(反正楼主很难找到),最近有了点时间,又搜了一下,勉强能移植一下。
3,接下来我们移植LiteOS(为了不打击初学者对华为LiteOS的热情,博主把移植过程简化)争取大家一次成功
需要移植的资料我会放在文末,接下来我们开始移植;
我们首先在Keil 5新建工程(为了傻瓜式移植所以把移植步骤完全操作一遍)
1,在桌面新建一个文件夹(名字要是英文)在该文件夹里新建Library Start User 这三个文件夹。
2,然后我们就从固件库里添加一些需要的文件在我们建好的文件夹里,固件库名字为STM32F10x_StdPeriph_Lib_V3.5.0(我会把这些文件都在文末分享出来)
首先,我们在Library中添加的文件有
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver\inc下的所有文件
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver\src下的所有文件
其次,我们在Start中添加的文件有
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport下的所有文件
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm下的所有文件
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x下的所有.c,和.h文件
最后,我们在User中添加的文件有
STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template下除了system_stm32f10x.c的所有.c,和.h文件
这样我们就把所需的固件库文件添加好了,接下来我们打开Keil5 新建工程
路径选择我们刚刚在桌面上创建的文件夹,点击打开,名字为LiteOS
点击保存,就会弹出让我们选择芯片的界面,我们选择STM32F103C8,点击OK
然后会弹出一个CMSIS界面我们点击OK,就会弹出我们新建的工程界面。
接下来,我们点击文件管理,把我们刚刚在固件库里的文件添加进去,我们先把工程里文件建好,根据下面4个操作就可以完成我们如下界面中文件的创建。
然后我们选中User点击添加文件
我们点击User,文件类型选择全部文件,全部选中,添加
然后我们选中Start点击添加文件,文件类型选择全部文件,需要添加的文件有
我们在Start中选择这些文件就好。然后点击添加
最后我们选中Library 点击添加文件
点击Library文件类型选择全部文件,全部选中,添加
这样我们就把文件都添加好了,接下来我们需要一些设置,可以让工程运行
我们点击魔术棒>Target 进行以下配置
魔术棒>Output 进行以下配置(用来生成下载到芯片的程序)
魔术棒>C/C++ 进行以下配置
点击后,我们添加以下路径
最后我们点击OK
接下来我们打开main.c,把里面的代码全部删除,添加如下代码
编译后 0 error,我们的固件库工程就建好了。
- #include "stm32f10x.h" // Device header
- int main(void)
- {
- while(1)
- {
-
- }
-
-
- }
首先我们把文件HUAWEI LITEOS复制到我们在桌面是创建的文件夹中
在Keil 5点击文件管理,添加如下文件
arch\arm\arm-m\src 目录下的全部文件
los_hw.c
los_hw_tick.c
los_hwi.c
arch\arm\arm-m\cortex-m3\keil目录下的全部文件
kernel\base\core 文件夹下全部.c文件
los_priqueue.c
los_swtmr.c
los_sys.c
los_task.c
los_tick.c
los_timeslice.c
kernel\base\ipc 文件夹下全部.c文件
los_event.c
los_mux.c
los_queue.c
los_sem.c
kernel\base\mem\bestfit_little 文件夹下全部.c文件
los_heap.c
los_memory.c
kernel\base\mem\common 文件夹下全部.c文件
los_memcheck.c
los_memstat.c
los_slab.c
los_slabmem.c
kernel\base\mem\membox 文件夹下全部.c文件
los_membox.c
kernel\base\misc 文件夹下全部.c文件
los_misc.c
kernel\base\om 文件夹下全部.c文件
los_err.c
kernel\extended\tickless 文件夹下全部.c文件
los_tickless.c
kernel 文件夹下的
los_init.c
OS_CONFIG 文件夹下全部.h文件
target_config.h(这个文件里就是我们移植不同的板子需要更改的配置)
添加完文件后我们要添加文件路径
魔术棒>C/C++ 进行以下配置
点击OK,这样我们就移植完成了
把stm32f10x_it.c中的systick和pendsv这两个中断注释掉
由于我们的CMSIS版本已经不适合做LiteOS移植,移植后会出现兼容问题报错
Error: Undefined symbol_ _get_IPSR(找不到符号)
解决方式:把HUAWEI LITEOS\arch\arm\common\cmsis下的所有文件复制到我们在桌面建的文件夹中的Start文件夹中,粘贴时选择替换所有目标。
然后编译后 0 error,我们的LiteOS就移植好了。
我们在main.c文件中添加如下代码
- #include "stm32f10x.h" // Device header
- #include "los_typedef.h"
- #include "los_base.h"
- #include "los_task.h"
-
- static UINT32 TaskLed1_ID;
- extern UINT32 TaskLed1(VOID);
-
- #define TSK_PRIOR_Led1 4
-
-
- void LED_Init(void)
- { //PA4
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
-
- GPIO_InitTypeDef GPIO_InitStructure;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
-
- GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_SET);
- //PA5
-
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
-
- GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_SET);
-
- }
-
-
-
-
- UINT32 TaskMain(void)
- {
- UINT32 uwRet;
- TSK_INIT_PARAM_S stInitParam;
- if (LOS_KernelInit() != LOS_OK) //系统内核初始化
- {
- return LOS_NOK;
- }
- stInitParam.pfnTaskEntry = (TSK_ENTRY_FUNC)TaskLed1; //要创建任务进入的函数
- stInitParam.usTaskPrio = TSK_PRIOR_Led1; //要创建任务的优先级
- stInitParam.pcName = "TaskLed1"; //要创建任务的名字
- stInitParam.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE;//要创建任务的堆栈大小
- uwRet = LOS_TaskCreate(&TaskLed1_ID, &stInitParam); //创建LED1任务
- if (uwRet != LOS_OK)
- {
- return LOS_NOK;
- }
- LOS_Start();
- return LOS_OK;
- }
-
- UINT32 TaskLed1(VOID)
- {
- while(1)
- {
- GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_RESET);
- GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_RESET);
- LOS_TaskDelay(500);
- GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_SET);
- GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_SET);
- LOS_TaskDelay(500);
- }
- }
- // SysTick_Handler
- int main(void)
- {
- LED_Init();
-
- TaskMain();
- while(1)
- {
-
- }
-
-
-
- }
-

大家直接复制代码把原本main.c中的代码替换掉就行。
博主这里用的是DAP
如果你用的是其他类型的下载器的话
你可以在魔术棒>Debug 中更改
下载完成后LED闪烁
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。