第十一章 FPIOA管理器实验
本章实验将介绍如何使用CanMV内置的FPIOA管理器脚本来管理芯片内部功能和引脚的映射关系。通过本章的学习,读者将学习到CanMV内置的FPIOA管理器脚本的使用。 本章分为如下几个小节: 11.1 FPIOA和FPIOA管理器脚本介绍 11.2 硬件设计 11.3 程序设计 11.4 运行验证
11.1 FPIOA和FPIOA管理器脚本介绍 FPIOA(Field Programmable Input and Output Array,现场可编程IO阵列)是Kendryte K210芯片内部的模块,FPIOA最主要的功能是允许用户将Kendryte K210芯片内部的255个功能映射到芯片外围的48个自由IO上,因为Kendryte K210芯片内部外设的功能与Kendryte K210引出的外部引脚是彼此独立的,这样的好处是IO引脚可以再不同时刻扮演不同的角色,极大地方便了软硬件的开发。 FPIOA管理器脚本是CanMV提供的内置脚本,FPIOA管理器脚本能够帮助开发者将引脚与具体的硬件功能进行绑定或解绑,以及了解GPIO和GPIOHS的使用情况。FPIOA管理器脚本中提供了fm类,fm类中又提供了register()、unregister()和get_gpio_used()方法,下面分别介绍这几个方法的使用。 register()方法用于将指定的内部功能注册到指定的引脚上,即将引脚与具体的硬件功能进行绑定,register()方法如下所示: fm.register(pin, function, force=True) 通过register()方法,可以很方便的为引脚分配相应的功能。 pin是指定的引脚编号,Kendryte K210一共有48个自由IO,对应的引脚编号为0~47。 function指的是具体的硬件功能,如fm.fpioa.GPIOHS0、fm.fpioa.I2C0_SDA等,更详细的硬件功能列表请见表11.1.1。 force是“强制分配”的使能位,若该参数为“False”则无法对已分配硬件功能的引脚再次分配硬件功能,若该参数为“True”,则不论指定的引脚是都已经被分配硬件功能,都能再次为该引脚分配硬件功能。 硬件功能 描述 硬件功能 描述 JTAG_TCLK JTAG Test Clock I2S1_IN_D1 I2S1 Serial Data Input 1 JTAG_TDI JTAG Test Data In I2S1_IN_D2 I2S1 Serial Data Input 2 JTAG_TMS JTAG Test Mode Select I2S1_IN_D3 I2S1 Serial Data Input 3 JTAG_TDO JTAG Test Data Out I2S1_OUT_D0 I2S1 Serial Data Output 0 SPI0_D0 SPI0 Data 0 I2S1_OUT_D1 I2S1 Serial Data Output 1 SPI0_D1 SPI0 Data 1 I2S1_OUT_D2 I2S1 Serial Data Output 2 SPI0_D2 SPI0 Data 2 I2S1_OUT_D3 I2S1 Serial Data Output 3 SPI0_D3 SPI0 Data 3 I2S2_MCLK I2S2 Master Clock SPI0_D4 SPI0 Data 4 I2S2_SCLK I2S2 Serial Clock(BCLK) SPI0_D5 SPI0 Data 5 I2S2_WS I2S2 Word Select(LRCLK) SPI0_D6 SPI0 Data 6 I2S2_IN_D0 I2S2 Serial Data Input 0 SPI0_D7 SPI0 Data 7 I2S2_IN_D1 I2S2 Serial Data Input 1 SPI0_SS0 SPI0 Chip Select 0 I2S2_IN_D2 I2S2 Serial Data Input 2 SPI0_SS1 SPI0 Chip Select 1 I2S2_IN_D3 I2S2 Serial Data Input 3 SPI0_SS2 SPI0 Chip Select 2 I2S2_OUT_D0 I2S2 Serial Data Output 0 SPI0_SS3 SPI0 Chip Select 3 I2S2_OUT_D1 I2S2 Serial Data Output 1 SPI0_ARB SPI0 Arbitration I2S2_OUT_D2 I2S2 Serial Data Output 2 SPI0_SCLK SPI0 Serial Clock I2S2_OUT_D3 I2S2 Serial Data Output 3 UARTHS_RX UART High speed Receiver RESV0 Reserved function UARTHS_TX UART High speed Transmitter RESV1 Reserved function RESV6 Reserved function RESV2 Reserved function RESV7 Reserved function RESV3 Reserved function CLK_SPI1 Clock SPI1 RESV4 Reserved function CLK_I2C1 Clock I2C1 RESV5 Reserved function GPIOHS0 GPIO High speed 0 I2C0_SCLK I2C0 Serial Clock GPIOHS1 GPIO High speed 1 I2C0_SDA I2C0 Serial Data GPIOHS2 GPIO High speed 2 I2C1_SCLK I2C1 Serial Clock GPIOHS3 GPIO High speed 3 I2C1_SDA I2C1 Serial Data GPIOHS4 GPIO High speed 4 I2C2_SCLK I2C2 Serial Clock GPIOHS5 GPIO High speed 5 I2C2_SDA I2C2 Serial Data GPIOHS6 GPIO High speed 6 CMOS_XCLK DVP System Clock GPIOHS7 GPIO High speed 7 CMOS_RST DVP System Reset GPIOHS8 GPIO High speed 8 CMOS_PWDN DVP Power Down Mode GPIOHS9 GPIO High speed 9 CMOS_VSYNC DVP Vertical Sync GPIOHS10 GPIO High speed 10 CMOS_HREF DVP Horizontal Reference output GPIOHS11 GPIO High speed 11 CMOS_PCLK Pixel Clock GPIOHS12 GPIO High speed 12 CMOS_D0 Data Bit 0 GPIOHS13 GPIO High speed 13 CMOS_D1 Data Bit 1 GPIOHS14 GPIO High speed 14 CMOS_D2 Data Bit 2 GPIOHS15 GPIO High speed 15 CMOS_D3 Data Bit 3 GPIOHS16 GPIO High speed 16 CMOS_D4 Data Bit 4 GPIOHS17 GPIO High speed 17 CMOS_D5 Data Bit 5 GPIOHS18 GPIO High speed 18 CMOS_D6 Data Bit 6 GPIOHS19 GPIO High speed 19 CMOS_D7 Data Bit 7 GPIOHS20 GPIO High speed 20 SCCB_SCLK SCCB Serial Clock GPIOHS21 GPIO High speed 21 SCCB_SDA SCCB Serial Data GPIOHS22 GPIO High speed 22 UART1_CTS UART1 Clear To Send GPIOHS23 GPIO High speed 23 UART1_DSR UART1 Data Set Ready GPIOHS24 GPIO High speed 24 UART1_DCD UART1 Data Carrier Detect GPIOHS25 GPIO High speed 25 UART1_RI UART1 Ring Indicator GPIOHS26 GPIO High speed 26 UART1_SIR_IN UART1 Serial Infrared Input GPIOHS27 GPIO High speed 27 UART1_DTR UART1 Data Terminal Ready GPIOHS28 GPIO High speed 28 UART1_RTS UART1 Request To Send GPIOHS29 GPIO High speed 29 UART1_OUT2 UART1 User-designated Output 2 GPIOHS30 GPIO High speed 30 UART1_OUT1 UART1 User-designated Output 1 GPIOHS31 GPIO High speed 31 UART1_SIR_OUT UART1 Serial Infrared Output GPIO0 GPIO pin 0 UART1_BAUD UART1 Transmit Clock Output GPIO1 GPIO pin 1 UART1_RE UART1 Receiver Output Enable GPIO2 GPIO pin 2 UART1_DE UART1 Driver Output Enable GPIO3 GPIO pin 3 UART1_RS485_EN UART1 RS485 Enable GPIO4 GPIO pin 4 UART2_CTS UART2 Clear To Send GPIO5 GPIO pin 5 UART2_DSR UART2 Data Set Ready GPIO6 GPIO pin 6 UART2_DCD UART2 Data Carrier Detect GPIO7 GPIO pin 7 UART2_RI UART2 Ring Indicator UART1_RX UART1 Receiver UART2_SIR_IN UART2 Serial Infrared Input UART1_TX UART1 Transmitter UART2_DTR UART2 Data Terminal Ready UART2_RX UART2 Receiver UART2_RTS UART2 Request To Send UART2_TX UART2 Transmitter UART2_OUT2 UART2 User-designated Output 2 UART3_RX UART3 Receiver UART2_OUT1 UART2 User-designated Output 1 UART3_TX UART3 Transmitter UART2_SIR_OUT UART2 Serial Infrared Output SPI1_D0 SPI1 Data 0 UART2_BAUD UART2 Transmit Clock Output SPI1_D1 SPI1 Data 1 UART2_RE UART2 Receiver Output Enable SPI1_D2 SPI1 Data 2 UART2_DE UART2 Driver Output Enable SPI1_D3 SPI1 Data 3 UART2_RS485_EN UART2 RS485 Enable SPI1_D4 SPI1 Data 4 UART3_CTS UART3 Clear To Send SPI1_D5 SPI1 Data 5 UART3_DSR UART3 Data Set Ready SPI1_D6 SPI1 Data 6 UART3_DCD UART3 Data Carrier Detect SPI1_D7 SPI1 Data 7 UART3_RI UART3 Ring Indicator SPI1_SS0 SPI1 Chip Select 0 UART3_SIR_IN UART3 Serial Infrared Input SPI1_SS1 SPI1 Chip Select 1 UART3_DTR UART3 Data Terminal Ready SPI1_SS2 SPI1 Chip Select 2 UART3_RTS UART3 Request To Send SPI1_SS3 SPI1 Chip Select 3 UART3_OUT2 UART3 User-designated Output 2 SPI1_ARB SPI1 Arbitration UART3_OUT1 UART3 User-designated Output 1 SPI1_SCLK SPI1 Serial Clock UART3_SIR_OUT UART3 Serial Infrared Output SPI_SLAVE_D0 SPI Slave Data 0 UART3_BAUD UART3 Transmit Clock Output SPI_SLAVE_SS SPI Slave Select UART3_RE UART3 Receiver Output Enable SPI_SLAVE_SCLK SPI Slave Serial Clock UART3_DE UART3 Driver Output Enable I2S0_MCLK I2S0 Master Clock UART3_RS485_EN UART3 RS485 Enable I2S0_SCLK I2S0 Serial Clock(BCLK) TIMER0_TOGGLE1 TIMER0 Toggle Output 1 I2S0_WS I2S0 Word Select(LRCLK) TIMER0_TOGGLE2 TIMER0 Toggle Output 2 I2S0_IN_D0 I2S0 Serial Data Input 0 TIMER0_TOGGLE3 TIMER0 Toggle Output 3 I2S0_IN_D1 I2S0 Serial Data Input 1 TIMER0_TOGGLE4 TIMER0 Toggle Output 4 I2S0_IN_D2 I2S0 Serial Data Input 2 TIMER1_TOGGLE1 TIMER1 Toggle Output 1 I2S0_IN_D3 I2S0 Serial Data Input 3 TIMER1_TOGGLE2 TIMER1 Toggle Output 2 I2S0_OUT_D0 I2S0 Serial Data Output 0 TIMER1_TOGGLE3 TIMER1 Toggle Output 3 I2S0_OUT_D1 I2S0 Serial Data Output 1 TIMER1_TOGGLE4 TIMER1 Toggle Output 4 I2S0_OUT_D2 I2S0 Serial Data Output 2 TIMER2_TOGGLE1 TIMER2 Toggle Output 1 I2S0_OUT_D3 I2S0 Serial Data Output 3 TIMER2_TOGGLE2 TIMER2 Toggle Output 2 I2S1_MCLK I2S1 Master Clock TIMER2_TOGGLE3 TIMER2 Toggle Output 3 I2S1_SCLK I2S1 Serial Clock(BCLK) TIMER2_TOGGLE4 TIMER2 Toggle Output 4 I2S1_WS I2S1 Word Select(LRCLK) CLK_SPI2 Clock SPI2 I2S1_IN_D0 I2S1 Serial Data Input 0 CLK_I2C2 Clock I2C2 表11.1.1 Kendryte K210 FPIOA硬件功能表 register()方法的使用示例如下所示: from board import board_info from fpioa_manager import fm
fm.register(board_info.KEY0, fm.fpioa.GPIOHS0, force=True) unregister()方法用于注销指定注册了内部功能的引脚,即将引脚与具体的硬件功能进行解绑,unregister()方法如下所示: fm.unregister(pin) 通过unregister()方法,可以很方便地释放引脚上分配的硬件功能,pin是指定的引脚编号。 unregister()方法的使用示例如下所示: from board import board_info from fpioa_manager import fm
fm.unregister(board_info.KEY0) get_gpio_used()方法用于获取所有GPIO的使用情况,get_gpio_used()方法如下所示: fm.get_gpio_used() 通过get_gpio_used()方法可以很方便地获取GPIO和GPIOHS的引脚分配情况,None表示该硬件功能未被使用。 get_gpio_used()方法是使用示例如下所示:
11.2 硬件设计 11.2.1 例程功能
- 使用register()方法为IO0引脚注册GPIOHS0功能,然后使用get_gpio_used()方法验证
- 使用unregister()方法注销IO0注册的硬件功能,然后使用get_gpio_used()方法验证 11.2.2 硬件资源 本章实验内容,主要讲解print()函数的使用,无需关注硬件资源。 11.2.3 原理图 本章实验内容,主要讲解print()函数的使用,无需关注原理图。 11.3 程序设计 11.3.1 FPIOA管理器脚本 有关FPIOA管理器脚本的介绍,请见第11.1小节《FPIOA和FPIOA管理器脚本介绍》。 11.3.2 程序流程图
图11.3.2.1 FPIOA管理器实验流程图 11.3.3 main.py代码 main.py中的脚本代码如下所示: from fpioa_manager import fm
为IO0注册GPIOHS0功能
fm.register(0, fm.fpioa.GPIOHS0) print(fm.get_gpio_used()[0])
注销IO0注册的硬件功能
fm.unregister(0)
print(fm.get_gpio_used()[0]) 可以看到,首先通过fm.register()方法为IO0注册了GPIOHS0的功能,因此接下来将获取到GPIOHS0的IO分配情况将会是IO0。 接着使用fm.unregister()方法注销了IO0注册的硬件功能,因此接下来将获取到GPIOHS0的IO分配情况将会是None。 11.4 运行验证 将DNK210开发板连接CanMV IDE,并点击CanMV IDE上的“开始(运行脚本)”按钮后,可以看到“串行终端”窗口中输出了一系列信息,如下图所示:
图11.4.1 “串行终端”窗口打印输出 可以看到,“串行终端”串口中先后分别显示了GPIOHS0的IO分配情况为IO0和None,这与理论推断的结果一致。