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

沧海笑1122 发表于 2020-2-3 11:56

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

本帖最后由 沧海笑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的芯片外设(比如GPIO、GPIOHS等)对应的引脚是可以任意设置的,我们以前熟悉的AVR、ESP32 芯片上外设和引脚对应关系已经固定了,这样看来K210外设自由度更大。(上面两幅图片来自《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/OUARTHS_RX(ISP)H12 IO_5 I/OUARTHS_TX(ISP)J11 IO_2 I/OJTAG_TMSJ12 IO_3 I/OJTAG_TDOK11 IO_0 I/OJTAG_TCLKK12 IO_1 I/OJTAG_TDI
二、M5stickV实例理解fpioa的注册与定义 Fpioa到底是如何灵活设置的呢?我们来看一段按键的代码:代码一: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编号只是一个序号,和芯片的硬件引脚并无关系。参考:https://maixpy.sipeed.com/en/libs/builtin_py/fm.htmlActually 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就可以了,你可以对它进行赋值,判断等等。这是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中,以下两条语句完全是等效的。fm.register(board_info.BUTTON_A, fm.fpioa.GPIO1)
fm.register(36, fm.fpioa.GPIO1)
第三套就是我们以前玩单片机熟悉的gpio命名系统。如:but_a=GPIO(GPIO.GPIO1, GPIO.IN, GPIO.PULL_UP)这时,GPIO.GPIO1被定义为一个输入型、上拉的IO口。你定义成GPIO2也没问题(只要和别的定义不冲突),便于我们后期赋值、判断。在这三套系统里,对于玩家来说,仅需要了解一下他们之间的关系即可,在实际使用中会注册、会调用即可。GPIOHS(高速GPIO)与GPIO相比,独占中断,因此如果可能,建议绑定为GPIOHSXX为宜。上述按钮代码可以改为:fm.register(board_info.BUTTON_A, fm.fpioa.GPIOHS1)
but_a=GPIO(GPIO.GPIOHS1, GPIO.IN, GPIO.PULL_UP)
四、M5stickV和UNIT-V的对照表
模块引出接口名称M5stickVUnit-V
IO(K210硬件引脚)board_infoIO(K210引脚)
RGB//8
按钮A36BUTTON_A19
按钮B37BUTTON_B18
LED_W7LED_W/
LED_R6LED_R/
LED_G9LED_G/
LED_B8LED_B/
Grove-235CONNEXT_A35
Grove-134CONNEXT_B34
Grove-1-2-3-4分别对应34/35/V/G
注意:目前Unit-V专用固件正在编制中,在专用固件出来前,玩家暂不使用board.info的定义,而必须直接引用IO number来定义。比如:Unit-V的按钮A定义fm.register(19, fm.fpioa.GPIO1)等到Unit-V专用固件出来,就可以像M5stickV一样,直接引用:fm.register(board_info.BUTTON_A, fm.fpioa.GPIO1)


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

3、Unit-V的Grove口Unit-V的Grove口使用等同于M5stickV,只需要记住在注册时,用35替换CONNEXT_A,用用34替换CONNEXT_B即可。 【参考】1、点亮板载LEDhttps://www.cnblogs.com/iBoundary/p/12000753.html2、K210技术说明书3、M5stickV以及UNIT-V的背板示意图4、M5StickV 使用入门教程,作者:vany5921https://www.arduino.cn/thread-93506-1-1.html【鸣谢】感谢韩笑、少翔、Jimmy等师兄的指导。
艰难时刻,保持积极的态度、共克时艰,沧海合十。



沧海笑1122 发表于 2020-3-4 11:10

本帖最后由 沧海笑1122 于 2020-3-4 11:12 编辑

mark一个2019年07-31的例题,
#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) #赋值




其中,这一句经过试验,是需要的。这一点先mark,如果实践中通不过,可以加一下。
fpioa.set_function(35, fm.fpioa.GPIOHS18)#设置IO_35到function GPIOHS18
页: [1]
查看完整版本: M5StickV和Unit-V系列模块的硬件接口使用