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等硬件引脚配置不一样,就需要重新进行适配移植,适配方式有两种:
- 源码里新增一个工程目录并适配
- 在已经烧录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 |
文件系统 |