APM32F072VB移植liteos

5 篇文章 0 订阅
1 篇文章 0 订阅

移植准备

APM32F072VB开发板(M0),https://www.geehy.com/ 在官网下载对应的pack包,需要将pack包里的inc、src文件添加到tagets/bsp目录下。这两个目录是芯片依赖的lib库。文件如下图:
在这里插入图片描述
移植的文件放在tagets下,目录结构如下图:
在这里插入图片描述

编译环境,这里就不多阐述了,按照官网配置即可。
烧录工具:jflash,需要V7以后的版本
编译pack包:keil(为了可以调试pack里的样例程序)

移植

参照Liteos已经移植好的STM32F072、APM32F103的文件。

文件结构

将/tagets/STM32F072的文件拷贝一份至新建的APM32F072目录下。如下图:
在这里插入图片描述
文件目录结构如图:
在这里插入图片描述

芯片烧写

用的是jlink-flash lite烧写,由于jflash没有APM32F072VB的芯片选型,所以可以选择STM32F072VB的芯片,都是M0的芯片,jflash的配置应该是想通的,所以可以通过这种方式烧写。其实,也找了其它的资料,官网上也没有对应的jflash烧写的配置,jflash只有APM32F103的配置。因此,后面就选了同M0的选型,经过验证可以烧写成功。(补充说明,APM32F072的烧写地址是0x08000000,但是具体的得看datasheet的空间map图)

移植过程

文件结构

在targets文件夹下新增APM32F072_Geehy文件夹,其目录结构参考STM32F072_Nucleo文件夹结构进行创建。

  • 拷贝APM32官方SDK中的驱动库到targets\bsp\drivers下。
  • 拷贝文件夹Inc、include、os_adapt、Src和文件liteos.ld、los_startup_gcc.S、Makefile到APM32F103_Geehy目录中。
  • 替换Inc和Src中文件,将Inc目录下stm32f1xx_hal_conf.h、stm32f1xx.h、stm32f103xe.h、system_stm32f1xx.h文件替换为apm32f10x.h、system_apm32f10x.h;将Src目录下system_stm32f1xx.c文件替换为system_apm32f10x.c。
  • 适配编译配置,参考其他同架构的开发板在targets\bsp.mk、targets\bsp\Makefile、tools\build\config、targets\Kconfig.apm32中添加APM32F103相关内容(参照其它文件的格式修改即可)。
  • 其中,menuconfig是根据根目录下的.config来进行配置的,.config文件在tools/build目录下

代码移植

系统时钟

系统时钟是通过los_startup_gcc.S文件调用system_apm32f10x.c中的SystemInit来初始化,无需主动实现。

串口

参考APM32官方SDK中的Examples\USART\Printf文件夹下示例,实现串口初始化和UartControllerOps结构体。

GPIO

参考APM32官方SDK中的Examples\GPIO文件夹下示例,实现GPIO口的控制即可。

定时器(用于cpup,计算cpu使用率)

参考APM32官方SDK中的Examples\TMR\TimeBase文件夹下示例,实现定时器初始化和TimControllerOps结构体。

移植遇到的问题

在移植中,可将.config中的无关开关关闭再调试。

任务无法调度

移植中串口与GPIO都ok了,但是任务无法调度。后面查资料发现:M0的启动流程如下,在程序在0x08000000启动后,会从0x00000000处取异常向量表。而M0的异常向量表是在RAM的空间的开头,因此需要将RAM的地址空间映射到0x00000000处。也就是图中的红框的操作,remap SRAM to 0x00000000。这里说明一下,由于__HAL_SYSCFG_REMAPMEMORY_SRAM();的接口只适用于STM系列的芯片,因此需要查datasheet,写一下对应的寄存器,如下图所示:
在这里插入图片描述

Stack、Heap不够(堆空间、栈空间不够)

Stack溢出与Heap不够,一般都是由于.config的任务栈空间设置不当导致的,如果Stack分配的太多,可能会导致Heap空间不够,反之,同理。同时还需要修改litos.ld链接文件的相关配置。
在这里插入图片描述

移植liteos总结

  • arm_nvic.c的 IrqEntryV7M()是中断的总入口,g_curIrqNum是中断号。
    在这里插入图片描述
  • arch\arm\cortex_m\src的task.c中的 OsTaskStackInit() 是初始化栈前面的空间的,主要是R0-R12寄存器以及pc、lr、上下文切换结构体等。
    在这里插入图片描述
    dispath.s文件中的OsStartToRun函数如何跳转到c的?OsStartToRun这个函数是任务调度开始时调用的。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值