M5StickV和Unit-V系列模块的硬件接口使用-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2911|回复: 1

M5StickV和Unit-V系列模块的硬件接口使用

[复制链接]
发表于 2020-2-3 11:56 | 显示全部楼层 |阅读模式
本帖最后由 沧海笑1122 于 2020-2-3 12:04 编辑

【M5StickV和Unit-V系列模块的硬件接口使用】
【前言】
  M5stickV以及Unit-V都是基于K210的视觉识别摄像头模块。在K210当中GPIO的使用与我们熟悉的esp32以及AVR都有所不同,本文希望就此做一些讨论,便于玩家理解使用GPIO.
一、K210的片上外设单元
  K210具备丰富的外设单元,分别是:DVP、JTAG、OTP、FPIOA、GPIO、UART、SPI、RTC、I²S、I²C、 WDT 与 PWM等,可满足海量应用场景。K210的芯片外设(比如GPIOGPIOHS等)对应的引脚是可以任意设置的,我们以前熟悉的AVRESP32 芯片上外设和引脚对应关系已经固定了,这样看来K210外设自由度更大。
k210.png
k2102.png
(上面两幅图片来自《K210技术规格书》)
现场可编程 IO 阵列(FPIOA)的48个多功能 IO是这样组成的:
1、高速GPIO:一共32个( GPIOHS0~GPIOHS31)
2、GPIO:一共8个(GPIO0~GPIO7)
3、其它IO:一共是8个
G11 IO_6 I/O  (FLOAT*)
G12 IO_7 I/O  (FLOAT*)
H11 IO_4 I/O  UARTHS_RX(ISP)
H12 IO_5 I/O  UARTHS_TX(ISP)
J11 IO_2 I/O  JTAG_TMS
J12 IO_3 I/O  JTAG_TDO
K11 IO_0 I/O  JTAG_TCLK
K12 IO_1 I/O  JTAG_TDI

二、M5stickV实例理解fpioa的注册与定义
Fpioa到底是如何灵活设置的呢?我们来看一段按键的代码:
button.png
代码一:from fpioa_manager import fm
导入maipy的fm(fpioa manager)这个内置的对象,用于后续注册工作。
代码二:fm.register(board_info.BUTTON_A, fm.fpioa.GPIO1)
(1)注册K210芯片的外设和引脚的对应关系,这里fm.fpioa.GPIO1 是K210 的一个   GPIO 外设(注意区分 GPIO(外设) 和引脚(实实在在的硬件引脚)的区别 ), 所以把 fm.fpioa.GPIO1 注册到了 引脚 board_info.BUTTON_A;
(2)board_info.BUTTON_A是M5stickV的按钮A的定义,和其余21个pin的定义一起,这个board_info的定义已经集成到了micropython固件上。在固件里面,BUTTON_A已经和IO_建立了定义关系。
注意:下表里面的Pin编号只是一个序号,和芯片的硬件引脚并无关系。
p5.png
Actually fm is global variable define with Fpioa_Manager class, written by Micropython and integrated to firmware。
代码三:but_a=GPIO(GPIO.GPIO1, GPIO.IN, GPIO.PULL_UP)
这一句才是我们熟悉的,对这个GPIO1进行定义,定义该IO是输出型,赋值为1,整个GPIO1就命名给了变量but_a,接下来,你就可以远离GPIO的复杂概念了,只需要记得but_a就可以了,你可以对它进行赋值,判断等等
k2103.png
  这是MaixPy-bit开发板的板载LED分配图,可以作为M5stickV的参考,可以便于玩家理解。
三、小结
  综上所述,K210的pin定义有三套系统。
一套是硬件引脚pin(也就是K210管脚上的pin号,在K210手册可以查到,比如M5stickV的电路中,Grove-1连接到了K210芯片的IO_34);
第二套是使用fm(fpioa manager)注册芯片的外设和引脚的对应关系(比如在M5StickV中,K210芯片的IO_34被映射为CONNEXT_B,有点像在esp32的arduino中,IOXX被定义为DX)。为了方便玩家使用,在编译固件时,开发者已经把 可编程 IO 阵列(FPIOA)的 IO接口与大家熟悉的接口定义建立了一系列映射关系,就是刚才看到的pin_map。这个对应关系是编译在固件里面的。如果你熟悉了这套系统后,对照原理图,就可以在使用过程中,自由灵活设置IO的用途。
在M5stickV中,以下两条语句完全是等效的。
[mw_shl_code=python,true]
fm.register(board_info.BUTTON_A, fm.fpioa.GPIO1)
fm.register(36, fm.fpioa.GPIO1)[/mw_shl_code]

