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开发。
工程使用 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等硬件引脚配置不一样,就需要重新进行适配移植,适配方式有两种:
以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文件系统里达到修改的目的,这就是下面的第二种方法。
临时适配一个板子的话可以采用这种方式,具体说明可以参考源码中文件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
canmv板载flash大小为16M,具体划分情况如下:
起始地址 | 大小(byte) | 说明 |
---|---|---|
0x0 | 3M | 预留给固件烧录 |
0x300000 (3M) | 10M | 空余,可用于存放kmodel模型,字库等二进制文件 |
0xD00000 (13M) | 3M | 文件系统 |