本帖最后由 沧海笑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/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到底是如何灵活设置的呢?我们来看一段按键的代码: 代码一: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编号只是一个序号,和芯片的硬件引脚并无关系。 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就可以了,你可以对它进行赋值,判断等等。 这是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的对照表 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的接口使用小结 1、Unit-V的按钮A/B fm.register(19, fm.fpioa.GPIO1) #将IO19注册给fm.fpioa.GPIO1,在电路中,K210的IO_19硬件引脚连接到了按钮A。 fm.register(18, fm.fpioa.GPIO1) #同上,I018接线中接的是按钮B 2、Unit-V的RGB 参考以下链接中的例题: http://community.m5stack.com/topic/1413/m5stickv-firmware_1022_beta-upgrade 在Unit-V电路中RGB连接的IO口是IO_8 下面是一段精简之后,Unit-V以65亮度点亮的代码: 大家可以体会一下。
[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]
3、Unit-V的Grove口 Unit-V的Grove口使用等同于M5stickV,只需要记住在注册时,用35替换CONNEXT_A,用 用34替换CONNEXT_B即可。 【参考】 2、K210技术说明书 3、M5stickV以及UNIT-V的背板示意图 4、M5StickV 使用入门教程,作者:vany5921 【鸣谢】 感谢韩笑、少翔、Jimmy等师兄的指导。
艰难时刻,保持积极的态度、共克时艰,沧海合十。
|