第三套就是我们以前玩单片机熟悉的gpio命名系统。
如:
[mw_shl_code=python,true]but_a=GPIO(GPIO.GPIO1, GPIO.IN, GPIO.PULL_UP)[/mw_shl_code]
  这时,GPIO.GPIO1被定义为一个输入型、上拉的IO口。你定义成GPIO2也没问题(只要和别的定义不冲突),便于我们后期赋值、判断。在这三套系统里,对于玩家来说,仅需要了解一下他们之间的关系即可,在实际使用中会注册、会调用即可。
  GPIOHS(高速GPIO)与GPIO相比,独占中断,因此如果可能,建议绑定为GPIOHSXX为宜。上述按钮代码可以改为:
[mw_shl_code=python,true]
fm.register(board_info.BUTTON_A, fm.fpioa.GPIOHS1)
but_a=GPIO(GPIO.GPIOHS1, GPIO.IN, GPIO.PULL_UP)
[/mw_shl_code]

四、M5stickV和UNIT-V的对照表
模块引出接口名称
M5stickV
Unit-V
IOK210硬件引脚)
board_info
IOK210引脚)
RGB
/
/
8
按钮A
36
BUTTON_A
19
按钮B
37
BUTTON_B
18
LED_W
7
LED_W
/
LED_R
6
LED_R
/
LED_G
9
LED_G
/
LED_B
8
LED_B
/
Grove-2
35
CONNEXT_A
35
Grove-1
34
CONNEXT_B
34
Grove-1-2-3-4  分别对应34/35/V/G

注意:目前Unit-V专用固件正在编制中,在专用固件出来前,玩家暂不使用board.info的定义,必须直接引用IO number来定义。
比如:Unit-V的按钮A定义
[mw_shl_code=python,true]fm.register(19, fm.fpioa.GPIO1)[/mw_shl_code]
等到Unit-V专用固件出来,就可以像M5stickV一样,直接引用:
[mw_shl_code=python,true]fm.register(board_info.BUTTON_A, fm.fpioa.GPIO1)[/mw_shl_code]



五、关于Unit-V的接口使用小结
p7.jpg
1Unit-V的按钮A/B
fm.register(19, fm.fpioa.GPIO1) #IO19注册给fm.fpioa.GPIO1,在电路中,K210IO_19硬件引脚连接到了按钮A
fm.register(18, fm.fpioa.GPIO1)  #同上,I018接线中接的是按钮B
2Unit-VRGB
参考以下链接中的例题:
http://community.m5stack.com/topic/1413/m5stickv-firmware_1022_beta-upgrade
p1.png
Unit-V电路中RGB连接的IO口是IO_8
下面是一段精简之后,Unit-V65亮度点亮的代码:
大家可以体会一下。

[mw_shl_code=python,true]
from modules import ws2812
from fpioa_manager import *
fm.register(8) #IO_8对应RGB
class_ws2812 = ws2812(8,130)  #IO_8对应RGB
a = class_ws2812.set_led(0,(0,0,65)) # 亮度取0~255
a=class_ws2812.display()[/mw_shl_code]


3Unit-VGrove
Unit-V的Grove口使用等同于M5stickV,只需要记住在注册时,用35替换CONNEXT_A,用
用34替换CONNEXT_B即可。
【参考】
2K210技术说明书
3M5stickV以及UNIT-V的背板示意图
4M5StickV 使用入门教程,作者:vany5921
【鸣谢】
感谢韩笑、少翔、Jimmy等师兄的指导。

艰难时刻,保持积极的态度、共克时艰,沧海合十。




 楼主| 发表于 2020-3-4 11:10 | 显示全部楼层
本帖最后由 沧海笑1122 于 2020-3-4 11:12 编辑

mark一个2019年07-31的例题,
[mw_shl_code=python,true]#date:2019-07-31
#测试设置并且注册一个pin(35)至GPIOHS18,然后点亮一只led
#35是真实的电路图上的Pin编号,将其设置到function GPIOHS18,然后用gpio类设定为output的mode,然后驱动led

from fpioa_manager import *
from Maix import GPIO
from Maix import FPIOA
fpioa = FPIOA()
fpioa.set_function(35, fm.fpioa.GPIOHS18)#设置IO_35到function GPIOHS18
fm.register(35, fm.fpioa.GPIOHS18) #注册
led_r=GPIO(GPIO.GPIOHS18,GPIO.OUT) #设置led_r作为一个输出型实例
led_r.value(0) #赋值


[/mw_shl_code]

其中,这一句经过试验,是需要的。这一点先mark,如果实践中通不过,可以加一下。
[mw_shl_code=python,true]fpioa.set_function(35, fm.fpioa.GPIOHS18)#设置IO_35到function GPIOHS18[/mw_shl_code]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-27 17:18 , Processed in 0.078329 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表