IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> APM32F072VB移植liteos -> 正文阅读

[嵌入式]APM32F072VB移植liteos

移植准备

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这个函数是任务调度开始时调用的。
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-09-05 11:11:07  更:2021-09-05 11:11:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 1:43:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码