3、K210硬件外设:摄像头、LCD显示屏、LED、按键、SD卡等模块的使用方法
K210作为一款集成RISC-V双核处理器与KPU神经网络加速器的AI芯片,其强大之处不仅在于算力,更在于它能够通过丰富的外设接口与真实世界交互。在视觉AI入门项目中,摄像头负责“看”,LCD负责“显示”,LED与按键负责“反馈与控制”,SD卡则负责“存储”。理解这些外设的硬件连接、驱动原理与软件调用方法,是构建任何K210视觉应用的基础。本章将围绕这些核心外设,从硬件架构、驱动逻辑到实战代码,进行系统拆解。
上图展示了K210与主要外设之间的物理连接与数据流向。摄像头通过DVP并行接口将图像数据传输至K210的DVP控制器,经ISP处理后送入内存或KPU进行推理;LCD通过SPI接口接收K210发送的显示帧数据;LED与按键作为最基础的GPIO设备,用于状态指示与用户交互;SD卡则通过SPI或SDIO接口实现大容量数据存储。理解这张图,就掌握了K210外设编程的宏观脉络。
3.1 核心外设接口与硬件连接原理
K210的硬件外设编程,首先需要明确各模块在芯片内部的挂载总线与引脚复用关系。不同于桌面级处理器,K210的引脚功能高度复用,同一个物理引脚可能映射到GPIO、SPI、I2C或DVP等多种功能。因此,正确的引脚初始化是外设工作的前提。
3.1.1 摄像头(OV2640/OV5640)的DVP接口
K210内置DVP(Digital Video Port)控制器,支持8位并行数据输入,最高可支持200万像素摄像头。其硬件连接通常包括:
- 数据线:DVP_D0 ~ DVP_D7,共8根,用于传输像素数据。
- 同步信号:VSYNC(帧同步)、HSYNC(行同步)、PCLK(像素时钟)。
- 控制接口:SCCB(兼容I2C),用于配置摄像头寄存器,如分辨率、曝光、白平衡等。
- 时钟:XCLK,由K210输出给摄像头作为主时钟。
在MaixPy开发环境中,初始化摄像头仅需几行代码,但底层驱动会完成DVP控制器配置、DMA传输通道分配以及帧缓冲区的管理。初学者常犯的错误是忽略摄像头供电电压(OV2640需要2.8V或3.3V),导致图像发暗或无法识别。
3.1.2 LCD显示屏的SPI通信机制
K210开发板常用的LCD为ST7789或ILI9341,分辨率通常为320x240。其驱动方式为SPI(串行外设接口),但需要额外控制线:
- SCLK:SPI时钟线。
- MOSI:主出从入数据线。
- DC:数据/命令选择线(高电平为数据,低电平为命令)。
- CS:片选线。
- RST:复位线。
- BL:背光控制线(通常接PWM引脚)。
由于SPI传输全双工且速度较快,K210的FPIOA(现场可编程IO阵列)允许将任意SPI功能映射到任意物理引脚,这极大方便了PCB布局。但需要注意,SPI时钟频率不宜过高,否则可能导致信号完整性下降,一般建议在20MHz~40MHz之间。
3.1.3 GPIO外设:LED与按键
LED与按键是GPIO(通用输入输出)的典型应用。K210的GPIO支持上下拉配置、中断触发(上升沿/下降沿/双沿)以及PWM输出。对于LED,通常使用推挽输出模式驱动;对于按键,则需设置为输入模式并启用内部上拉电阻,以避免浮空电平导致的误触发。
3.1.4 SD卡存储的SPI/SDIO选择
SD卡支持两种通信模式:SDIO(4位并行)与SPI(1位串行)。在K210上,由于SDIO模式需要占用更多引脚且驱动复杂,多数入门项目采用SPI模式驱动SD卡。SPI模式下的SD卡初始化时序较为特殊,需要遵循SD卡规范发送CMD0、CMD8、ACMD41等命令。MaixPy的sdcard模块封装了这些底层细节,用户只需挂载文件系统即可像操作普通文件一样读写数据。
3.2 外设驱动初始化流程与操作步骤
无论使用MaixPy(MicroPython)还是C语言SDK,外设初始化的逻辑框架是一致的。以下以MaixPy为例,展示标准的外设初始化流程。
- 导入模块:
import sensor, lcd, gpio, time, sdcard。 - 初始化摄像头:
sensor.reset()、sensor.set_pixformat(sensor.RGB565)、sensor.set_framesize(sensor.QVGA)、sensor.run(1)。 - 初始化LCD:
lcd.init(),可设置背光亮度。 - 初始化LED与按键:
led = gpio.GPIO(12, gpio.OUT)、key = gpio.GPIO(16, gpio.IN, gpio.PULL_UP)。 - 初始化SD卡:
sdcard.init(),然后os.mount(sdcard.SDCard, "/sd")。
在C语言SDK中,流程类似但更为底层,需要调用fpioa_set_function进行引脚功能映射,然后调用dvp_init、spi_init等函数。下表对比了两种开发方式的特点:
| 对比维度 | MaixPy (MicroPython) | C语言SDK |
|---|---|---|
| 开发效率 | 高,代码量少,适合快速验证 | 低,需关注底层寄存器操作 |
| 运行性能 | 中等,解释执行有开销 | 高,编译执行,适合复杂算法 |
| 外设控制粒度 | 封装完整,但灵活性受限 | 可精确控制每个寄存器 |
| 适合场景 | 入门学习、简单原型 | 产品开发、性能敏感项目 |
3.3 实战案例:实现“按键拍照并保存至SD卡”
为了将上述外设串联起来,我们设计一个典型的视觉AI入门案例:按下按键,K210采集当前摄像头画面,在LCD上预览,并将图片以JPEG格式保存到SD卡中。该案例覆盖了图像采集、显示、GPIO输入、文件存储四大核心功能。
3.3.1 案例背景与目标
假设我们正在搭建一个简易的“拍照记录仪”,硬件环境为:K210开发板(Dock或Bit)、OV2640摄像头、1.3寸ST7789 LCD、一个独立按键、一张MicroSD卡。目标是通过按键触发,实现单次拍照存储,并在LCD上显示“Photo Saved”提示。
3.3.2 关键代码实现与解析
import sensor, lcd, gpio, time, os, sdcard
# 初始化SD卡
sdcard.init()
os.mount(sdcard.SDCard, "/sd")
# 初始化摄像头
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA) # 320x240
sensor.run(1)
# 初始化LCD
lcd.init()
lcd.rotation(2) # 根据实际安装方向调整
# 初始化按键 (假设连接在IO16)
key = gpio.GPIO(16, gpio.IN, gpio.PULL_UP)
# 初始化LED (假设连接在IO12)
led = gpio.GPIO(12, gpio.OUT)
led.value(0)
photo_count = 0
while True:
if key.value() == 0: # 检测到低电平,表示按下
time.sleep_ms(20) # 软件消抖
if key.value() == 0:
led.value(1) # 点亮LED表示正在拍照
img = sensor.snapshot() # 采集一帧图像
# 生成文件名
fname = "/sd/photo_{}.jpg".format(photo_count)
img.save(fname) # 保存为JPEG
photo_count += 1
# 显示提示信息
img.draw_string(10, 10, "Saved!", color=(255,0,0))
lcd.display(img)
led.value(0) # 关闭LED
time.sleep_ms(500) # 防止长按重复触发
time.sleep_ms(10) # 主循环间隔
3.3.3 执行结果与复盘
运行上述代码后,每次按下按键,LCD会短暂显示带有“Saved!”字样的画面,同时SD卡中会出现对应的JPEG文件。通过串口终端或读卡器可以验证文件是否完整。
sdcard.init()前增加time.sleep_ms(100)。第二,按键误触发,由于未启用内部上拉,导致引脚电平漂移,增加gpio.PULL_UP参数后解决。此外,img.save()在保存大尺寸图像时耗时较长,期间若再次按下按键,会导致程序阻塞,因此加入了500ms的冷却时间。
3.4 常见误区与工程经验总结
在K210外设开发中,以下误区需要特别留意:
- 引脚复用冲突:K210的FPIOA虽然灵活,但同一引脚不能同时映射为两个功能。例如,若将LCD的SCLK与SD卡的SCLK映射到同一引脚,则两者无法同时工作。
- 电源电流不足:摄像头、LCD背光、SD卡写入时电流需求较大,若开发板USB供电不足,会导致系统重启或图像花屏。建议使用5V/2A电源适配器。
- LCD背光未初始化:很多初学者发现LCD屏幕不亮,但代码无报错,原因往往是背光引脚未输出高电平或PWM占空比为零。
- SD卡文件系统损坏:频繁插拔或写入中断可能导致FAT文件系统错误,建议在代码中增加异常处理,并在PC上定期格式化SD卡。
os.umount)后再断电,否则可能造成数据丢失或SD卡逻辑损坏。对于摄像头排线,插拔时需断电操作,避免带电插拔损坏DVP接口。
总结而言,K210的外设编程本质是对芯片内部控制器与外部器件的协同管理。掌握DVP、SPI、GPIO、SDIO等接口的时序特性,理解引脚复用与电源设计,并通过实际案例将各模块串联,是快速上手视觉AI项目的关键路径。建议初学者在完成本章案例后,尝试修改代码实现“长按按键连拍”或“LCD显示帧率”等功能,以加深对系统资源调度的理解。