CanMV K210工程源码架构

CanMV K210工程源码架构

关于CanMV

github源码地址: https://github.com/kendryte/canmv

CanMV, 让 AIOT 更简单~

CanMV 基于Sipeed MaixPy,但它与之不同,现在是一个完全独立的项目。 基于 Micropython 语法, 兼容移植openmv功能,运行在Canan强大的嵌入式AI SOC系列K210上,具有丰富的AI demo以快速实现强大的AI视觉开发。

K210 简介 :

  • 拥有硬件加速的 AI 图像识别
  • 带硬件浮点运算的双核处理器
  • 8MB(6MB+2MB) 内存
  • 16MB 外置 Flash
  • 芯片 CPU 最高可达 800MHz 主频 (开发板支持最高主频具体看开发板介绍, 通常400MHz)
  • 麦克风阵列支持(8个麦克风)
  • 硬件 AES SHA256 支持
  • FPIOA (每个外设可以映射到任意引脚)
  • 外设: I2C, SPI, I2S, WDT, TIMER, RTC, UART, GPIO 等等

目录结构

目录 子目录 子目录2 子目录3 内容梗概
assets 资源文件
projects 工程文件, 每个文件夹一个工程
tools 工具
components 组件
└-boards 板级代码
└-drivers 驱动
└-micropython micropython 相关代码
└-core micropython 源码
└-port maixpy 自定义部分源码
└-builtin_py maixpy 默认内置类
└-include 移植部分头文件
└-src 功能模块源码
└-spiffs SPIFFS 文件系统
└-utils 工具类(函数)

基于micropython的主要功能模组实现都存放在目录 components/micropython/port/src 下,该目录结构如下:

目录 子目录 内容梗概
src mpy功能模块源码
└-audio 音频相关
└-lvgl lvgl UI
└-Maix 芯片相关功能(gpio,kpu,fft,mic_arry等)
└-modules 一些模组
└-nes nes模拟器
└-omv openmv
└-speech 语音识别
└-standaed_lib mpy标准模组
└-touchscreen 触摸驱动模组
└-ulab 类numpy数学计算模组
└-video 视频相关

不同功能板子的项目创建在 projects目录下,也可以选择无micropython的c开发。

编译相关

Kconfig配置

工程使用 CMake 进行组织, 并且工程支持多个可配置选项(Kconfig

如果需要添加配置项, 可以通过修改 Kconfig 文件来达到目的,所有配置项在编译时会生成宏定义添加到global_config.h(生成的文件)中去, 而且在 CmakeLists.txt 文件中都可以使用该宏定义。

比如在 Kconfig 中定义 config BOARD_M5STICK, 在 CMakeLists.txt 中可以通过判断CONFIG_BOARD_M5STICK 是否为真来决定是否编译特定的代码。 编译时就可以通过python3 project.py menuconfig来选择是否勾选了

编译配置

以maixpy_canmv工程为例,menuconfig更改配置后新的配置文件保存在projects/maixpy_canmv/build/config/global_config.mk,build目录下是编译时的临时文件,当执行python3 project.py distclean清除编译时会被清掉,所以如果想让配置永久保存生效需要手动拷贝到文件projects/maixpy_canmv/config_defaults.mk里。

注意: 如果更改源文件后编译出错时可以先尝试python3 project.py distclean清除编译,在重新python3 project.py build编译。

固件裁剪

当固件过大时会导致可用内存变少,无法跑大型py应用或者加载大模型,这时候可以通过裁剪固件大小的办法删去不必要的功能模块。

通过python3 project.py menuconfig进入到配置界面,进入 Components configuration —> Micropython configurations—> Modules configurations —> 菜单,可以对micropython的模组进行按需选择。下面是一些不重要模组的大小占用情况:

模组 大小(byte) 说明
nes 139776 nes游戏模拟器,不重要且占用大优先裁剪
ulab 39232 类numpy数学计算库,应用场合不多
mic_array 9954 麦克风阵列,特有应用场景
yuv_table 342784 openmv中的yuv转换表,用不到可裁掉
video 5696 视频录制播放,占用不大可按需裁剪
omv_advance 444800 openmv的算法核心实现,如果只需要kpu处理而不需要openmv的算法可以裁剪掉

一般情况下想保留openmv算法与kpu跑大模型,可以裁剪这几个nes, ulab, mic_array, yuv_table, video

新硬件的适配移植

如果一个新板子sensor, lcd, sdcard等硬件引脚配置不一样,就需要重新进行适配移植,适配方式有两种:

  1. 源码里新增一个工程目录并适配
  2. 在已经烧录canmv固件的板子上上传一个config.json配置文件

源码适配新硬件

projects/maixpy_canmv项目为模板拷贝一份新的在projects目录下,比如起个名字为maixpy_test,然后打开其中的projects/maixpy_test/builtin_py/_boot.py文件,找到如下代码位置:

config = {
"type": "canmv",
"lcd": {
    "rst" : 39,
    "dcx" : 37,
    "ss" : 38,
    "clk" : 36,
    "height": 240,
    "width": 320,
    "invert": 1, /* 反显 */
    "offset_x1": 0,
    "offset_y1": 0,
    "offset_x2": 0,
    "offset_y2": 0,
    "dir": 96  /* 显示方向 */
},
"freq_cpu": 416000000,
"freq_pll1": 400000000,
"kpu_div": 1,
"sensor": {
    "cmos_pclk":47,
    "cmos_xclk":46,
    "cmos_href":44,
    "cmos_pwdn":45,
    "cmos_vsync":42,
    "cmos_rst":43,
    "reg_width":16,
    "i2c_num":2,
    "pin_clk":41,
    "pin_sda":40
},
"sdcard":{
    "sclk":28,
    "mosi":27,
    "miso":29,
    "cs":26,
    "cs_gpio":29
},
"board_info": {
	"BOOT_KEY":  16,
}
}

主要就是修改里面的lcd,sensor,sdcard的硬件引脚分配,对照原理图修改,具体说明可以参考源码中文件components/boards/config/readme.md

该方式就是通过_boot.py程序启动时生成一个config.json到板端flash的文件系统里, 所以我们也可以自己上传一个config.json到flash文件系统里达到修改的目的,这就是下面的第二种方法。

上传config.json到板端适配

临时适配一个板子的话可以采用这种方式,具体说明可以参考源码中文件components/boards/config/readme.md。把上面代码config的里的json内容保存到config.json文件然后上传到板子flash重启即可生效。如果flash被擦除重烧录了固件的话那么config.json也就被重置为了初始内容,需要再次上传一遍修改的config.json,所以一般不推荐此方法适配,仅作为一个临时方案。

文件系统

使用的spiffs文件系统,针对嵌入式flash芯片,可以有效平衡磨损,另外提供了spiffs文件系统镜像生成工具,意味着可以将python脚本文件预先组织好生成镜像烧录到falsh指定位置替换。

MicroPython 是从 0x0 开始的程序,在程序中会通过 spiffs 在 Flash 的 [0xD00000, (0xD00000 + 0x300000)) 区间构建 VFS (虚拟文件系统),是由 projects/maixpy_xxxxx/config_defaults.mk 中定义得到的。

CONFIG_SPIFFS_SIZE=0x300000
CONFIG_SPIFFS_START_ADDR=0xD00000

flash分区规划

canmv板载flash大小为16M,具体划分情况如下:

起始地址 大小(byte) 说明
0x0 3M 预留给固件烧录
0x300000 (3M) 10M 空余,可用于存放kmodel模型,字库等二进制文件
0xD00000 (13M) 3M 文件系统

你可能感兴趣的:(micropython,python,iot,嵌入式硬件)