当前位置:   article > 正文

1,华为 LiteOS-m移植STM32F103C8T6(固件库类型)_liteos-m内核移植

liteos-m内核移植

目录

前言:

之前就了解到Liteos,想要移植到STM32,奈何资料太少(反正楼主很难找到),最近有了点时间,又搜了一下,勉强能移植一下。

1,LiteOS-m移植STM32F103C8T6

2,新建固件库工程

3,接下来我们移植LiteOS(为了不打击初学者对华为LiteOS的热情,博主把移植过程简化)争取大家一次成功

4,修改移植问题

5,LiteOS任务管理点亮LED灯

6.下载程序

7,文件下载


前言:

之前就了解到Liteos,想要移植到STM32,奈何资料太少(反正楼主很难找到),最近有了点时间,又搜了一下,勉强能移植一下。

1,LiteOS-m移植STM32F103C8T6

  需要移植的资料我会放在文末,接下来我们开始移植;

2,新建固件库工程

我们首先在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,我们的固件库工程就建好了。

  1. #include "stm32f10x.h" // Device header
  2. int main(void)
  3. {
  4. while(1)
  5. {
  6. }
  7. }

3,接下来我们移植LiteOS(为了不打击初学者对华为LiteOS的热情,博主把移植过程简化)争取大家一次成功

首先我们把文件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,这样我们就移植完成了

4,修改移植问题

把stm32f10x_it.c中的systick和pendsv这两个中断注释掉

由于我们的CMSIS版本已经不适合做LiteOS移植,移植后会出现兼容问题报错

    Error:     Undefined symbol_ _get_IPSR(找不到符号)

解决方式:把HUAWEI LITEOS\arch\arm\common\cmsis下的所有文件复制到我们在桌面建的文件夹中的Start文件夹中,粘贴时选择替换所有目标。

然后编译后 0 error,我们的LiteOS就移植好了。

5,LiteOS任务管理点亮LED灯

我们在main.c文件中添加如下代码

  1. #include "stm32f10x.h" // Device header
  2. #include "los_typedef.h"
  3. #include "los_base.h"
  4. #include "los_task.h"
  5. static UINT32 TaskLed1_ID;
  6. extern UINT32 TaskLed1(VOID);
  7. #define TSK_PRIOR_Led1 4
  8. void LED_Init(void)
  9. { //PA4
  10. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  11. GPIO_InitTypeDef GPIO_InitStructure;
  12. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  13. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  14. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  15. GPIO_Init(GPIOA, &GPIO_InitStructure);
  16. GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_SET);
  17. //PA5
  18. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  19. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  20. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  21. GPIO_Init(GPIOA, &GPIO_InitStructure);
  22. GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_SET);
  23. }
  24. UINT32 TaskMain(void)
  25. {
  26. UINT32 uwRet;
  27. TSK_INIT_PARAM_S stInitParam;
  28. if (LOS_KernelInit() != LOS_OK) //系统内核初始化
  29. {
  30. return LOS_NOK;
  31. }
  32. stInitParam.pfnTaskEntry = (TSK_ENTRY_FUNC)TaskLed1; //要创建任务进入的函数
  33. stInitParam.usTaskPrio = TSK_PRIOR_Led1; //要创建任务的优先级
  34. stInitParam.pcName = "TaskLed1"; //要创建任务的名字
  35. stInitParam.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE;//要创建任务的堆栈大小
  36. uwRet = LOS_TaskCreate(&TaskLed1_ID, &stInitParam); //创建LED1任务
  37. if (uwRet != LOS_OK)
  38. {
  39. return LOS_NOK;
  40. }
  41. LOS_Start();
  42. return LOS_OK;
  43. }
  44. UINT32 TaskLed1(VOID)
  45. {
  46. while(1)
  47. {
  48. GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_RESET);
  49. GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_RESET);
  50. LOS_TaskDelay(500);
  51. GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_SET);
  52. GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_SET);
  53. LOS_TaskDelay(500);
  54. }
  55. }
  56. // SysTick_Handler
  57. int main(void)
  58. {
  59. LED_Init();
  60. TaskMain();
  61. while(1)
  62. {
  63. }
  64. }

大家直接复制代码把原本main.c中的代码替换掉就行。

6.下载程序

博主这里用的是DAP

如果你用的是其他类型的下载器的话

你可以在魔术棒>Debug   中更改

下载完成后LED闪烁

7,文件下载

文件下载

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/226313
推荐阅读
相关标签
  

闽ICP备14008679号