diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 9e7f03b..6884a80 100755
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -147,7 +147,7 @@ markdownlint:
- echo "---push to github---"
- git push --atomic --tags -u -f github main || git push --atomic --tags -u -f github main || git push --atomic --tags -u -f github main
-build-web-docs:
+build web docs:
stage: build
rules:
- if: $CI_PIPELINE_SOURCE == "push" && ($CI_COMMIT_BRANCH == "dev" || $CI_COMMIT_BRANCH == "main")
@@ -168,8 +168,26 @@ build-web-docs:
- make mhtml
- rm -rf /data1/k230/k230_canmv_docs/*
- cp -r _build/* /data1/k230/k230_canmv_docs
- - ssh -p 52522 huangziyi@40.73.58.120 "rm -rf /data/webapp/k230_canmv"
- - scp -P 52522 -O -r _build huangziyi@40.73.58.120:/data/webapp/k230_canmv
+ artifacts:
+ paths:
+ - _build
+
+deploy production:
+ stage: deploy
+ image: ai.b-bug.org:5000/python:web-docs-v2
+ dependencies:
+ - build web docs
+ rules:
+ - if: $CI_PIPELINE_SOURCE == "push" && ($CI_COMMIT_BRANCH == "dev" || $CI_COMMIT_BRANCH == "main")
+ tags:
+ - k230
+ environment:
+ name: production
+ url: https://developer.canaan-creative.com/k230_canmv/dev/index.html
+ retry: 2
+ script:
+ - scp -P 52522 -O -C -r _build/* huangziyi@40.73.58.120:/data/webapp/k230_canmv/
+
# sync dev branch to main branch
dev_to_main:
diff --git a/_static/topbar.css b/_static/topbar.css
index 5c28c60..bd66107 100644
--- a/_static/topbar.css
+++ b/_static/topbar.css
@@ -153,6 +153,7 @@ nav.navbar a {
padding: 10px !important;
color: #fff;
text-align: start !important;
+ text-wrap: wrap !important;
}
.document-select:hover {
diff --git a/index.rst b/index.rst
index 96f6202..0bdf5c6 100644
--- a/index.rst
+++ b/index.rst
@@ -13,4 +13,6 @@ Welcome to K230 CanMV's documentation!
zh/userguide/userguide.rst
zh/example/example.rst
zh/api/api.rst
- zh/CanMV-K230常见问题解答_MicroPython.md
\ No newline at end of file
+ zh/CanMV-K230常见问题解答_MicroPython.md
+ zh/CanMV-K230版本说明.md
+ zh/CanMV-K230_SDK_nncase版本对应关系.md
\ No newline at end of file
diff --git "a/zh/CanMV-K230_SDK_nncase\347\211\210\346\234\254\345\257\271\345\272\224\345\205\263\347\263\273.md" "b/zh/CanMV-K230_SDK_nncase\347\211\210\346\234\254\345\257\271\345\272\224\345\205\263\347\263\273.md"
new file mode 100755
index 0000000..2106947
--- /dev/null
+++ "b/zh/CanMV-K230_SDK_nncase\347\211\210\346\234\254\345\257\271\345\272\224\345\205\263\347\263\273.md"
@@ -0,0 +1,49 @@
+# CanMV-K230_SDK_nncase版本对应关系
+
+![cover](images/canaan-cover.png)
+
+版权所有©2023北京嘉楠捷思信息技术有限公司
+
+
+
+## 免责声明
+
+您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)及其关联公司的商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的正确性、可靠性、完整性、适销性、符合特定目的和不侵权提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导参考。
+
+由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。
+
+## 商标声明
+
+![logo](images/logo.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。
+
+**版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。**
+非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。
+
+
+
+## 目录
+
+[TOC]
+
+## 前言
+
+### 概述
+
+本文档主要介绍了CanMV(micropython)、K230 SDK 和NNCASE之间的版本关系。
+
+### 读者对象
+
+本文档(本指南)主要适用于以下人员:
+
+- 技术支持工程师
+- 软件开发工程师
+
+## Canmv(micropython)、K230 SDK、nncase版本对应关系
+
+在进行AI开发时,k230_sdk和nncase版本对应关系如下表,编译镜像和使用nncase转换kmodel时请注意版本对应关系。
+
+| Canmv(micropython) 版本| K230 SDK 版本 | nncase 版本 | 备注 |
+| -------------| ------------- | ----------- | ---- |
+| 0.2.0 | 1.1.0 | 2.4.0 | - |
+| 0.3.0 | 1.1.0 | 2.4.0 | - |
+| 0.4.0 | 1.3.0 | 2.7.0 | - |
diff --git "a/zh/CanMV-K230\345\270\270\350\247\201\351\227\256\351\242\230\350\247\243\347\255\224_MicroPython.md" "b/zh/CanMV-K230\345\270\270\350\247\201\351\227\256\351\242\230\350\247\243\347\255\224_MicroPython.md"
index 6ba4e5d..fd5749b 100644
--- "a/zh/CanMV-K230\345\270\270\350\247\201\351\227\256\351\242\230\350\247\243\347\255\224_MicroPython.md"
+++ "b/zh/CanMV-K230\345\270\270\350\247\201\351\227\256\351\242\230\350\247\243\347\255\224_MicroPython.md"
@@ -34,10 +34,20 @@
1、请确定开发板两个USB口都与电脑连接。
![CanMV-K230-poweron](images/CanMV-K230-poweron.png)
-2、查看电脑的设备管理器
+2、TF卡烧录的固件是“CanMV-K230_micropython”开头的固件,烧录其它的固件也无法连接。
+
+3、查看电脑的设备管理器
![CanMV-K230-micropython-serial](images/CanMV-K230-micropython-serial.png)
+
是否有"USB串行设备(COMxx)的设备,如果没有请重新插拔USB。如果还没有,则请更换USB线。
+### 2.2 虚拟U盘在哪?如何使用?
+
+V0.5版本后的Canmv镜像支持虚拟U盘,即将板子的TF虚拟为U盘,可以像U盘一样对TF进行操作。系统正常启动后会在“我的电脑”或“此电脑”,在设备和驱动器中会出现“CanMV"设备。
+![virtual_Udisk](images/virtual_Udisk.png)
+
+将其做为普通的U盘即可。默认里面会存储micropython的示例,建议使用这里面的示例,可以保证镜像与示例版本一致。
+
## 3.nncase类问题解答
## 4.AI demo类问题解答
diff --git "a/zh/CanMV-K230\345\277\253\351\200\237\345\205\245\351\227\250\346\214\207\345\215\227.md" "b/zh/CanMV-K230\345\277\253\351\200\237\345\205\245\351\227\250\346\214\207\345\215\227.md"
index ba20b17..ab14193 100755
--- "a/zh/CanMV-K230\345\277\253\351\200\237\345\205\245\351\227\250\346\214\207\345\215\227.md"
+++ "b/zh/CanMV-K230\345\277\253\351\200\237\345\205\245\351\227\250\346\214\207\345\215\227.md"
@@ -58,43 +58,25 @@ CanMV-K230开发板默认套件包含以下物品:
4、Type-C数据线
-## 3 USB连接
+## 3. 固件获取及烧录
-使用Type-C线连接CanMV-K230如下图的位置,线另一端连接至电脑
+### 3.1 固件获取
-![CanMV-K230-usbotg](images/CanMV-K230-usbotg.png)
-
-### 3.2 Windows
-
-查看设备管理器
-
-![CanMV-K230-micropython-serial](images/CanMV-K230-micropython-serial.png)
-
-- `USB-Enhanced-SERIAL-A CH342(COM80)`为小核linux调试串口
-- `USB-Enhanced-SERIAL-B CH342(COM81)`为大核rt-smart调试串口
-- `USB串行设备(COM75)`为micropython REPL串口 是CanMV-IDE需要连接的串口。如果没有这个设备,请确定两个USB口都与电脑连接。
-
-### 3.2.2 linux
-
-Linux串口显示如下:
-
-- `/dev/ttyACM0`为小核linux调试串口
-- `/dev/ttyACM1`为大核rt-smart调试串口
-- `/dev/ttyACM2`为micropython REPL串口 是CanMV-IDE需要连接的串口。如果没有这个设备,请确定两个USB口都与电脑连接。
+CanMV-K230 固件下载地址: 或者
-## 4 固件获取及烧录
+CanMV源码下载地址如下:
-### 4.1 固件获取
+`https://github.com/kendryte/k230_canmv`
-CanMV-K230 固件下载地址: 或者
+`https://gitee.com/kendryte/k230_canmv`
请下载“CanMV-K230_micropython”开头的gz压缩包,解压得到sysimage-sdcard.img文件,即为CanMV-K230的固件。
-### 4.2 固件烧录
+### 3.2 固件烧录
将固件通过电脑烧写至TF卡中。
-#### 4.2.1 Linux下烧录
+#### 3.2.1 Linux下烧录
在TF卡插到宿主机之前,输入:
@@ -112,30 +94,52 @@ CanMV-K230 固件下载地址:
+Linux串口显示如下:
+
+- `/dev/ttyACM0`为小核linux调试串口
+- `/dev/ttyACM1`为大核rt-smart调试串口
+- `/dev/ttyACM2`为micropython REPL串口 是CanMV-IDE需要连接的串口。如果没有这个设备,请确定两个USB口都与电脑连接,TF卡烧录的固件是否为“CanMV-K230_micropython”开头的固件。
+
+## 5. CanMV-IDE下载
-## 6 启动系统
+下载地址 : 下载最新的CanMV IDE
-将烧好固件的TF卡插入CanMV-K230 TF卡插槽,Type-C线连接电脑和板端的POWER口,板子即上电,系统开始启动。注意:这里两个USB口都要连接电脑,否则板子无法与IDE联通。
+## 6. 启动系统
+
+将烧好固件的TF卡插入CanMV-K230 TF卡插槽,Type-C线连接电脑和板端的POWER口,板子即上电,系统开始启动。(**注意:这里两个USB口都要连接电脑,否则板子无法与IDE联通**)
![CanMV-K230-poweron](images/CanMV-K230-poweron.png)
### 6.1 连接开发板
@@ -151,10 +155,19 @@ Windows下可通过balena Etcher工具对TF卡进行烧录(balena Etcher工具
### 6.2 运行python
-在 下载测试程序,通过IDE加载。
+在 下载测试程序,通过IDE加载。(**V0.5版本之前,0.5版本后建议使用虚拟U盘**)
![canmv_open_py](images/canmv_open_py.png)
点击打开按钮,选择下载的文件,打开。 点击左下角的绿色按钮运行,等待一会儿,显示器会显示sensor采集的图像,该程序为人脸检测程序,可以看到人脸被框出。
+(**V0.5版本之后已经支持虚拟U盘功能,可以直接打开TF卡中的示例**)
+
+查看“我的电脑”或“此电脑”,在设备和驱动器中会出现“CanMV"设备。
+![virtual_Udisk](images/virtual_Udisk.png)
+
+建议使用虚拟U盘里面的示例。
+![open_Udisk](images/open_Udisk.png)
+![face_detect_file](images/face_detect_file.png)
+
![CanMV-K230-aidemo](images/CanMV-K230-aidemo.png)
diff --git "a/zh/CanMV-K230\347\211\210\346\234\254\350\257\264\346\230\216.md" "b/zh/CanMV-K230\347\211\210\346\234\254\350\257\264\346\230\216.md"
index a3acd2a..111a034 100755
--- "a/zh/CanMV-K230\347\211\210\346\234\254\350\257\264\346\230\216.md"
+++ "b/zh/CanMV-K230\347\211\210\346\234\254\350\257\264\346\230\216.md"
@@ -50,6 +50,7 @@
| K230 CanMV | V0.2.0 | 2023-11-23 |
| K230 CanMV | V0.3.0 | 2023-12-28 |
| K230 CanMV | V0.4.0 | 2024-01-26 |
+| K230 CanMV | V0.5.0 | 2024-03-15 |
## 2. 支持的硬件
@@ -85,6 +86,9 @@ K230平台支持CanMV-K230等主板
| 18 | V0.4.0 | 升级SDK及nncase | SDK升级至V1.3,nncase升级至v2.7 | |
| 19 | V0.4.0 | lvgl | 支持LVGL | |
| 20 | V0.4.0 | wifi | 支持WIFI | |
+| 21 | V0.5.0 | 虚拟U盘 | 支持虚拟U盘的功能 | |
+| 22 | V0.5.0 | 外设模块 | 根据micropython官方重新整理fpioa、adc、uart、spi、i2c、rtc、timer模块的API | |
+| 23 | V0.5.0 | MCM | 支持多摄像头,添加2sensors,3sensors demo | |
### 4.2 AI Demo
@@ -117,6 +121,7 @@ K230平台支持CanMV-K230等主板
| 25 | V0.3.0 | 拼图游戏 | 复现数字华容道拼图游戏 | |
| 26 | V0.3.0 | 基于关键点的手势识别 | 基于关键点的手势识别 | |
| 27 | V0.4.0 | 自学习 | 根据图像特征判断类别 | |
+| 28 | V0.5.0 | TTS中文 | 中文文字转语音 | |
## 5. 版本的遗留问题及限制说明
diff --git a/zh/api/api.rst b/zh/api/api.rst
index 3d3ab6a..b2c6d90 100755
--- a/zh/api/api.rst
+++ b/zh/api/api.rst
@@ -3,32 +3,7 @@ CanMV API 手册
.. toctree::
:maxdepth: 1
- cipher/K230_CanMV_Hashlib模块API手册.md
- cipher/K230_CanMV_Ucryptolib模块API手册.md
- extmod/K230_CanMV_uctypes模块API手册.md
- extmod/K230_CanMV_network模块API手册.md
- extmod/K230_CanMV_socket模块API手册.md
- machine/K230_CanMV_ADC模块API手册.md
- machine/K230_CanMV_FFT模块API手册.md
- machine/K230_CanMV_GPIO模块API手册.md
- machine/K230_CanMV_I2C模块API手册.md
- machine/K230_CanMV_IOMUX_API手册.md
- machine/K230_CanMV_PWM模块API手册.md
- machine/K230_CanMV_SPI模块API手册.md
- machine/K230_CanMV_Timer模块API手册.md
- machine/K230_CanMV_WDT模块API手册.md
- machine/K230_CanMV_UART模块API手册.md
- machine/K230_CanMV_machine模块API手册.md
- mpp/K230_CanMV_Audio模块API手册.md
- mpp/K230_CanMV_Camera模块API手册.md
- mpp/K230_CanMV_Display模块API手册.md
- mpp/K230_CanMV_Media模块API手册.md
- mpp/K230_CanMV_MP4模块API手册.md
- mpp/K230_CanMV_VDEC模块API手册.md
- mpp/K230_CanMV_VENC模块API手册.md
- mpp/K230_CanMV_播放器模块API手册.md
- mpp/K230_CanMV_PM模块API手册.md
- nncase_runtime/K230_CanMV_nncase_runtime_API手册.md
- openmv/image.md
- stdlib/utime.md
- lvgl/lvgl.md
+ python_micropython.rst
+ machine.rst
+ image_video.rst
+ nncase.rst
diff --git a/zh/api/image_video.rst b/zh/api/image_video.rst
new file mode 100644
index 0000000..988ee55
--- /dev/null
+++ b/zh/api/image_video.rst
@@ -0,0 +1,16 @@
+图像多媒体
+===========
+.. toctree::
+ :maxdepth: 1
+
+ mpp/K230_CanMV_Audio模块API手册.md
+ mpp/K230_CanMV_Camera模块API手册.md
+ mpp/K230_CanMV_Display模块API手册.md
+ mpp/K230_CanMV_Media模块API手册.md
+ mpp/K230_CanMV_MP4模块API手册.md
+ mpp/K230_CanMV_VDEC模块API手册.md
+ mpp/K230_CanMV_VENC模块API手册.md
+ mpp/K230_CanMV_播放器模块API手册.md
+ mpp/K230_CanMV_PM模块API手册.md
+ openmv/image.md
+ lvgl/lvgl.md
diff --git a/zh/api/machine.rst b/zh/api/machine.rst
new file mode 100644
index 0000000..26caeb3
--- /dev/null
+++ b/zh/api/machine.rst
@@ -0,0 +1,19 @@
+Micropython特有库
+===========
+.. toctree::
+ :maxdepth: 1
+
+ extmod/K230_CanMV_uctypes模块API手册.md
+ extmod/K230_CanMV_network模块API手册.md
+ extmod/K230_CanMV_socket模块API手册.md
+ machine/K230_CanMV_ADC模块API手册.md
+ machine/K230_CanMV_FFT模块API手册.md
+ machine/K230_CanMV_GPIO模块API手册.md
+ machine/K230_CanMV_I2C模块API手册.md
+ machine/K230_CanMV_IOMUX_API手册.md
+ machine/K230_CanMV_PWM模块API手册.md
+ machine/K230_CanMV_SPI模块API手册.md
+ machine/K230_CanMV_Timer模块API手册.md
+ machine/K230_CanMV_WDT模块API手册.md
+ machine/K230_CanMV_UART模块API手册.md
+ machine/K230_CanMV_machine模块API手册.md
diff --git "a/zh/api/machine/K230_CanMV_ADC\346\250\241\345\235\227API\346\211\213\345\206\214.md" "b/zh/api/machine/K230_CanMV_ADC\346\250\241\345\235\227API\346\211\213\345\206\214.md"
index a81c0df..9a740a8 100755
--- "a/zh/api/machine/K230_CanMV_ADC\346\250\241\345\235\227API\346\211\213\345\206\214.md"
+++ "b/zh/api/machine/K230_CanMV_ADC\346\250\241\345\235\227API\346\211\213\345\206\214.md"
@@ -1,4 +1,4 @@
-# K230 CanMV ADC API手册
+# K230 CanMV ADC 模块API手册
![cover](../images/canaan-cover.png)
@@ -29,7 +29,7 @@
### 概述
-本文档主要介绍canmv中ADC的使用
+本文档主要介绍machine模块下的ADC类API。
### 读者对象
@@ -48,157 +48,66 @@
| 文档版本号 | 修改说明 | 修改者 | 日期 |
| ---------- | -------- | ---------- | ---------- |
-| V1.0 | 初版 | 史文涛 | 2023-09-27 |
+| V1.0 | 初版 | 软件部 | 2023-09-27 |
## 1. 概述
-ADC提供了channel配置、使能、关闭和读取数据功能
+K230内部包含一个ADC硬件模块,有6个通道,采样分辨率为12bit(0-4095),采样速率为1M。
## 2. API描述
-ADC提供了一个类ADC,实现了三个函数,init(),deinit(),value()
+ADC类位于machine模块下
-### 2.1 类 machine.ADC
-
-【描述】
-
-通过指定的参数新建一个 ADC 对象。
-
-【语法】
+### 示例
```python
from machine import ADC
-ADC = ADC(channel, start=True)
+# 实例化ADC通道0
+adc = ADC(0)
+# 获取ADC通道0采样值
+print(adc.read_u16())
+# 获取ADC通道0电压值
+print(adc.read_uv(), "uV")
```
-【参数】
-
-| 参数名称 | 描述 | 输入/输出 |
-|-----------------|-------------------------------|-----------|
-| channel | 通道号(0~5)。 | 输入 |
-| start | 是否使能adc,默认为True | 输入 |
-
-【返回值】
-
-| 返回值 | 描述 |
-|---------|---------------------------------|
-| 0 | 成功 |
-| 非 0 | 失败 |
-
-【注意】
-
-无
-
-【举例】
-
-无
-
-【相关主题】
-
-无
-
-#### 2.1.1 value()
-
-【描述】
-
-获取转换后的数据。
-
-【语法】
+### 构造函数
```python
-ADC.value()
+adc = ADC(channel)
```
【参数】
-| 参数名称 | 描述 | 输入/输出 |
-|-----------------|-------------------------------|-----------|
-无
-
-【返回值】
-
-转换后的数据
-
-【注意】
-
-无
-
-【举例】
-
-无
-
-【相关主题】
-
-无
+- channel: ADC通道号,取值:[0,5]
-#### 2.1.2 init()
-
-【描述】
-
-初始化channel配置
-
-【语法】
+### read_u16
```python
-ADC.init(channel, start)
+ADC.read_u16()
```
-【参数】
-
-| 参数名称 | 描述 | 输入/输出 |
-|-----------------|-------------------------------|-----------|
-| channel | 通道号(0~5)。 | 输入 |
-| start | 是否使能adc。 | 输入 |
-【返回值】
-
-| 返回值 | 描述 |
-|---------|---------------------------------|
-| 0 | 成功 |
-| 非 0 | 失败 |
-
-【注意】
-
-无
-
-【举例】
+获取通道采样值
-无
-
-【相关主题】
+【参数】
无
-#### 2.1.3 deinit()
-
-【描述】
+【返回值】
-关闭channel
+返回当前ADC通道采样值,[0-4095]
-【语法】
+### read_uv
```python
-ADC.deinit()
+ADC.read_uv()
```
+获取通道电压值
+
【参数】
无
【返回值】
-| 返回值 | 描述 |
-|---------|---------------------------------|
-| 0 | 成功 |
-| 非 0 | 失败 |
-
-【注意】
-
-无
-
-【举例】
-
-无
-
-【相关主题】
-
-无
+返回当前ADC通道电压值,[0-1800000]
diff --git "a/zh/api/machine/K230_CanMV_FFT\346\250\241\345\235\227API\346\211\213\345\206\214.md" "b/zh/api/machine/K230_CanMV_FFT\346\250\241\345\235\227API\346\211\213\345\206\214.md"
index 0a6642b..b26c6bb 100755
--- "a/zh/api/machine/K230_CanMV_FFT\346\250\241\345\235\227API\346\211\213\345\206\214.md"
+++ "b/zh/api/machine/K230_CanMV_FFT\346\250\241\345\235\227API\346\211\213\345\206\214.md"
@@ -48,7 +48,7 @@
| 文档版本号 | 修改说明 | 修改者 | 日期 |
| ---------- | -------- | ---------- | ---------- |
-| V1.0 | 初版 | 史文涛 | 2023-10-16 |
+| V1.0 | 初版 | 软件部 | 2023-10-16 |
## 1. 概述
diff --git "a/zh/api/machine/K230_CanMV_FPIOA\346\250\241\345\235\227API\346\211\213\345\206\214.md" "b/zh/api/machine/K230_CanMV_FPIOA\346\250\241\345\235\227API\346\211\213\345\206\214.md"
new file mode 100755
index 0000000..c555d3d
--- /dev/null
+++ "b/zh/api/machine/K230_CanMV_FPIOA\346\250\241\345\235\227API\346\211\213\345\206\214.md"
@@ -0,0 +1,170 @@
+# K230 CanMV FPIOA 模块API手册
+
+![cover](../images/canaan-cover.png)
+
+版权所有©2023北京嘉楠捷思信息技术有限公司
+
+
+
+## 免责声明
+
+您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)及其关联公司的商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的正确性、可靠性、完整性、适销性、符合特定目的和不侵权提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导参考。
+
+由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。
+
+## 商标声明
+
+![logo](../images/logo.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。
+
+**版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。**
+非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。
+
+
+
+## 目录
+
+[TOC]
+
+## 前言
+
+### 概述
+
+本文档主要介绍machine模块下的FPIOA类API。
+
+### 读者对象
+
+本文档(本指南)主要适用于以下人员:
+
+- 技术支持工程师
+- 软件开发工程师
+
+### 缩略词定义
+
+| 简称 | 说明 |
+| ---- | ---- |
+| GPIO | General Purpose Input Output (通用输入/输出) |
+| iomux | Pin multiplexing(管脚功能选择) |
+| FPIOA | Field Programmable Input and Output Array(现场可编程 IO 阵列) |
+
+### 修订记录
+
+| 文档版本号 | 修改说明 | 修改者 | 日期 |
+| ---------- | -------- | ---------- | ---------- |
+| V1.0 | 初版 | 软件部 | 2023-10-08 |
+
+## 1. 概述
+
+IOMUX主要配置物理PAD(管脚)的功能,由于soc功能多管脚(pads)少,多个功能共享同一个I/O管脚(pads),但是一个pads同一时间只能使用其中一个功能,所以需要IOMUX进行功能选择。IOMUX也叫FPIOA,Pin multiplexing,管脚功能选择等。
+
+## 2. API描述
+
+FPIOA类位于machine模块下
+
+### 示例
+
+```python
+from machine import FPIOA
+# 实例化FPIOA
+fpioa = FPIOA()
+# 打印所有引脚配置
+fpioa.help()
+# 打印指定引脚详细配置
+fpioa.help(0)
+# 打印指定功能所有可用的配置引脚
+fpioa.help(FPIOA.IIC0_SDA, func=True)
+# 设置Pin0为GPIO0
+fpioa.set_function(0, FPIOA.GPIO0)
+# 设置Pin2为GPIO2, 同时配置其它项
+fpioa.set_function(2, FPIOA.GPIO2, ie=1, oe=1, pu=0, pd=0, st=1, sl=0, ds=7)
+# 获取指定功能当前所在的引脚
+fpioa.get_pin_num(FPIOA.UART0_TXD)
+# 获取指定引脚当前功能
+fpioa.get_pin_func(0)
+```
+
+### 构造函数
+
+```python
+fpioa = FPIOA()
+```
+
+【参数】
+
+无
+
+### freq
+
+```python
+FPIOA.set_function(pin, func, ie=-1, oe=-1, pu=-1, pd=-1, st=-1, sl=-1, ds=-1)
+```
+
+设置引脚的功能
+
+【参数】
+
+- pin: 引脚号,取值:[0,63]
+- func: 功能号
+- ie: 重新设置输入使能,可选参数
+- oe: 重新设置输出使能,可选参数
+- pu: 重新设置上拉使能,可选参数
+- pd: 重新设置下拉使能,可选参数
+- st: 重新设置st使能,可选参数
+- sl: 重新设置sl使能,可选参数
+- ds: 重新设置驱动能力,可选参数
+
+【返回值】
+
+无
+
+### get_pin_num
+
+```python
+PWM.get_pin_num(func)
+```
+
+获取指定功能当前所在引脚
+
+【参数】
+
+- func: 功能号
+
+【返回值】
+
+返回空或引脚号
+
+### get_pin_func
+
+```python
+PWM.get_pin_func(pin)
+```
+
+获取指定引脚当前的功能
+
+【参数】
+
+- pin: 引脚号
+
+【返回值】
+
+引脚当前的功能号
+
+### help
+
+```python
+PWM.help([number, func=false])
+```
+
+打印引脚配置提示信息
+
+【参数】
+
+- number: 引脚号或功能号,可选参数
+- func: 使能功能号查询,可选参数
+
+【返回值】
+
+可能为以下三种:
+
+1. 所有引脚的配置信息(未设置number)
+1. 指定引脚的详细配置信息(设置number,未设置func或设置为false)
+1. 指定功能所有可配置的引脚号(设置number,设置func为true)
diff --git "a/zh/api/machine/K230_CanMV_GPIO\346\250\241\345\235\227API\346\211\213\345\206\214.md" "b/zh/api/machine/K230_CanMV_GPIO\346\250\241\345\235\227API\346\211\213\345\206\214.md"
deleted file mode 100755
index 1485bdb..0000000
--- "a/zh/api/machine/K230_CanMV_GPIO\346\250\241\345\235\227API\346\211\213\345\206\214.md"
+++ /dev/null
@@ -1,261 +0,0 @@
-# K230 CanMV GPIO API手册
-
-![cover](../images/canaan-cover.png)
-
-版权所有©2023北京嘉楠捷思信息技术有限公司
-
-
-
-## 免责声明
-
-您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)及其关联公司的商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的正确性、可靠性、完整性、适销性、符合特定目的和不侵权提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导参考。
-
-由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。
-
-## 商标声明
-
-![logo](../images/logo.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。
-
-**版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。**
-非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。
-
-
-
-## 目录
-
-[TOC]
-
-## 前言
-
-### 概述
-
-本文档主要介绍 canmv中GPIO的使用
-
-### 读者对象
-
-本文档(本指南)主要适用于以下人员:
-
-- 技术支持工程师
-- 软件开发工程师
-
-### 缩略词定义
-
-| 简称 | 说明 |
-| ---- | ---- |
-| GPIO | General Purpose Input Output (通用输入/输出) |
-
-### 修订记录
-
-| 文档版本号 | 修改说明 | 修改者 | 日期 |
-| ---------- | -------- | ---------- | ---------- |
-| V1.0 | 初版 | 史文涛 | 2023-09-20 |
-
-## 1. 概述
-
-GPIO提供了设置gpio模式及引脚状态,并可配置pin的中断模式
-
-## 2. API描述
-
-GPIO提供了一个类GPIO,实现了四个函数,设置引脚状态value([value]),设置GPIO输入输出模式mode(MODE),
-配置中断和关闭中断。
-
-### 2.1 类 machine.GPIO
-
-【描述】
-
-通过指定的参数新建一个 GPIO 对象。
-
-【语法】
-
-```python
-from machine import GPIO
-gpio = GPIO(ID, MODE, PULL, VALUE)
-```
-
-【参数】
-
-| 参数名称 | 描述 | 输入/输出 |
-|-----------------|-------------------------------|-----------|
-| ID | 使用的 GPIO 引脚。 | 输入 |
-| GPIO模式 | GPIO模式,GPIO.IN就是输入模式,GPIO.OUT就是输出模式 | 输入 |
-| PULL | GPIO上下拉模式,GPIO.PULL_UP 上拉,GPIO.PULL_DOWN 下拉, GPIO.PULL_NONE 即不上拉也不下拉 | 输入 |
-| VALUE | 修改GPIO引脚状态。 | 输入 |
-
-【返回值】
-
-| 返回值 | 描述 |
-|---------|---------------------------------|
-| 0 | 成功 |
-| 非 0 | 失败 |
-
-【注意】
-
-无
-
-【举例】
-
-无
-
-【相关主题】
-
-无
-
-#### 2.1.1 value([value])
-
-【描述】
-
-修改/读取 GPIO 引脚状态。
-
-【语法】
-
-```python
-GPIO.value([value])
-```
-
-【参数】
-
-| 参数名称 | 描述 | 输入/输出 |
-|-----------------|-------------------------------|-----------|
-| [value] | 可选参数,如果此参数不为空,则返回当前 GPIO 引脚状态 | 输入 |
-
-【返回值】
-
-| 返回值 | 描述 |
-|---------|---------------------------------|
-| 0 | 成功 |
-| 非 0 | 失败 |
-
-【注意】
-
-无
-
-【举例】
-
-无
-
-【相关主题】
-
-无
-
-#### 2.1.2 mode(MODE)
-
-【描述】
-
-设置 GPIO 输入输出模式
-
-【语法】
-
-```python
-GPIO.mode(MODE)
-```
-
-【参数】
-
-MODE
-
-• GPIO.IN 输入模式
-
-• GPIO.PULL_UP 上拉输入模式
-
-• GPIO.PULL_DOWN 下拉输入模式
-
-• GPIO.OUT 输出模式
-
-【返回值】
-
-| 返回值 | 描述 |
-|---------|---------------------------------|
-| 0 | 成功 |
-| 非 0 | 失败 |
-
-【注意】
-
-无
-
-【举例】
-
-无
-
-【相关主题】
-
-无
-
-#### 2.1.3 irq
-
-【描述】
-
-配置一个中断处理程序,当 pin 的触发源处于活动状态时调用它。如果管脚模式为 pin.in,则触发源是管脚上的外部值。
-
-【语法】
-
-```python
-GPIO.irq(CALLBACK_FUNC,TRIGGER_CONDITION,GPIO.WAKEUP_NOT_SUPPORT,PRORITY)
-```
-
-【参数】
-
-• CALLBACK_FUNC:中断回调函数,当中断触发的时候被调用,一个入口函数 pin_num
-
-• PIN_NUM 返回的是触发中断的 GPIO 引脚号(只有GPIOHS支持中断,所以这里的引脚号也是GPIOHS的引脚号)
-
-• TRIGGER_CONDITION:GPIO 引脚的中断触发模式
-
-• GPIO.IRQ_RISING 上升沿触发
-
-• GPIO.IRQ_FALLING 下降沿触发
-
-• GPIO.IRQ_BOTH 上升沿和下降沿都触发
-
-【返回值】
-
-| 返回值 | 描述 |
-|---------|---------------------------------|
-| 0 | 成功 |
-| 非 0 | 失败 |
-
-【注意】
-
-无
-
-【举例】
-
-无
-
-【相关主题】
-
-无
-
-#### 2.1.4 disirq
-
-【描述】
-
-关闭中断
-
-【语法】
-
-```python
-GPIO.disirq()
-```
-
-【参数】
-
-无
-
-【返回值】
-
-| 返回值 | 描述 |
-|---------|---------------------------------|
-| 0 | 成功 |
-| 非 0 | 失败 |
-
-【注意】
-
-无
-
-【举例】
-
-无
-
-【相关主题】
-
-无
diff --git "a/zh/api/machine/K230_CanMV_I2C\346\250\241\345\235\227API\346\211\213\345\206\214.md" "b/zh/api/machine/K230_CanMV_I2C\346\250\241\345\235\227API\346\211\213\345\206\214.md"
index fa3a167..66239c8 100755
--- "a/zh/api/machine/K230_CanMV_I2C\346\250\241\345\235\227API\346\211\213\345\206\214.md"
+++ "b/zh/api/machine/K230_CanMV_I2C\346\250\241\345\235\227API\346\211\213\345\206\214.md"
@@ -52,7 +52,7 @@
## 1. 概述
-K230内部包含五个I2C硬件模块,支持7/10比特地址;支持标准100kb/s,快速400kb/s模式,高速模式3.4Mb/s。
+K230内部包含五个I2C硬件模块,支持标准100kb/s,快速400kb/s模式,高速模式3.4Mb/s。
通道输出IO配置参考IOMUX模块。
## 2. API描述
@@ -63,8 +63,8 @@ I2C类位于machine模块下
```python
from machine import I2C
-# i2c0 init 100KHz clock,7 bit address mode
-i2c = I2C(0, freq=100000, addr_size=7)
+# i2c0 init 100KHz clock
+i2c = I2C(0, freq=100000)
# Scan the slave on the I2C bus
i2c.scan()
# Reading data from the bus
@@ -79,19 +79,20 @@ i2c.readfrom_mem(addr, memaddr, nbytes, mem_size=8)
i2c.readfrom_mem_into(addr, memaddr, buf, mem_size=8)
# Write data to slave register
i2c.writeto_mem(addr, memaddr, buf, mem_size=8)
+# i2c deinit
+i2c.deinit()
```
### 构造函数
```python
-i2c = I2C(id, freq=100000, addr_size=7)
+i2c = I2C(id, freq=100000)
```
【参数】
- id: I2C ID, [0~4] (I2C.I2C0~I2C.I2C4)
- freq: I2C时钟频率
-- addr_size: 地址寻址模式
### scan
@@ -219,3 +220,19 @@ i2c.writeto_mem(addr, memaddr, buf, mem_size=8)
【返回值】
无
+
+### deinit
+
+```python
+i2c.deinit()
+```
+
+释放i2c资源
+
+【参数】
+
+无
+
+【返回值】
+
+无
diff --git "a/zh/api/machine/K230_CanMV_IOMUX_API\346\211\213\345\206\214.md" "b/zh/api/machine/K230_CanMV_IOMUX_API\346\211\213\345\206\214.md"
deleted file mode 100755
index 637ff67..0000000
--- "a/zh/api/machine/K230_CanMV_IOMUX_API\346\211\213\345\206\214.md"
+++ /dev/null
@@ -1,274 +0,0 @@
-# K230 CanMV IOMUX API手册
-
-![cover](../images/canaan-cover.png)
-
-版权所有©2023北京嘉楠捷思信息技术有限公司
-
-
-
-## 免责声明
-
-您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)及其关联公司的商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的正确性、可靠性、完整性、适销性、符合特定目的和不侵权提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导参考。
-
-由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。
-
-## 商标声明
-
-![logo](../images/logo.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。
-
-**版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。**
-非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。
-
-
-
-## 目录
-
-[TOC]
-
-## 前言
-
-### 概述
-
-本文档主要介绍 canmv中IOMUX的使用
-
-### 读者对象
-
-本文档(本指南)主要适用于以下人员:
-
-- 技术支持工程师
-- 软件开发工程师
-
-### 缩略词定义
-
-| 简称 | 说明 |
-| ---- | ---- |
-| GPIO | General Purpose Input Output (通用输入/输出) |
-| iomux | Pin multiplexing(管脚功能选择) |
-| FPIOA | Field Programmable Input and Output Array(现场可编程 IO 阵列) |
-
-### 修订记录
-
-| 文档版本号 | 修改说明 | 修改者 | 日期 |
-| ---------- | -------- | ---------- | ---------- |
-| V1.0 | 初版 | 王建新 | 2023-10-08 |
-
-## 1. 概述
-
-IOMUX主要配置物理PAD(管脚)的功能,由于soc功能多管脚(pads)少,多个功能共享同一个I/O管脚(pads),但是一个pads同一时间只能使用其中一个功能,所以需要IOMUX进行功能选择。IOMUX也叫FPIOA,Pin multiplexing,管脚功能选择等。
-
-## 2. API描述
-
-IOMUX提供了一个类FPIOA,实现设置I/O管脚的功能函数set_function,和查看功能对应管脚的函数
-
-### 2.1 类 machine.FPIOA
-
-【描述】
-
-FPIOA主要功能是选择I/O管脚的功能。
-
-【语法】
-
-```python
-FPIOA()
-```
-
-【参数】
-
-无
-
-【返回值】
-
-无
-
-【注意】
-
-无
-
-【举例】
-
-```python
-fpioa = FPIOA()
-fpioa.set_function(26, fm.fpioa.MMC1_CLK)
-```
-
-【相关主题】
-
-无
-
-#### 2.1.1 set_function(pin, func)
-
-【描述】
-
-设置管脚对应的外设功能。
-
-【语法】
-
-```python
-set_function(pin, func)
-```
-
-【参数】
-
-| 参数名称 | 描述 | 输入/输出 |
-|-----------------|-------------------------------|-----------|
-| pin | pin(pad)管脚号,取值 [0, 63] | 输入 |
-| func | 外设功能,取值和pin有关,请输入help命令查看管脚的可配置功能 | 输入 |
-
-【返回值】
-
-| 返回值 | 描述 |
-|---------|---------------------------------|
-| 0 | 成功 |
-| 非 0 | 失败 |
-
-【注意】
-
-每个管脚可配的功能都不一样,请输入help命令查看管脚的可配置功能。
-
-【举例】
-
-```python
-fpioa = FPIOA()
-fpioa.set_function(26, fm.fpioa.MMC1_CLK)
-```
-
-【相关主题】
-
-无
-
-#### 2.1.2 get_Pin_num
-
-【描述】
-
-查看外设功能对应的管脚
-
-【语法】
-
-```python
-fpioa.get_Pin_num(func)
-```
-
-【参数】
-
-| 参数名称 | 描述 | 输入/输出 |
-| -------- | ---- | --------- |
-| func | 功能 | 输入 |
-
-【返回值】
-
-| 返回值 | 描述 |
-| ------ | -------------- |
-| 0-64 | 成功,pin管脚号 |
-| -1 | 失败 |
-
-【注意】
-
-无
-
-【举例】
-
-```python
-fpioa = FPIOA()
-fpioa.get_Pin_num(fm.fpioa.MMC1_CLK)
-```
-
-【相关主题】
-
-无
-
-#### 2.1.3 help
-
-【描述】
-
-显示所有管脚的可选功能
-
-【语法】
-
-```python
-help()
-```
-
-【参数】
-
-无
-
-【返回值】
-
-| pin | func |
-| ---- | ------------------------------------------------------- |
-| 0 | GPIO0/BOOT0/TEST_PIN0 |
-| 1 | GPIO1/BOOT1/TEST_PIN1 |
-| 2 | GPIO2/JTAG_TCK/PULSE_CNTR0/TEST_PIN2 |
-| 3 | GPIO3/JTAG_TDI/PULSE_CNTR1/UART1_TXD/TEST_PIN0 |
-| 4 | GPIO4/JTAG_TDO/PULSE_CNTR2/UART1_RXD/TEST_PIN1 |
-| 5 | GPIO5/JTAG_TMS/PULSE_CNTR3/UART2_TXD/TEST_PIN2 |
-| 6 | GPIO6/JTAG_RST/PULSE_CNTR4/UART2_RXD/TEST_PIN3 |
-| 7 | GPIO7/PWM2/IIC4_SCL/TEST_PIN3/DI0 |
-| 8 | GPIO8/PWM3/IIC4_SDA/TEST_PIN4/DI1 |
-| 9 | GPIO9/PWM4/UART1_TXD/IIC1_SCL/DI2 |
-| 10 | GPIO10/3D_CTRL_IN/UART1_RXD/IIC1_SDA/DI3 |
-| 11 | GPIO11/3D_CTRL_OUT1/UART2_TXD/IIC2_SCL/DO0 |
-| 12 | GPIO12/3D_CTRL_OUT2/UART2_RXD/IIC2_SDA/DO1 |
-| 13 | GPIO13/M_CLK1/DO2 |
-| 14 | GPIO14/OSPI_CS/TEST_PIN5/QSPI0_CS0/DO3 |
-| 15 | GPIO15/OSPI_CLK/TEST_PIN6/QSPI0_CLK/CO3 |
-| 16 | GPIO16/OSPI_D0/QSPI1_CS4/QSPI0_D0/CO2 |
-| 17 | GPIO17/OSPI_D1/QSPI1_CS3/QSPI0_D1/CO1 |
-| 18 | GPIO18/OSPI_D2/QSPI1_CS2/QSPI0_D2/CO0 |
-| 19 | GPIO19/OSPI_D3/QSPI1_CS1/QSPI0_D3/TEST_PIN4 |
-| 20 | GPIO20/OSPI_D4/QSPI1_CS0/PULSE_CNTR0/TEST_PIN5 |
-| 21 | GPIO21/OSPI_D5/QSPI1_CLK/PULSE_CNTR1/TEST_PIN6 |
-| 22 | GPIO22/OSPI_D6/QSPI1_D0/PULSE_CNTR2/TEST_PIN7 |
-| 23 | GPIO23/OSPI_D7/QSPI1_D1/PULSE_CNTR3/TEST_PIN8 |
-| 24 | GPIO24/OSPI_DQS/QSPI1_D2/PULSE_CNTR4/TEST_PIN9 |
-| 25 | GPIO25/PWM5/QSPI1_D3/PULSE_CNTR5/TEST_PIN10 |
-| 26 | GPIO26/MMC1_CLK/TEST_PIN7PDM_CLK |
-| 27 | GPIO27/MMC1_CMD/PULSE_CNTR5/PDM_IN0/CI0 |
-| 28 | GPIO28/MMC1_D0/UART3_TXD/PDM_IN1/CI1 |
-| 29 | GPIO29/MMC1_D1/UART3_RXD/3D_CTRL_IN/CI2 |
-| 30 | GPIO30/MMC1_D2/UART3_RTS/3D_CTRL_OUT1/CI3 |
-| 31 | GPIO31/MMC1_D3/UART3_CTS/3D_CTRL_OUT2/TEST_PIN11 |
-| 32 | GPIO32/IIC0_SCL/IIS_CLK/UART3_TXD/TEST_PIN12 |
-| 33 | GPIO33/IIC0_SDA/IIS_WS/UART3_RXD/TEST_PIN13 |
-| 34 | GPIO34/IIC1_SCL/IIS_D_IN0/PDM_IN3/UART3_RTS/TEST_PIN14 |
-| 35 | GPIO35/IIC1_SDA/IIS_D_OUT0/PDM_IN1/UART3_CTS/TEST_PIN15 |
-| 36 | GPIO36/IIC3_SCL/IIS_D_IN1/PDM_IN2/UART4_TXD/TEST_PIN16 |
-| 37 | GPIO37/IIC3_SDA/IIS_D_OUT1/PDM_IN0/UART4_RXD/TEST_PIN17 |
-| 38 | GPIO38/UART0_TXD/TEST_PIN8/QSPI1_CS0/HSYNC0 |
-| 39 | GPIO39/UART0_RXD/TEST_PIN9/QSPI1_CLK/VSYNC0 |
-| 40 | GPIO40/UART1_TXD/IIC1_SCL/QSPI1_D0/TEST_PIN18 |
-| 41 | GPIO41/UART1_RXD/IIC1_SDA/QSPI1_D1/TEST_PIN19 |
-| 42 | GPIO42/UART1_RTS/PWM0/QSPI1_D2/TEST_PIN20 |
-| 43 | GPIO43/UART1_CTS/PWM1/QSPI1_D3/TEST_PIN21 |
-| 44 | GPIO44/UART2_TXD/IIC3_SCL/TEST_PIN10/SPI2AXI_CLK |
-| 45 | GPIO45/UART2_RXD/IIC3_SDA/TEST_PIN11/SPI2AXI_CS |
-| 46 | GPIO46/UART2_RTS/PWM2/IIC4_SCL/TEST_PIN22 |
-| 47 | GPIO47/UART2_CTS/PWM3/IIC4_SDA/TEST_PIN23 |
-| 48 | GPIO48/UART4_TXD/TEST_PIN12/IIC0_SCL/SPI2AXI_DIN |
-| 49 | GPIO49/UART4_RXD/TEST_PIN13/IIC0_SDA/SPI2AXI_DOUT |
-| 50 | GPIO50/UART3_TXD/IIC2_SCL/QSPI0_CS4/TEST_PIN24 |
-| 51 | GPIO51/UART3_RXD/IIC2_SDA/QSPI0_CS3/TEST_PIN25 |
-| 52 | GPIO52/UART3_RTS/PWM4/IIC3_SCL/TEST_PIN26 |
-| 53 | GPIO53/UART3_CTS/PWM5/IIC3_SDA |
-| 54 | GPIO54/QSPI0_CS0/MMC1_CMD/PWM0/TEST_PIN27 |
-| 55 | GPIO55/QSPI0_CLK/MMC1_CLK/PWM1/TEST_PIN28 |
-| 56 | GPIO56/QSPI0_D0/MMC1_D0/PWM2/TEST_PIN29 |
-| 57 | GPIO57/QSPI0_D1/MMC1_D1/PWM3/TEST_PIN30 |
-| 58 | GPIO58/QSPI0_D2/MMC1_D2/PWM4/TEST_PIN31 |
-| 59 | GPIO59/QSPI0_D3/MMC1_D3/PWM5 |
-| 60 | GPIO60/PWM0/IIC0_SCL/QSPI0_CS2/HSYNC1 |
-| 61 | GPIO61/PWM1/IIC0_SDA/QSPI0_CS1/VSYNC1 |
-| 62 | GPIO62/M_CLK2/UART3_DE/TEST_PIN14 |
-| 63 | GPIO63/M_CLK3/UART3_RE/TEST_PIN15 |
-
-【注意】
-
-无
-
-【举例】
-
-无
-
-【相关主题】
-
-无
diff --git "a/zh/api/machine/K230_CanMV_PWM\346\250\241\345\235\227API\346\211\213\345\206\214.md" "b/zh/api/machine/K230_CanMV_PWM\346\250\241\345\235\227API\346\211\213\345\206\214.md"
index de7e346..ada16c3 100755
--- "a/zh/api/machine/K230_CanMV_PWM\346\250\241\345\235\227API\346\211\213\345\206\214.md"
+++ "b/zh/api/machine/K230_CanMV_PWM\346\250\241\345\235\227API\346\211\213\345\206\214.md"
@@ -85,7 +85,7 @@ pwm = PWM(channel, freq, duty=50, enable=False)
【参数】
-- channel: PWM通道号
+- channel: PWM通道号,取值:[0,5]
- freq: PWM通道输出频率
- duty: PWM通道输出占空比,指高电平占整个周期的百分比,取值:[0,100],可选参数,默认50
- enable: PWM通道输出立即使能,可选参数,默认False
@@ -93,7 +93,7 @@ pwm = PWM(channel, freq, duty=50, enable=False)
### freq
```python
-PWM.freq(freq)
+PWM.freq([freq])
```
获取或设置PWM通道输出频率
@@ -109,7 +109,7 @@ PWM.freq(freq)
### duty
```python
-PWM.duty(duty)
+PWM.duty([duty])
```
获取或设置PWM通道输出占空比
diff --git "a/zh/api/machine/K230_CanMV_Pin\346\250\241\345\235\227API\346\211\213\345\206\214.md" "b/zh/api/machine/K230_CanMV_Pin\346\250\241\345\235\227API\346\211\213\345\206\214.md"
new file mode 100755
index 0000000..f4201cf
--- /dev/null
+++ "b/zh/api/machine/K230_CanMV_Pin\346\250\241\345\235\227API\346\211\213\345\206\214.md"
@@ -0,0 +1,230 @@
+# K230 CanMV Pin 模块API手册
+
+![cover](../images/canaan-cover.png)
+
+版权所有©2023北京嘉楠捷思信息技术有限公司
+
+
+
+## 免责声明
+
+您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)及其关联公司的商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的正确性、可靠性、完整性、适销性、符合特定目的和不侵权提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导参考。
+
+由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。
+
+## 商标声明
+
+![logo](../images/logo.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。
+
+**版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。**
+非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。
+
+
+
+## 目录
+
+[TOC]
+
+## 前言
+
+### 概述
+
+本文档主要介绍machine模块下的Pin类API。
+
+### 读者对象
+
+本文档(本指南)主要适用于以下人员:
+
+- 技术支持工程师
+- 软件开发工程师
+
+### 缩略词定义
+
+| 简称 | 说明 |
+| ---- | ---- |
+| GPIO | General Purpose Input Output (通用输入/输出) |
+
+### 修订记录
+
+| 文档版本号 | 修改说明 | 修改者 | 日期 |
+| ---------- | -------- | ---------- | ---------- |
+| V1.0 | 初版 | 软件部 | 2023-09-20 |
+
+## 1. 概述
+
+K230内部包含64个GPIO Pin,每个Pin可配置为输入或输出,可配置上下拉,可配置驱动能力。
+
+## 2. API描述
+
+Pin类位于machine模块下
+
+### 示例
+
+```python
+from machine import Pin
+# 实例化Pin2为输出
+pin = Pin(2, Pin.OUT, pull=Pin.PULL_NONE, drive=7)
+# 设置输出为高
+pin.value(1)
+# 设置输出为低
+pin.value(0)
+```
+
+### 构造函数
+
+```python
+pin = Pin(index, mode, pull=Pin.PULL_NONE, drive=7)
+```
+
+【参数】
+
+- index: 引脚号,取值:[0,63]
+- mode: 输入或输出模式
+- pull: 上下拉配置,可选参数,默认PULL_NONE
+- drive: 驱动能力配置,可选参数,默认7
+
+### init
+
+```python
+Pin.init(mode, pull=Pin.PULL_NONE, drive=7)
+```
+
+配置引脚模式,上下拉,驱动能力
+
+【参数】
+
+- mode: 输入或输出模式
+- pull: 上下拉配置,可选参数,默认PULL_NONE
+- drive: 驱动能力配置,可选参数,默认7
+
+【返回值】
+
+无
+
+### value
+
+```python
+Pin.value([value])
+```
+
+获取引脚输入或设置引脚输出
+
+【参数】
+
+- value: 输出值,可选参数,如果不传参数则返回输入值
+
+【返回值】
+
+返回空或当前引脚输入值
+
+### mode
+
+```python
+Pin.mode([mode])
+```
+
+获取或设置引脚输入输出模式
+
+【参数】
+
+- mode: 输入输出模式,可选参数,如果不传参数则返回当前输入输出模式
+
+【返回值】
+
+返回空或当前引脚输入输出模式
+
+### pull
+
+```python
+Pin.pull([pull])
+```
+
+获取或设置引脚上下拉配置
+
+【参数】
+
+- pull: 上下拉配置,可选参数,如果不传参数则返回当前上下拉配置
+
+【返回值】
+
+返回空或当前引脚上下拉配置
+
+### drive
+
+```python
+Pin.drive([drive])
+```
+
+获取或设置引脚驱动能力
+
+【参数】
+
+- drive: 驱动能力,可选参数,如果不传参数则返回当前驱动能力
+
+【返回值】
+
+返回空或当前引脚驱动能力
+
+### on
+
+```python
+Pin.on()
+```
+
+设置输出高
+
+【参数】
+
+无
+
+【返回值】
+
+无
+
+### off
+
+```python
+Pin.off()
+```
+
+设置输出低
+
+【参数】
+
+无
+
+【返回值】
+
+无
+
+### high
+
+```python
+Pin.high()
+```
+
+设置输出高
+
+【参数】
+
+无
+
+【返回值】
+
+无
+
+### low
+
+```python
+Pin.low()
+```
+
+设置输出低
+
+【参数】
+
+无
+
+【返回值】
+
+无
diff --git "a/zh/api/machine/K230_CanMV_Timer\346\250\241\345\235\227API\346\211\213\345\206\214.md" "b/zh/api/machine/K230_CanMV_Timer\346\250\241\345\235\227API\346\211\213\345\206\214.md"
index 37a5f01..9645880 100755
--- "a/zh/api/machine/K230_CanMV_Timer\346\250\241\345\235\227API\346\211\213\345\206\214.md"
+++ "b/zh/api/machine/K230_CanMV_Timer\346\250\241\345\235\227API\346\211\213\345\206\214.md"
@@ -1,4 +1,4 @@
-# K230 CanMV Timer API手册
+# K230 CanMV Timer 模块API手册
![cover](../images/canaan-cover.png)
@@ -29,7 +29,7 @@
### 概述
-硬件定时器,可以用来定时触发任务或者处理任务。
+本文档主要介绍machine模块下的Timer类API。
### 读者对象
@@ -48,240 +48,69 @@
| 文档版本号 | 修改说明 | 修改者 | 日期 |
| ---------- | -------- | ---------- | ---------- |
-| V1.0 | 初版 | 史文涛 | 2023-09-22 |
+| V1.0 | 初版 | 软件部 | 2023-09-22 |
## 1. 概述
-硬件定时器,可以用来定时触发任务或者处理任务,设定时间到了后可以触发中断(调用回调函数),精度比软件定时器高。需要注意的是,定时器在不同的硬件中可能会有不同的表现。MicroPython 的 Timer 类定义了在给定时间段内(或在一段延迟后执行一次回调)执行回调的基本操作
+K230内部包含6个Timer硬件模块,最小定时周期为1us。
## 2. API描述
-Timer提供了一个类 Timer,实现了六个函数
+Timer类位于machine模块下
-### 2.1 类 machine.Timer
-
-【描述】
-
-通过指定的参数新建一个 Timer 对象。
-
-【语法】
+### 示例
```python
from machine import Timer
-tim = machine.Timer(mode=Timer.MODE_ONE_SHOT,period=1000, unit=Timer.UNIT_MS, callback=None, arg=None, start=True)
+# 实例化一个软定时器
+tim = Timer(-1)
+tim.init(period=100, mode=Timer.ONE_SHOT, callback=lambda t:print(1))
+tim.init(period=1000, mode=Timer.PERIODIC, callback=lambda t:print(2))
+tim.deinit()
```
-【参数】
-
-| 参数名称 | 描述 | 输入/输出 |
-|-----------------|-------------------------------|-----------|
-| mode | Timer模式,MODE_ONE_SHOT或MODE_PERIODIC | 输入 |
-| period | TImer周期, 在启动定时器后 period 时间, 回调函数将会被调用 | 输入 |
-| unit | 设置周期的单位,默认位毫秒(ms),Timer.UNIT_S 或者 Timer.UNIT_MS 或者 Timer.UNIT_US 或者Timer.UNIT_NS | 输入 |
-| callback | 定时器回调函数, 定义了两个参数, 一个是定时器对象Timer, 第二个是在定义对象是希望传的参数arg,更多请看arg参数解释 | 输入 |
-| arg | 希望传给回调函数的参数,作为回调函数的第二个参数 | 输入 |
-| start | 是否在对象构建成功后立即开始定时器,True:立即开始,False:不立即开启,需要调用start()函数来启动定时器 | 输入 |
-【返回值】
-
-| 返回值 | 描述 |
-|---------|---------------------------------|
-| 0 | 成功 |
-| 非 0 | 失败 |
-
-【举例】
-
-无
-
-【相关主题】
-
-无
-
-#### 2.1.1 init
-
-【描述】
-
-类似构造函数。
-
-【语法】
+### 构造函数
```python
-tim = machine.Timer(mode=Timer.MODE_ONE_SHOT,period=1000, unit=Timer.UNIT_MS, callback=None, arg=None, start=True)
+timer = Timer(index, mode=Timer.PERIODIC, freq=-1, period=-1, callback=None, arg=None)
```
【参数】
-与构造函数相同
-
-【返回值】
-
-| 返回值 | 描述 |
-|---------|---------------------------------|
-| 0 | 成功 |
-| 非 0 | 失败 |
-
-【注意】
-
-无
-
-【举例】
-
-无
-
-【相关主题】
-
-无
-
-#### 2.1.2 callback
-
-【描述】
+- index: Timer号,取值:[-1,5],-1代表软件定时器
+- mode: 运行模式,单次或周期,可选参数
+- freq: Timer运行频率,支持浮点,单位Hz,可选参数,优先级高于`period`
+- period: Timer运行周期,单位ms,可选参数
+- callback: 超时回调函数,必须设置,要带一个参数
+- arg: 超时回调函数参数,可选参数
-获取或者设置回调函数
-
-【语法】
+### init
```python
-tim.callback(callback)
+Timer.init(mode=Timer.PERIODIC, freq=-1, period=-1, callback=None, arg=None)
```
-【参数】
-
-• callback: 设置的回调函数,可选参数, 如果不传参数,则只返回先有的回调函数
-
-【返回值】
-
-| 返回值 | 描述 |
-|---------|---------------------------------|
-| 0 | 成功 |
-| 非 0 | 失败 |
-
-【注意】
-
-无
-
-【举例】
-
-无
-
-【相关主题】
-
-无
-
-#### 2.1.3 period
-
-【描述】
-
-获取或者设置定时周期
-
-【语法】
-
-```python
-tim.period(period)
-```
-
-【参数】
-
-• period: 可选参数,配置周期, 如果不传参数, 则只返回当前周期值
-
-【返回值】
-
-| 返回值 | 描述 |
-|---------|---------------------------------|
-| 0 | 成功 |
-| 非 0 | 失败 |
-
-【注意】
-
-无
-
-【举例】
-
-无
-
-【相关主题】
-
-无
-
-#### 2.1.4 start
-
-【描述】
-
-启动定时器
-
-【语法】
-
-```python
-tim.start()
-```
+初始化定时器参数
【参数】
-无
+- mode: 运行模式,单次或周期,可选参数
+- freq: Timer运行频率,支持浮点,单位Hz,可选参数,优先级高于`period`
+- period: Timer运行周期,单位ms,可选参数
+- callback: 超时回调函数,必须设置,要带一个参数
+- arg: 超时回调函数参数,可选参数
【返回值】
-| 返回值 | 描述 |
-|---------|---------------------------------|
-| 0 | 成功 |
-| 非 0 | 失败 |
-
-【注意】
-
无
-【举例】
-
-无
-
-【相关主题】
-
-无
-
-#### 2.1.5 stop
-
-【描述】
-
-停止定时器
-
-【语法】
+### deinit
```python
-tim.stop()
+Timer.deinit()
```
-【参数】
-
-无
-
-【返回值】
-
-| 返回值 | 描述 |
-|---------|---------------------------------|
-| 0 | 成功 |
-| 非 0 | 失败 |
-
-【注意】
-
-无
-
-【举例】
-
-无
-
-【相关主题】
-
-无
-
-#### 2.1.6 deinit
-
-【描述】
-
-注销定时器,并且注销硬件的占用,关闭硬件的时钟
-
-【语法】
-
-```python
-tim.deinit()
-```
+释放Timer资源
【参数】
@@ -289,33 +118,4 @@ tim.deinit()
【返回值】
-| 返回值 | 描述 |
-|---------|---------------------------------|
-| 0 | 成功 |
-| 非 0 | 失败 |
-
-【注意】
-
-无
-
-【举例】
-
-无
-
-【相关主题】
-
无
-
-### 常量
-
-• UNIT_S: 单位秒 (s)
-
-• UNIT_MS: 单位毫秒 (ms)
-
-• UNIT_US: 单位微秒 (us)
-
-• UNIT_NS: 单位纳秒 (ns)
-
-• MACHINE_TIMER_MODE_ONE_SHOT: 只运行一次(回调一次)
-
-• MACHINE_TIMER_MODE_PERIODIC: 始终运行(连续回调)
diff --git "a/zh/api/machine/K230_CanMV_UART\346\250\241\345\235\227API\346\211\213\345\206\214.md" "b/zh/api/machine/K230_CanMV_UART\346\250\241\345\235\227API\346\211\213\345\206\214.md"
index 966f00e..623584b 100755
--- "a/zh/api/machine/K230_CanMV_UART\346\250\241\345\235\227API\346\211\213\345\206\214.md"
+++ "b/zh/api/machine/K230_CanMV_UART\346\250\241\345\235\227API\346\211\213\345\206\214.md"
@@ -73,6 +73,8 @@ r = u1.readline()
# UART readinto
b = bytearray(8)
r = u1.readinto(b)
+# UART deinit
+u1.deinit()
```
### 构造函数
@@ -169,3 +171,19 @@ UART.write(buf)
【返回值】
写入的字节数
+
+### deinit
+
+```python
+UART.deinit()
+```
+
+释放UART资源
+
+【参数】
+
+无
+
+【返回值】
+
+无
diff --git "a/zh/api/machine/K230_CanMV_WDT\346\250\241\345\235\227API\346\211\213\345\206\214.md" "b/zh/api/machine/K230_CanMV_WDT\346\250\241\345\235\227API\346\211\213\345\206\214.md"
index 945c758..b3e4079 100755
--- "a/zh/api/machine/K230_CanMV_WDT\346\250\241\345\235\227API\346\211\213\345\206\214.md"
+++ "b/zh/api/machine/K230_CanMV_WDT\346\250\241\345\235\227API\346\211\213\345\206\214.md"
@@ -1,4 +1,4 @@
-# K230 CanMV WDT API手册
+# K230 CanMV WDT 模块API手册
![cover](../images/canaan-cover.png)
@@ -29,7 +29,7 @@
### 概述
-本文档主要介绍 CanMV 项目中的WDT看门狗模块,用于在应用程序崩溃且最终进入不可恢复状态时重启系统。一旦开始,当硬件运行期间没有定期进行喂狗(feed)就会在超时后自动复位。
+本文档主要介绍machine模块下的WDT类API。
### 读者对象
@@ -48,143 +48,49 @@
| 文档版本号 | 修改说明 | 修改者 | 日期 |
| ---------- | -------- | ---------- | ---------- |
-| V1.0 | 初版 | 史文涛 | 2023-09-19 |
+| V1.0 | 初版 | 软件部 | 2023-09-19 |
## 1. 概述
-WDT提供了喂狗和停止当前看门狗两个功能
+K230内部包含两个WDT硬件模块,用于在应用程序崩溃且最终进入不可恢复状态时重启系统。一旦开始,当硬件运行期间没有定期进行喂狗(feed)就会在超时后自动复位。
## 2. API描述
-WDT提供了一个类 WDT,实现了两个函数,喂狗feed()和停止当前看门狗对象stop()
+WDT类位于machine模块下
-### 2.1 类 machine.WDT
-
-【描述】
-
-通过指定的参数新建一个 WDT 对象。
-
-【语法】
+### 示例
```python
from machine import WDT
-wdt1 = WDT(1,4)
+# 实例化wdt1,timeout为3s
+wdt1 = WDT(1,3)
+# 喂狗操作
+wdt1.feed()
```
-【参数】
-
-| 参数名称 | 描述 | 输入/输出 |
-|-----------------|-------------------------------|-----------|
-| id | 这个看门狗对象必须初始化时必须指定 ID, 用于区分使用的看门狗。 | 输入 |
-| timeout | 看门狗超时时间,单位为秒(s)。 | 输入 |
-
-【返回值】
-
-| 返回值 | 描述 |
-|---------|---------------------------------|
-| 0 | 成功 |
-| 非 0 | 失败 |
-
-【注意】
-
-无
-
-【举例】
-
-无
-
-【相关主题】
-
-无
-
-#### 2.1.1 喂狗 feed()
-
-【描述】
-
-喂狗,以防止其重置系统。
-
-【语法】
+### 构造函数
```python
-wdt0.feed()
+wdt = WDT(index, timeout)
```
【参数】
-| 参数名称 | 描述 | 输入/输出 |
-|-----------------|-------------------------------|-----------|
-| data | 输入二进制数据 | 输入 |
-
-【返回值】
+- index: WDT号,取值:[0,1]
+- timeout: 超时值,单位s
-| 返回值 | 描述 |
-|---------|---------------------------------|
-| 0 | 成功 |
-| 非 0 | 失败 |
-
-【注意】
-
-无
-
-【举例】
-
-无
-
-【相关主题】
-
-无
-
-#### 2.1.2 停止当前看门狗对象 stop()
-
-【描述】
-
-停止当前看门狗对象
-
-【语法】
+### feed
```python
-wdt0.stop()
+WDT.feed()
```
+喂狗操作
+
【参数】
无
【返回值】
-| 返回值 | 描述 |
-|---------|---------------------------------|
-| 0 | 成功 |
-| 非 0 | 失败 |
-
-【注意】
-
无
-
-【举例】
-
-无
-
-【相关主题】
-
-无
-
-## 3. 例程
-
-```python
-import time
-from machine import WDT
-
-## '''
-## test default wdt
-wdt1 = WDT(1,3)
-print('into', wdt0)
-time.sleep(2)
-print(time.ticks_ms())
-## 1.test wdt feed
-wdt1.feed()
-time.sleep(2)
-print(time.ticks_ms())
-## 2.test wdt stop
-wdt1.stop()
-```
diff --git "a/zh/api/mpp/K230_CanMV_Camera\346\250\241\345\235\227API\346\211\213\345\206\214.md" "b/zh/api/mpp/K230_CanMV_Camera\346\250\241\345\235\227API\346\211\213\345\206\214.md"
index 49cfea4..822ec7a 100755
--- "a/zh/api/mpp/K230_CanMV_Camera\346\250\241\345\235\227API\346\211\213\345\206\214.md"
+++ "b/zh/api/mpp/K230_CanMV_Camera\346\250\241\345\235\227API\346\211\213\345\206\214.md"
@@ -40,18 +40,17 @@
### 缩略词定义
-| 简称 | 说明 |
-| ---- | ---- |
-| XXX | xx |
-| XXX | xx |
+| 简称 | 说明 |
+|--------------------|--------------------------------------------------------|
+| VICAP | Video Input Capture,图像输入采集模块 |
+| MCM | Multi Camera Management ,多摄像头管理 |
### 修订记录
| 文档版本号 | 修改说明 | 修改者 | 日期 |
| ---------- | -------- | ---------- | ---------- |
| V1.0 | 初版 | 汪成根 | 2023-09-18 |
-| V1.1 | | | |
-| V1.2 | | | |
+| V1.1 | 添加多sensor MCM 相关的API | 赵忠祥 | 2024-03-11 |
## 1. 概述
@@ -411,54 +410,93 @@ camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_0)
无
-## 3. 数据结构描述
+### 2.7 start_mcm_stream
-K230 CanMV平台Camera模块包含如下描述的各个数据定义。
+【描述】
-### 3.1 sensor类型
+多sensor时,启动camera数据流。多sensor时一定要先配置好各个sensor的参数,然后调该函数启动数据流。
-【说明】
+【语法】
+
+```python
+def start_mcm_stream(cls)
+```
-示例数据结结构
+【返回值】
-【定义】
+| 返回值 | 描述 |
+| ------ | ---------------------- |
+| 0 | 成功。 |
+| 非 0 | 失败,其值为\[错误码\] |
+
+【举例】
```python
-CAM_OV9732_1280X720_30FPS_10BIT_LINEAR = 0
+# 启动camera设备0输出数据流
+camera.start_mcm_stream()
+```
-CAM_OV9286_1280X720_30FPS_10BIT_LINEAR_IR = 1
-CAM_OV9286_1280X720_30FPS_10BIT_LINEAR_SPECKLE = 2
+【相关主题】
-CAM_OV9286_1280X720_60FPS_10BIT_LINEAR_IR = 3
-CAM_OV9286_1280X720_60FPS_10BIT_LINEAR_SPECKLE = 4
+无
-CAM_OV9286_1280X720_30FPS_10BIT_LINEAR_IR_SPECKLE = 5
-CAM_OV9286_1280X720_60FPS_10BIT_LINEAR_IR_SPECKLE = 6
+### 2.8 stop_mcm_stream
+【描述】
-CAM_IMX335_2LANE_1920X1080_30FPS_12BIT_LINEAR = 7
-CAM_IMX335_2LANE_2592X1944_30FPS_12BIT_LINEAR = 8
-CAM_IMX335_4LANE_2592X1944_30FPS_12BIT_LINEAR = 9
-CAM_IMX335_2LANE_1920X1080_30FPS_12BIT_USEMCLK_LINEAR = 10
-CAM_IMX335_2LANE_2592X1944_30FPS_12BIT_USEMCLK_LINEAR = 11
-CAM_IMX335_4LANE_2592X1944_30FPS_12BIT_USEMCLK_LINEAR = 12
+多sensor时,停止camera数据流。与start_mcm_stream配套使用。
-CAM_IMX335_2LANE_2592X1944_30FPS_10BIT_2HDR = 13
-CAM_IMX335_2LANE_2592X1944_30FPS_10BIT_3HDR = 14
+【语法】
+```python
+def stop_mcm_stream(cls, dev_num)
+```
-CAM_OV5647_1920X1080_30FPS_10BIT_LINEAR = 21
-CAM_OV5647_2592x1944_10FPS_10BIT_LINEAR = 22
-CAM_OV5647_2592x1944_10FPS_10BIT_LINEAR = 23
-CAM_OV5647_1920X1080_30FPS_10BIT_USEMCLK_LINEAR = 24
+【返回值】
+| 返回值 | 描述 |
+| ------ | ---------------------- |
+| 0 | 成功。 |
+| 非 0 | 失败,其值为\[错误码\] |
+
+【举例】
+
+```python
+# 停止camera设备0输出数据流
+camera.stop_mcm_stream()
+```
+
+【相关主题】
+
+无
+
+## 3. 数据结构描述
+
+K230 CanMV平台Camera模块包含如下描述的各个数据定义。
+
+### 3.1 sensor类型
+
+【说明】
+
+下面是目前Canmv-K230板micropython支持的Sensor。
+其中CSI1/2是可以使用树莓派的ov5647模组,如果使用Canmv-K230 V1.0/1.1版的板子,要修改该模组的电压。
+
+【定义】
+
+```python
+CAM_IMX335_2LANE_1920X1080_30FPS_12BIT_USEMCLK_LINEAR # Imx335 CSI0
+CAM_OV5647_1920X1080_30FPS_10BIT_USEMCLK_LINEAR # OV5647 CSI0
+CAM_OV5647_1920X1080_CSI1_30FPS_10BIT_USEMCLK_LINEAR # OV5647 CSI1
+CAM_OV5647_1920X1080_CSI2_30FPS_10BIT_USEMCLK_LINEAR # OV5647 CSI2
# the default sensor type
-CAM_DEFAULT_SENSOR = CAM_OV5647_1920X1080_30FPS_10BIT_USEMCLK_LINEAR
+CAM_DEFAULT_SENSOR = CAM_OV5647_1920X1080_30FPS_10BIT_USEMCLK_LINEAR # 默认的sensor使用OV5647 CSI0
```
【注意事项】
-无
+Canmv-K230 V1.0/1.1版的板子外设接口为1.8V,不能直接使用树莓派的ov5647模组,必须修改电压为1.8V。
+
+![ov5647_v1.8](../../images/ov5647_v1.8.jpg)
【相关数据类型及接口】
diff --git a/zh/api/nncase.rst b/zh/api/nncase.rst
new file mode 100755
index 0000000..2d5f3b8
--- /dev/null
+++ b/zh/api/nncase.rst
@@ -0,0 +1,6 @@
+nncase
+===========
+.. toctree::
+ :maxdepth: 1
+
+ nncase_runtime/K230_CanMV_nncase_runtime_API手册.md
diff --git a/zh/api/python_micropython.rst b/zh/api/python_micropython.rst
new file mode 100644
index 0000000..92715bd
--- /dev/null
+++ b/zh/api/python_micropython.rst
@@ -0,0 +1,8 @@
+Python 标准库和 Micropython 标准微库
+===========
+.. toctree::
+ :maxdepth: 1
+
+ cipher/K230_CanMV_Ucryptolib模块API手册.md
+ cipher/K230_CanMV_Hashlib模块API手册.md
+ stdlib/utime.md
\ No newline at end of file
diff --git "a/zh/example/K230_CanMV_AI_Demo\347\244\272\344\276\213\350\257\264\346\230\216.md" "b/zh/example/K230_CanMV_AI_Demo\347\244\272\344\276\213\350\257\264\346\230\216.md"
index 95bd144..289b658 100755
--- "a/zh/example/K230_CanMV_AI_Demo\347\244\272\344\276\213\350\257\264\346\230\216.md"
+++ "b/zh/example/K230_CanMV_AI_Demo\347\244\272\344\276\213\350\257\264\346\230\216.md"
@@ -42,7 +42,7 @@
本文档包括27个AI Demo,这些示例程序都实现从摄像头采集数据、kpu推理到显示器展示的流程,应用到了K230 CanMV 平台的多个硬件模块:AI2D,KPU,Camera,Display等。
-这些AI Demo分为两种类型:单模型、多模型,涵盖物体、人脸、人手、人体、车牌、OCR,KWS等方向;参考该文档,k230用户可以更快上手K230 AI应用的开发,实现预期效果。
+这些AI Demo分为两种类型:单模型、多模型,涵盖物体、人脸、人手、人体、车牌、OCR、KWS和TTS等方向;参考该文档,k230用户可以更快上手K230 AI应用的开发,实现预期效果。
更多AI Demo后续即将解锁。
@@ -65,6 +65,7 @@
| | 拼图游戏 |
| | 基于关键点的手势识别 |
| | 自学习 |
+| | TTS中文 |
## 二、AI Demo单模型示例解析
@@ -14577,3 +14578,226 @@ if __name__ == '__main__':
nn.shrink_memory_pool()
self_learning_inference()
```
+
+### 18.TTS中文
+
+```python
+from media.pyaudio import * # 音频模块
+from media.media import * # 软件抽象模块,主要封装媒体数据链路以及媒体缓冲区
+import media.wave as wave # wav音频处理模块
+import nncase_runtime as nn # nncase运行模块,封装了kpu(kmodel推理)和ai2d(图片预处理加速)操作
+import ulab.numpy as np # 类似python numpy操作,但也会有一些接口不同
+import time # 时间统计
+import aidemo # aidemo模块,封装ai demo相关前处理、后处理等操作
+import struct # 字节字符转换模块
+import gc # 垃圾回收模块
+import os,sys # 操作系统接口模块
+
+# 有关音频流的宏变量
+SAMPLE_RATE = 24000 # 采样率24000Hz,即每秒采样24000次
+CHANNELS = 1 # 通道数 1为单声道,2为立体声
+FORMAT = paInt16 # 音频输入输出格式 paInt16
+CHUNK = int(0.3 * 24000) # 每次读取音频数据的帧数,设置为0.3s的帧数24000*0.3=7200
+
+# tts_zh(文字转语音中文)任务
+root_dir='/sdcard/app/tests/'
+# 拼音字典
+dict_path=root_dir+"utils/pinyin.txt"
+# 汉字转拼音字典文件
+phase_path=root_dir+"utils/small_pinyin.txt"
+# 拼音转音素映射文件
+mapfile=root_dir+"utils/phone_map.txt"
+# 输入中文语句
+text="嘉楠科技研发了最新款的芯片"
+# 中文tts encoder模型
+fastspeech1_path=root_dir+"kmodel/zh_fastspeech_1_f32.kmodel"
+# 中文tts decoder模型
+fastspeech2_path=root_dir+"kmodel/zh_fastspeech_2.kmodel"
+# 中文tts 声码器模型
+hifigan_path=root_dir+"kmodel/hifigan.kmodel"
+# 生成音频存储路径
+save_wav_file = root_dir+"test.wav"
+debug_mode=1
+
+
+# scoped_timing.py 用于debug模式输出程序块运行时间
+class ScopedTiming:
+ def __init__(self, info="", enable_profile=True):
+ self.info = info
+ self.enable_profile = enable_profile
+
+ def __enter__(self):
+ if self.enable_profile:
+ self.start_time = time.time_ns()
+ return self
+
+ def __exit__(self, exc_type, exc_value, traceback):
+ if self.enable_profile:
+ elapsed_time = time.time_ns() - self.start_time
+ print(f"{self.info} took {elapsed_time / 1000000:.2f} ms")
+
+global ttszh
+
+def play_audio():
+ # 初始化音频流
+ p = PyAudio()
+ p.initialize(CHUNK)
+ ret = media.buffer_init()
+ if ret:
+ print("record_audio, buffer_init failed")
+ # 用于播放音频
+ output_stream = p.open(
+ format=FORMAT,
+ channels=CHANNELS,
+ rate=SAMPLE_RATE,
+ output=True,
+ frames_per_buffer=CHUNK
+ )
+ wf = wave.open(save_wav_file, "rb")
+ wav_data = wf.read_frames(CHUNK)
+ while wav_data:
+ output_stream.write(wav_data)
+ wav_data = wf.read_frames(CHUNK)
+ time.sleep(2) # 时间缓冲,用于播放声音
+ wf.close()
+ output_stream.stop_stream()
+ output_stream.close()
+ p.terminate()
+ media.buffer_deinit()
+
+def ttszh_init():
+ with ScopedTiming("init_ttszh",debug_mode > 0):
+ global ttszh
+ ttszh=aidemo.tts_zh_create(dict_path,phase_path,mapfile)
+
+# ttszh推理过程
+def ttszh_inference():
+ global ttszh
+ try:
+ # ttszh初始化
+ ttszh_init()
+ with ScopedTiming("preprocess",debug_mode > 0):
+ # ttszh数据预处理,获取data和data_len
+ preprocess_data=aidemo.tts_zh_preprocess(ttszh,text)
+ data=preprocess_data[0]
+ data_len=preprocess_data[1]
+ with ScopedTiming("encode run",debug_mode > 0):
+ # 创建编码器kpu,加载kmodel
+ kpu_enc = nn.kpu()
+ kpu_enc.load_kmodel(fastspeech1_path)
+ # 创建编码器模型输入并和模型绑定,编码器包含两个输入,一个是文字预处理的序列数据,一个是speaker数据
+ # 编码器序列数据
+ enc_seq_input_array=np.array(data)
+ enc_seq_input_tensor = nn.from_numpy(enc_seq_input_array)
+ # 编码器speaker数据
+ enc_speaker_input_array=np.array([0.0])
+ enc_speaker_input_tensor=nn.from_numpy(enc_speaker_input_array)
+ # 和模型绑定
+ kpu_enc.set_input_tensor(1, enc_seq_input_tensor)
+ kpu_enc.set_input_tensor(0, enc_speaker_input_tensor)
+ # kpu运行
+ kpu_enc.run()
+ # 获取kpu的输入
+ enc_output_0=kpu_enc.get_output_tensor(0)
+ enc_output_1=kpu_enc.get_output_tensor(1)
+ enc_output_0_np=enc_output_0.to_numpy()
+ enc_output_1_np=enc_output_1.to_numpy()
+ with ScopedTiming("encode postprocess",debug_mode > 0):
+ # 给编码结果添加持续时间属性,每个音素编码向量按照持续时间重复
+ duritions=enc_output_1_np[0][:int(data_len[0])]
+ durition_sum=int(np.sum(duritions))
+ # 解码器输入维度为(1,600,256),不足部分需要padding
+ max_value=13
+ while durition_sum>600:
+ for i in range(len(duritions)):
+ if duritions[i]>max_value:
+ duritions[i]=max_value
+ max_value=max_value-1
+ durition_sum=np.sum(duritions)
+ dec_input=np.zeros((1,600,256),dtype=np.float)
+ m_pad=600-durition_sum
+ k=0
+ for i in range(len(duritions)):
+ for j in range(int(duritions[i])):
+ dec_input[0][k]=enc_output_0_np[0][i]
+ k+=1
+ with ScopedTiming("decode run",debug_mode > 0):
+ # 定义解码器kpu对象,并加载kmodel
+ kpu_dec = nn.kpu()
+ kpu_dec.load_kmodel(fastspeech2_path)
+ #设置解码器模型输入
+ dec_input_tensor=nn.from_numpy(dec_input)
+ kpu_dec.set_input_tensor(0, dec_input_tensor)
+ # 运行
+ kpu_dec.run()
+ # 获取解码器模型输出,维度为(1,80,600)
+ dec_output=kpu_dec.get_output_tensor(0)
+ dec_output_np=dec_output.to_numpy()
+ with ScopedTiming("decode postprocess",debug_mode > 0):
+ # 将有效信息拆分成一个个(1,80,100)的子向量,输入声码器生成音频
+ subvector_num=durition_sum//100;
+ remaining=durition_sum%100;
+ if remaining>0:
+ subvector_num+=1
+ hifi_input=np.zeros((1,80,subvector_num*100),dtype=np.float)
+ for i in range(durition_sum):
+ hifi_input[:,:,i]=dec_output_np[:,:,i]
+
+ with ScopedTiming("hifigan run",debug_mode > 0):
+ # 定义hifigan声码器模型kpu对象,加载kmodel
+ kpu_hifi = nn.kpu()
+ kpu_hifi.load_kmodel(hifigan_path)
+
+
+ # 保存生成的所有梅尔声谱数据,后续保存成wav文件
+ mel_data=[]
+ # 依次对每一个子向量进行声码器推理
+ for i in range(subvector_num):
+ hifi_input_tmp=np.zeros((1,80,100),dtype=np.float)
+
+ for j in range(80):
+ for k in range(i*100,(i+1)*100):
+ hifi_input_tmp[0][j][k-i*100]=hifi_input[0][j][k]
+ # 设置模型输入
+ hifigan_input_tensor=nn.from_numpy(hifi_input_tmp)
+ kpu_hifi.set_input_tensor(0, hifigan_input_tensor)
+ # kpu运行
+ kpu_hifi.run()
+ # 获取模型输出
+ hifigan_output=kpu_hifi.get_output_tensor(0)
+ hifigan_output_np=hifigan_output.to_numpy()
+ # 汇总输出数据
+ for j in range(25600):
+ mel_data.append(hifigan_output_np[0][0][j])
+ del hifigan_input_tensor
+ with ScopedTiming("save wav file",debug_mode > 0):
+ # 将生成的音频数据保存为wav文件
+ save_data=mel_data[:durition_sum*256]
+ save_len=len(save_data)
+ aidemo.save_wav(save_data,save_len,save_wav_file,SAMPLE_RATE)
+ aidemo.tts_zh_destroy(ttszh)
+ with ScopedTiming("play audio",debug_mode > 0):
+ play_audio()
+ del kpu_enc
+ del kpu_dec
+ del kpu_hifi
+ del enc_seq_input_tensor
+ del enc_speaker_input_tensor
+ del enc_output_0
+ del enc_output_1
+ del dec_input_tensor
+ del dec_output
+ del ttszh
+ except KeyboardInterrupt as e:
+ print("user stop: ", e)
+ except BaseException as e:
+ sys.print_exception(e)
+ finally:
+ gc.collect()
+
+
+if __name__=="__main__":
+ os.exitpoint(os.EXITPOINT_ENABLE)
+ nn.shrink_memory_pool()
+ ttszh_inference()
+```
diff --git a/zh/example/machine/adc/adc.md b/zh/example/machine/adc/adc.md
index d1e4227..74a5427 100755
--- a/zh/example/machine/adc/adc.md
+++ b/zh/example/machine/adc/adc.md
@@ -1,14 +1,16 @@
-# adc - adc例程
+# ADC - ADC例程
-本示例程序用于对 CanMV 开发板进行一个adc的功能展示。
+本示例程序用于对 CanMV 开发板进行一个ADC的功能展示。
```python
from machine import ADC
-adc = ADC(0,enable=True) #构造adc对象,通道0默认开启
-value = adc.value() #获取通道0的数值
-print("value = %d" % value)
-adc.deinit() #注销adc对象
+# 实例化ADC通道0
+adc = ADC(0)
+# 获取ADC通道0采样值
+print(adc.read_u16())
+# 获取ADC通道0电压值
+print(adc.read_uv(), "uV")
```
具体接口定义请参考 [ADC](../../../api/machine/K230_CanMV_ADC模块API手册.md)
diff --git a/zh/example/machine/fpioa/fpioa.md b/zh/example/machine/fpioa/fpioa.md
index d836e41..37c640d 100755
--- a/zh/example/machine/fpioa/fpioa.md
+++ b/zh/example/machine/fpioa/fpioa.md
@@ -1,25 +1,27 @@
-# fpioa - iomux fpioa例程
+# FPIOA - FPIOA例程
-本示例程序用于对 CanMV 开发板进行iomux功能展示。
+本示例程序用于对 CanMV 开发板进行一个FPIOA的功能展示。
```python
from machine import FPIOA
-a = FPIOA()
-help(a) #查看本模块所有帮助;
+# 实例化FPIOA
+fpioa = FPIOA()
+# 打印所有引脚配置
+fpioa.help()
+# 打印指定引脚详细配置
+fpioa.help(0)
+# 打印指定功能所有可用的配置引脚
+fpioa.help(FPIOA.IIC0_SDA, func=True)
+# 设置Pin0为GPIO0
+fpioa.set_function(0, FPIOA.GPIO0)
+# 设置Pin2为GPIO2, 同时配置其它项
+fpioa.set_function(2, FPIOA.GPIO2, ie=1, oe=1, pu=0, pd=0, st=1, sl=0, ds=7)
+# 获取指定功能当前所在的引脚
+fpioa.get_pin_num(FPIOA.UART0_TXD)
+# 获取指定引脚当前功能
+fpioa.get_pin_func(0)
-for i in range(63):
- a.help(i) #查看第i个管脚的帮助
-
-for i in range(221):
- a.get_Pin_num(i) #获取某个功能对应的管脚号
-
-a.help(60) #查看第60个管脚的当前配置和可配置功能
-a.set_function(60,a.GPIO60) #把第60个管脚设置为gpio60功能。
-a.help(60) #查看第60个管脚的帮助
-
-a.set_function(60,set_pd=1) #使能第60个管脚的下拉 其他可配选项为(set_sl=1,set_ie=0,set_oe=0,set_pd=1,set_pu=0,set_ds=6,set_st=0,set_di=1)
-a.help(60)
```
-具体接口定义请参考 [IOMUX_FPIOA](../../../api/machine/K230_CanMV_IOMUX_API手册.md)
+具体接口定义请参考 [IOMUX_FPIOA](../../../api/machine/K230_CanMV_FPIOA模块API手册.md)
diff --git a/zh/example/machine/gpio/gpio.md b/zh/example/machine/gpio/gpio.md
deleted file mode 100755
index 455af02..0000000
--- a/zh/example/machine/gpio/gpio.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# gpio - gpio例程
-
-本示例程序用于对 CanMV 开发板进行一个GPIO的功能展示。
-
-```python
-from machine import GPIO
-gpio = GPIO(8, GPIO.OUT, GPIO.PULL_UP, value=0) #构造GPIO对象,gpio编号为8,设置为上拉输出低电平
-value = gpio.value() #获取gpio的值
-print("value = %d" % value)
-gpio.value(1) #设置gpio输出为高电平
-value = gpio.value()
-print("value = %d" % value)
-```
-
-具体接口定义请参考 [GPIO](../../../api/machine/K230_CanMV_GPIO模块API手册.md)
diff --git a/zh/example/machine/pin/pin.md b/zh/example/machine/pin/pin.md
new file mode 100755
index 0000000..6166054
--- /dev/null
+++ b/zh/example/machine/pin/pin.md
@@ -0,0 +1,42 @@
+# Pin - Pin例程
+
+本示例程序用于对 CanMV 开发板进行一个Pin的功能展示。
+
+```python
+from machine import Pin
+from machine import FPIOA
+
+# 实例化FPIOA
+fpioa = FPIOA()
+# 设置Pin2为GPIO2
+fpioa.set_function(2, FPIOA.GPIO2)
+
+# 实例化Pin2为输出
+pin = Pin(2, Pin.OUT, pull=Pin.PULL_NONE, drive=7)
+# 设置输出为高
+pin.value(1)
+# pin.on()
+# pin.high()
+# 设置输出为低
+pin.value(0)
+# pin.off()
+# pin.low()
+# 初始化Pin2为输入
+pin.init(Pin.IN, pull=Pin.PULL_UP, drive=7)
+# 获取输入
+print(pin.value())
+# 设置模式
+pin.mode(Pin.IN)
+# 获取模式
+print(pin.mode())
+# 设置上下拉
+pin.pull(Pin.PULL_NONE)
+# 获取上下拉
+print(pin.pull())
+# 设置驱动能力
+pin.drive(7)
+# 获取驱动能力
+print(pin.drive())
+```
+
+具体接口定义请参考 [Pin](../../../api/machine/K230_CanMV_Pin模块API手册.md)
diff --git a/zh/example/machine/pwm/pwm.md b/zh/example/machine/pwm/pwm.md
index 43072fa..7076a4a 100755
--- a/zh/example/machine/pwm/pwm.md
+++ b/zh/example/machine/pwm/pwm.md
@@ -1,4 +1,4 @@
-# pwm - pwm例程
+# PWM - PWM例程
本示例程序用于对 CanMV 开发板进行一个PWM输出的功能展示。
diff --git a/zh/example/machine/timer/timer.md b/zh/example/machine/timer/timer.md
index 3d73101..b50704c 100755
--- a/zh/example/machine/timer/timer.md
+++ b/zh/example/machine/timer/timer.md
@@ -1,14 +1,22 @@
# Timer - Timer例程
-本示例程序用于对 CanMV 开发板进行一个定时器的功能展示。
+本示例程序用于对 CanMV 开发板进行一个Timer的功能展示。
```python
from machine import Timer
-#定义定时器回调函数
-def on_timer(arg):
- print("time up: %d" % arg)
-#构造定时器对象,时间为3s,默认开启定时器
-tim = Timer(mode=Timer.MODE_ONE_SHOT,period=3, unit=Timer.UNIT_S, callback=on_timer, arg=1, start=True)
+import time
+
+# 实例化一个软定时器
+tim = Timer(-1)
+# 初始化定时器为单次模式,周期100ms
+tim.init(period=100, mode=Timer.ONE_SHOT, callback=lambda t:print(1))
+time.sleep(0.2)
+# 初始化定时器为周期模式,频率为1Hz
+tim.init(freq=1, mode=Timer.PERIODIC, callback=lambda t:print(2))
+time.sleep(2)
+# 释放定时器资源
+tim.deinit()
+
```
具体接口定义请参考 [Timer](../../../api/machine/K230_CanMV_Timer模块API手册.md)
diff --git a/zh/example/machine/uart/uart.md b/zh/example/machine/uart/uart.md
index 8332da5..6c67b1c 100755
--- a/zh/example/machine/uart/uart.md
+++ b/zh/example/machine/uart/uart.md
@@ -1,4 +1,4 @@
-# uart - uart例程
+# UART - UART例程
本示例程序用于对 CanMV 开发板进行一个UART的功能展示。
@@ -19,7 +19,6 @@ print(r)
b = bytearray(8)
r = uart.readinto(b)
print(r)
-
```
具体接口定义请参考 [UART](../../../api/machine/K230_CanMV_UART模块API手册.md)
diff --git a/zh/example/machine/wdt/wdt.md b/zh/example/machine/wdt/wdt.md
index 9ccc8c9..eb7cb48 100755
--- a/zh/example/machine/wdt/wdt.md
+++ b/zh/example/machine/wdt/wdt.md
@@ -1,21 +1,17 @@
-# wdt - wdt例程
+# WDT - WDT例程
-本示例程序用于对 CanMV 开发板进行一个wdt的功能展示。
+本示例程序用于对 CanMV 开发板进行一个WDT的功能展示。
```python
import time
from machine import WDT
-wdt1 = WDT(1,3) #构造wdt对象,/dev/watchdog1,timeout为3s
-print('into', wdt1)
-time.sleep(2) #延时2s
-print(time.ticks_ms())
-## 1.test wdt feed
-wdt1.feed() #喂狗操作
-time.sleep(2) #延时2s
-print(time.ticks_ms())
-## 2.test wdt stop
-wdt1.stop() #停止喂狗
+# 实例化wdt1,timeout为3s
+wdt1 = WDT(1,3)
+time.sleep(2)
+# 喂狗操作
+wdt1.feed()
+time.sleep(2)
```
具体接口定义请参考 [WDT](../../../api/machine/K230_CanMV_WDT模块API手册.md)
diff --git a/zh/example/media.rst b/zh/example/media.rst
index 4d0ae2b..6bb419d 100755
--- a/zh/example/media.rst
+++ b/zh/example/media.rst
@@ -6,6 +6,7 @@
media/acodec.md
media/audio.md
media/camera.md
+ media/camera_3sensnors.md
media/display.md
media/media.md
media/mp4muxer.md
diff --git a/zh/example/media/camera_3sensors.md b/zh/example/media/camera_3sensors.md
new file mode 100755
index 0000000..d36f623
--- /dev/null
+++ b/zh/example/media/camera_3sensors.md
@@ -0,0 +1,103 @@
+# Camera - 多摄像头预览及图像采集示例
+
+```python
+from media.camera import * #导入camera模块,使用camera相关接口
+from media.display import * #导入display模块,使用display相关接口
+from media.media import * #导入media模块,使用meida相关接口
+import time, os #导入time模块,使用time相关接口
+import sys
+
+def camera_test():
+ print("camera_test")
+
+ #初始化HDMI显示
+ display.init(LT9611_1920X1080_30FPS)
+
+ #下面配置3个sensor的属性
+
+ #初始化默认sensor配置(CSI0 OV5647)
+ camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR)
+ out_width = 640
+ out_height = 480
+
+ # 设置输出宽度16字节对齐
+ out_width = ALIGN_UP(out_width, 16)
+
+ #设置通道0输出尺寸
+ camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, out_width, out_height)
+
+ #设置通道0输出格式
+ camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420)
+
+ #创建媒体数据源设备
+ meida_source = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0)
+
+ #创建媒体数据接收设备
+ meida_sink = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1)
+
+ #创建媒体链路,数据从源设备流到接收设备
+ media.create_link(meida_source, meida_sink)
+
+ #设置显示输出平面的属性
+ display.set_plane(0, 0, out_width, out_height, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1)
+
+ #初始化默认sensor配置(CSI1 OV5647)
+ camera.sensor_init(CAM_DEV_ID_1, CAM_OV5647_1920X1080_CSI1_30FPS_10BIT_USEMCLK_LINEAR)
+ out_width = 640
+ out_height = 480
+ out_width = ALIGN_UP(out_width, 16)
+ camera.set_outsize(CAM_DEV_ID_1, CAM_CHN_ID_0, out_width, out_height)
+ camera.set_outfmt(CAM_DEV_ID_1, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420)
+ meida_source1 = media_device(CAMERA_MOD_ID, CAM_DEV_ID_1, CAM_CHN_ID_0)
+ meida_sink1 = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO2)
+ media.create_link(meida_source1, meida_sink1)
+ display.set_plane(640, 320, out_width, out_height, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO2)
+
+ #初始化默认sensor配置(CSI1 OV5647)
+ camera.sensor_init(CAM_DEV_ID_2, CAM_OV5647_1920X1080_CSI2_30FPS_10BIT_USEMCLK_LINEAR)
+ out_width = 640
+ out_height = 480
+ out_width = ALIGN_UP(out_width, 16)
+ camera.set_outsize(CAM_DEV_ID_2, CAM_CHN_ID_0, out_width, out_height)
+ camera.set_outfmt(CAM_DEV_ID_2, CAM_CHN_ID_0, PIXEL_FORMAT_RGB_888)
+ meida_source2 = media_device(CAMERA_MOD_ID, CAM_DEV_ID_2, CAM_CHN_ID_0)
+ meida_sink2 = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_OSD0)
+ media.create_link(meida_source2, meida_sink2)
+ display.set_plane(1280, 600, out_width, out_height, PIXEL_FORMAT_RGB_888, DISPLAY_MIRROR_NONE, DISPLAY_CHN_OSD0)
+
+ #初始化媒体缓冲区
+ media.buffer_init()
+
+ #启动摄像头数据流(多sensor)
+ camera.start_mcm_stream()
+
+ try:
+ while True:
+ os.exitpoint()
+ time.sleep(5)
+ except KeyboardInterrupt as e:
+ print("user stop: ", e)
+ except BaseException as e:
+ sys.print_exception(e)
+ #停止摄像头输出
+ camera.stop_mcm_stream()
+
+ #去初始化显示设备
+ display.deinit()
+
+ #去初始化媒体缓冲区资源
+ media.destroy_link(meida_source, meida_sink)
+ media.destroy_link(meida_source1, meida_sink1)
+ media.destroy_link(meida_source2, meida_sink2)
+
+ os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)
+ time.sleep_ms(100)
+ # deinit media buffer
+ media.buffer_deinit()
+
+if __name__ == "__main__":
+ os.exitpoint(os.EXITPOINT_ENABLE)
+ camera_test()
+```
+
+具体接口定义请参考 [camera](../../api/mpp/K230_CanMV_Camera模块API手册.md)
diff --git a/zh/example/socket_network/http_client.md b/zh/example/socket_network/http_client.md
index 77a3fb4..d941b3d 100755
--- a/zh/example/socket_network/http_client.md
+++ b/zh/example/socket_network/http_client.md
@@ -1,4 +1,4 @@
-# tchttp - client 例程
+# http - client 例程
本示例程序用于对 CanMV 开发板进行一个 http client的功能展示。
diff --git a/zh/images/balena-Etcher-finish.jpg b/zh/images/balena-Etcher-finish.jpg
deleted file mode 100755
index 8fbb39e..0000000
Binary files a/zh/images/balena-Etcher-finish.jpg and /dev/null differ
diff --git a/zh/images/balena-Etcher-flash-from-file.jpg b/zh/images/balena-Etcher-flash-from-file.jpg
deleted file mode 100755
index eab917e..0000000
Binary files a/zh/images/balena-Etcher-flash-from-file.jpg and /dev/null differ
diff --git a/zh/images/balena-Etcher-flash.jpg b/zh/images/balena-Etcher-flash.jpg
deleted file mode 100755
index d7df87e..0000000
Binary files a/zh/images/balena-Etcher-flash.jpg and /dev/null differ
diff --git a/zh/images/balena-Etcher-select-target.jpg b/zh/images/balena-Etcher-select-target.jpg
deleted file mode 100755
index f8a3cf2..0000000
Binary files a/zh/images/balena-Etcher-select-target.jpg and /dev/null differ
diff --git a/zh/images/face_detect_file.png b/zh/images/face_detect_file.png
new file mode 100755
index 0000000..be1aabe
Binary files /dev/null and b/zh/images/face_detect_file.png differ
diff --git a/zh/images/open_Udisk.png b/zh/images/open_Udisk.png
new file mode 100755
index 0000000..5397632
Binary files /dev/null and b/zh/images/open_Udisk.png differ
diff --git a/zh/images/ov5647_v1.8.jpg b/zh/images/ov5647_v1.8.jpg
new file mode 100755
index 0000000..83e3418
Binary files /dev/null and b/zh/images/ov5647_v1.8.jpg differ
diff --git a/zh/images/rufus_finish.png b/zh/images/rufus_finish.png
new file mode 100755
index 0000000..c64a57e
Binary files /dev/null and b/zh/images/rufus_finish.png differ
diff --git a/zh/images/rufus_select.png b/zh/images/rufus_select.png
new file mode 100755
index 0000000..434a55b
Binary files /dev/null and b/zh/images/rufus_select.png differ
diff --git a/zh/images/rufus_start.png b/zh/images/rufus_start.png
new file mode 100755
index 0000000..16b0801
Binary files /dev/null and b/zh/images/rufus_start.png differ
diff --git a/zh/images/rufus_sure.png b/zh/images/rufus_sure.png
new file mode 100755
index 0000000..9362779
Binary files /dev/null and b/zh/images/rufus_sure.png differ
diff --git a/zh/images/rufus_warning.png b/zh/images/rufus_warning.png
new file mode 100755
index 0000000..1646f1e
Binary files /dev/null and b/zh/images/rufus_warning.png differ
diff --git a/zh/images/virtual_Udisk.png b/zh/images/virtual_Udisk.png
new file mode 100755
index 0000000..9888b4d
Binary files /dev/null and b/zh/images/virtual_Udisk.png differ
diff --git "a/zh/userguide/K230_CanMV\344\275\277\347\224\250\350\257\264\346\230\216.md" "b/zh/userguide/K230_CanMV\344\275\277\347\224\250\350\257\264\346\230\216.md"
index 1b06baa..c26da47 100755
--- "a/zh/userguide/K230_CanMV\344\275\277\347\224\250\350\257\264\346\230\216.md"
+++ "b/zh/userguide/K230_CanMV\344\275\277\347\224\250\350\257\264\346\230\216.md"
@@ -54,6 +54,12 @@
K230 CanMV是基于K230开发的一个可运行micropython的应用,用户可通过python语言使用硬件的各种资源。
+CanMV源码下载地址如下:
+
+`https://github.com/kendryte/k230_canmv`
+
+`https://gitee.com/kendryte/k230_canmv`
+
## 2. 开发环境搭建
### 2.1 支持的硬件
@@ -77,6 +83,12 @@ K230 CanMV没有在其他Linux版本的主机环境下验证过,不保证可
说明:本章节命令仅供参考,文件名请根据实际情况进行替换。
+CanMV源码下载地址如下:
+
+`https://github.com/kendryte/k230_canmv`
+
+`https://gitee.com/kendryte/k230_canmv`
+
```sh
git clone https://github.com/kendryte/k230_canmv.git
cd k230_canmv
@@ -115,20 +127,18 @@ make CONF=k230_canmv_defconfig
### 4.2 Windows下烧录
-Windows下可通过balena Etcher工具对sd卡进行烧录(balena Etcher工具下载地址 `https://www.balena.io/etcher`)。
-
-1)将TF卡插入PC,然后启动balena Etcher工具,点击工具界面的"Flash from file”按钮,选择待烧写的固件。
-
-![balena-Etcher-flash-from-file](images/balena-Etcher-flash-from-file.jpg)
+Windows下可通过rufus工具对TF卡进行烧录(rufus工具下载地址 `http://rufus.ie/downloads/`)。
-2)点击工具界面的“Select target”按钮,选择目标sdcard卡。
+1)将TF卡插入PC,然后启动rufus工具,点击工具界面的"选择”按钮,选择待烧写的固件。
-![balena-Etcher-select-target](images/balena-Etcher-select-target.jpg)
+![rufus-flash-from-file](../images/rufus_select.png)
-3)点击“Flash”按钮开始烧写,烧写过程有进度条展示,烧写结束后会提示Flash Finish。
+2)点击“开始”按钮开始烧写,烧写过程有进度条展示,烧写结束后会提示“准备就绪”。
-![balena-Etcher-flash](images/balena-Etcher-flash.jpg)
-![balena-Etcher-finish](images/balena-Etcher-finish.jpg)
+![rufus-flash](../images/rufus_start.png)
+![rufus-sure](../images/rufus_sure.png)
+![rufus-warning](../images/rufus_warning.png)
+![rufus-finish](../images/rufus_finish.png)
说明:`sysimage-sdcard.img`可以是`images`目录下的`sysimage-sdcard.img`文件,或者`sysimage-sdcard.img.gz`文件解压缩后的文件。