import time
from Maix import GPIO
from Maix import FPIOA
from fpioa_manager import fm
from board import board_info
# see board/readme.md to config your sipeed's hardware.
print(board_info.LED_R)
print(board_info.LED_G)
print(board_info.LED_B)
#print(board_info.GPIOHS9)
'''
用fm(fpioa manager)这个内置的对象来注册芯片的外设和引脚的对应关系,
这里 fm.fpioa.GPIO0 是 K210 的一个 GPIO 外设
(注意区分 GPIO(外设) 和引脚(实实在在的硬件引脚)的区别 ),
所以把 fm.fpioa.GPIO0 注册到了 引脚 board_info.LED_R;
'''
fpioa = FPIOA()
fpioa.set_function(8,fpioa.GPIOHS8)
fpioa.set_function(9,fpioa.GPIOHS9)
#将LED外部IO注册到内部GPIO,K210引脚支持任意配置
'''
fm.register(12,fm.fpioa.GPIO0)
fm.register(13,fm.fpioa.GPIO1)
fm.register(14,fm.fpioa.GPIO2)
'''
fm.register(board_info.LED_R, fm.fpioa.GPIO0, force=True)
fm.register(board_info.LED_G, fm.fpioa.GPIOHS0, force=True)
fm.register(board_info.LED_B, fm.fpioa.GPIO2, force=True)
fm.register(board_info.BOOT_KEY, fm.fpioa.GPIO3, force=True)
# 构造函数 fm.fpioa.GPIO0 重新命名的
led_r = GPIO(GPIO.GPIO0, GPIO.OUT)
led_g = GPIO(GPIO.GPIOHS0, GPIO.OUT)
led_b = GPIO(GPIO.GPIO2, GPIO.OUT)
key_input = GPIO(GPIO.GPIO3, GPIO.IN)
test_led1 = GPIO(GPIO.GPIOHS8,GPIO.OUT)
test_led2 = GPIO(GPIO.GPIOHS9,GPIO.OUT)
test_gpio=GPIO(GPIO.GPIOHS9,GPIO.OUT)
status = 0
for i in range(0, 200):
led_r.value(status)#设置高低电平
test_led1.value(status)
time.sleep_ms(300)
led_g.value(status)
time.sleep_ms(300)
led_b.value(status)
time.sleep_ms(300)
status = 0 if (status == 1) else 1
time.sleep_ms(300)
print("LED RGB(%d,%d,%d)" % (led_r.value(), led_g.value(), led_b.value()))
time.sleep_ms(100)
print("key_input:", key_input.value())
fm.unregister(board_info.LED_R)
fm.unregister(board_info.LED_G)
fm.unregister(board_info.LED_B)
fm.unregister(board_info.BOOT_KEY)
K210 支持每个外设随意映射到任意引脚, 使用 FPIOA 功能来实现。
注意:
以下 GPIOHS 默认已经被使用, 程序中如非必要尽量不要使用:
GPIOHS | 功能 |
---|---|
GPIOHS31 | LCD_DC |
GPIOHS30 | LCD_RST |
GPIOHS29 | SD_CS |
GPIOHS28 | MIC_LED_CLK |
GPIOHS27 | MIC_LED_DATA |
1. 类 FPIOA
1.1. 方法
help(func)
显示外设及其简要描述
参数
func
: 外设名(功能/编号),可以不传参, 则以表格的形式显示所有外设名即简要描述,这个表格也可以在本页的末尾找到(附录:外设表);</br> 如果传参,则传一个整型值, 找到该编号对应的外设后会打印外设名和描述,</br> 比如FPIOA.JTAG_TCLK
或者fm.fpioa.JTAG_TCLK
(fm
在本页后面介绍) 或者0
比如:
from Maix import FPIOA
fpioa = FPIOA()
fpioa.help()
fpioa.help(0)
fpioa.help(fpioa.JTAG_TCLK)
fm.fpioa.help()
fm.fpioa.help(fm.fpioa.JTAG_TCLK)
返回
外设名及其简要描述
set_function(pin, func)
设置引脚对应的外设功能, 即引脚映射
参数
pin
: 引脚编号,取值 [0, 47], 具体的引脚连接请看电路图, 也可以使用board_info.
然后按TAB
按键补全来获得板子的常用引脚,比如board_info.LED_G
func
: 外设功能,传一个整型值,可以通过fm.fpioa.help()
或者查本页末尾的 附录: 外设表 表得到
比如 需要将连接 绿色 LED
的引脚映射到 高速 GPIO0
上:
fpioa = FPIOA()
fpioa.set_function(board_info.LED_G, fm.fpioa.GPIOHS0)
get_Pin_num(func)
获取外设映射到哪个引脚上了
参数
func
: 外设功能,传一个整型值,可以通过fm.fpioa.help()
或者查本页末尾的 附录: 外设表 表得到
比如:
fpioa = FPIOA()
fpioa.set_function(board_info.LED_G, fm.fpioa.GPIOHS0)
pin = fpioa.get_Pin_num(fm.fpioa.GPIOHS0)
if pin == board_info.LED_G:
print("set function ok")
2. 附录: 外设表
外设功能(func) | 简要描述 |
---|---|
JTAG_TCLK | JTAG Test Clock |
JTAG_TDI | JTAG Test Data In |
JTAG_TMS | JTAG Test Mode Select |
JTAG_TDO | JTAG Test Data Out |
SPI0_D0 | SPI0 Data 0 |
SPI0_D1 | SPI0 Data 1 |
SPI0_D2 | SPI0 Data 2 |
SPI0_D3 | SPI0 Data 3 |
SPI0_D4 | SPI0 Data 4 |
SPI0_D5 | SPI0 Data 5 |
SPI0_D6 | SPI0 Data 6 |
SPI0_D7 | SPI0 Data 7 |
SPI0_SS0 | SPI0 Chip Select 0 |
SPI0_SS1 | SPI0 Chip Select 1 |
SPI0_SS2 | SPI0 Chip Select 2 |
SPI0_SS3 | SPI0 Chip Select 3 |
SPI0_ARB | SPI0 Arbitration |
SPI0_SCLK | SPI0 Serial Clock |
UARTHS_RX | UART High speed Receiver |
UARTHS_TX | UART High speed Transmitter |
RESV6 | Reserved function |
RESV7 | Reserved function |
CLK_SPI1 | Clock SPI1 |
CLK_I2C1 | Clock I2C1 |
GPIOHS0 | GPIO High speed 0 |
GPIOHS1 | GPIO High speed 1 |
GPIOHS2 | GPIO High speed 2 |
GPIOHS3 | GPIO High speed 3 |
GPIOHS4 | GPIO High speed 4 |
GPIOHS5 | GPIO High speed 5 |
GPIOHS6 | GPIO High speed 6 |
GPIOHS7 | GPIO High speed 7 |
GPIOHS8 | GPIO High speed 8 |
GPIOHS9 | GPIO High speed 9 |
GPIOHS10 | GPIO High speed 10 |
GPIOHS11 | GPIO High speed 11 |
GPIOHS12 | GPIO High speed 12 |
GPIOHS13 | GPIO High speed 13 |
GPIOHS14 | GPIO High speed 14 |
GPIOHS15 | GPIO High speed 15 |
GPIOHS16 | GPIO High speed 16 |
GPIOHS17 | GPIO High speed 17 |
GPIOHS18 | GPIO High speed 18 |
GPIOHS19 | GPIO High speed 19 |
GPIOHS20 | GPIO High speed 20 |
GPIOHS21 | GPIO High speed 21 |
GPIOHS22 | GPIO High speed 22 |
GPIOHS23 | GPIO High speed 23 |
GPIOHS24 | GPIO High speed 24 |
GPIOHS25 | GPIO High speed 25 |
GPIOHS26 | GPIO High speed 26 |
GPIOHS27 | GPIO High speed 27 |
GPIOHS28 | GPIO High speed 28 |
GPIOHS29 | GPIO High speed 29 |
GPIOHS30 | GPIO High speed 30 |
GPIOHS31 | GPIO High speed 31 |
GPIO0 | GPIO pin 0 |
GPIO1 | GPIO pin 1 |
GPIO2 | GPIO pin 2 |
GPIO3 | GPIO pin 3 |
GPIO4 | GPIO pin 4 |
GPIO5 | GPIO pin 5 |
GPIO6 | GPIO pin 6 |
GPIO7 | GPIO pin 7 |
UART1_RX | UART1 Receiver |
UART1_TX | UART1 Transmitter |
UART2_RX | UART2 Receiver |
UART2_TX | UART2 Transmitter |
UART3_RX | UART3 Receiver |
UART3_TX | UART3 Transmitter |
SPI1_D0 | SPI1 Data 0 |
SPI1_D1 | SPI1 Data 1 |
SPI1_D2 | SPI1 Data 2 |
SPI1_D3 | SPI1 Data 3 |
SPI1_D4 | SPI1 Data 4 |
SPI1_D5 | SPI1 Data 5 |
SPI1_D6 | SPI1 Data 6 |
SPI1_D7 | SPI1 Data 7 |
SPI1_SS0 | SPI1 Chip Select 0 |
SPI1_SS1 | SPI1 Chip Select 1 |
SPI1_SS2 | SPI1 Chip Select 2 |
SPI1_SS3 | SPI1 Chip Select 3 |
SPI1_ARB | SPI1 Arbitration |
SPI1_SCLK | SPI1 Serial Clock |
SPI_SLAVE_D0 | SPI Slave Data 0 |
SPI_SLAVE_SS | SPI Slave Select |
SPI_SLAVE_SCLK | SPI Slave Serial Clock |
I2S0_MCLK | I2S0 Master Clock |
I2S0_SCLK | I2S0 Serial Clock(BCLK) |
I2S0_WS | I2S0 Word Select(LRCLK) |
I2S0_IN_D0 | I2S0 Serial Data Input 0 |
I2S0_IN_D1 | I2S0 Serial Data Input 1 |
I2S0_IN_D2 | I2S0 Serial Data Input 2 |
I2S0_IN_D3 | I2S0 Serial Data Input 3 |
I2S0_OUT_D0 | I2S0 Serial Data Output 0 |
I2S0_OUT_D1 | I2S0 Serial Data Output 1 |
I2S0_OUT_D2 | I2S0 Serial Data Output 2 |
I2S0_OUT_D3 | I2S0 Serial Data Output 3 |
I2S1_MCLK | I2S1 Master Clock |
I2S1_SCLK | I2S1 Serial Clock(BCLK) |
I2S1_WS | I2S1 Word Select(LRCLK) |
I2S1_IN_D0 | I2S1 Serial Data Input 0 |
I2S1_IN_D1 | I2S1 Serial Data Input 1 |
I2S1_IN_D2 | I2S1 Serial Data Input 2 |
I2S1_IN_D3 | I2S1 Serial Data Input 3 |
I2S1_OUT_D0 | I2S1 Serial Data Output 0 |
I2S1_OUT_D1 | I2S1 Serial Data Output 1 |
I2S1_OUT_D2 | I2S1 Serial Data Output 2 |
I2S1_OUT_D3 | I2S1 Serial Data Output 3 |
I2S2_MCLK | I2S2 Master Clock |
I2S2_SCLK | I2S2 Serial Clock(BCLK) |
I2S2_WS | I2S2 Word Select(LRCLK) |
I2S2_IN_D0 | I2S2 Serial Data Input 0 |
I2S2_IN_D1 | I2S2 Serial Data Input 1 |
I2S2_IN_D2 | I2S2 Serial Data Input 2 |
I2S2_IN_D3 | I2S2 Serial Data Input 3 |
I2S2_OUT_D0 | I2S2 Serial Data Output 0 |
I2S2_OUT_D1 | I2S2 Serial Data Output 1 |
I2S2_OUT_D2 | I2S2 Serial Data Output 2 |
I2S2_OUT_D3 | I2S2 Serial Data Output 3 |
RESV0 | Reserved function |
RESV1 | Reserved function |
RESV2 | Reserved function |
RESV3 | Reserved function |
RESV4 | Reserved function |
RESV5 | Reserved function |
I2C0_SCLK | I2C0 Serial Clock |
I2C0_SDA | I2C0 Serial Data |
I2C1_SCLK | I2C1 Serial Clock |
I2C1_SDA | I2C1 Serial Data |
I2C2_SCLK | I2C2 Serial Clock |
I2C2_SDA | I2C2 Serial Data |
CMOS_XCLK | DVP System Clock |
CMOS_RST | DVP System Reset |
CMOS_PWDN | DVP Power Down Mode |
CMOS_VSYNC | DVP Vertical Sync |
CMOS_HREF | DVP Horizontal Reference output |
CMOS_PCLK | Pixel Clock |
CMOS_D0 | Data Bit 0 |
CMOS_D1 | Data Bit 1 |
CMOS_D2 | Data Bit 2 |
CMOS_D3 | Data Bit 3 |
CMOS_D4 | Data Bit 4 |
CMOS_D5 | Data Bit 5 |
CMOS_D6 | Data Bit 6 |
CMOS_D7 | Data Bit 7 |
SCCB_SCLK | SCCB Serial Clock |
SCCB_SDA | SCCB Serial Data |
UART1_CTS | UART1 Clear To Send |
UART1_DSR | UART1 Data Set Ready |
UART1_DCD | UART1 Data Carrier Detect |
UART1_RI | UART1 Ring Indicator |
UART1_SIR_IN | UART1 Serial Infrared Input |
UART1_DTR | UART1 Data Terminal Ready |
UART1_RTS | UART1 Request To Send |
UART1_OUT2 | UART1 User-designated Output 2 |
UART1_OUT1 | UART1 User-designated Output 1 |
UART1_SIR_OUT | UART1 Serial Infrared Output |
UART1_BAUD | UART1 Transmit Clock Output |
UART1_RE | UART1 Receiver Output Enable |
UART1_DE | UART1 Driver Output Enable |
UART1_RS485_EN | UART1 RS485 Enable |
UART2_CTS | UART2 Clear To Send |
UART2_DSR | UART2 Data Set Ready |
UART2_DCD | UART2 Data Carrier Detect |
UART2_RI | UART2 Ring Indicator |
UART2_SIR_IN | UART2 Serial Infrared Input |
UART2_DTR | UART2 Data Terminal Ready |
UART2_RTS | UART2 Request To Send |
UART2_OUT2 | UART2 User-designated Output 2 |
UART2_OUT1 | UART2 User-designated Output 1 |
UART2_SIR_OUT | UART2 Serial Infrared Output |
UART2_BAUD | UART2 Transmit Clock Output |
UART2_RE | UART2 Receiver Output Enable |
UART2_DE | UART2 Driver Output Enable |
UART2_RS485_EN | UART2 RS485 Enable |
UART3_CTS | UART3 Clear To Send |
UART3_DSR | UART3 Data Set Ready |
UART3_DCD | UART3 Data Carrier Detect |
UART3_RI | UART3 Ring Indicator |
UART3_SIR_IN | UART3 Serial Infrared Input |
UART3_DTR | UART3 Data Terminal Ready |
UART3_RTS | UART3 Request To Send |
UART3_OUT2 | UART3 User-designated Output 2 |
UART3_OUT1 | UART3 User-designated Output 1 |
UART3_SIR_OUT | UART3 Serial Infrared Output |
UART3_BAUD | UART3 Transmit Clock Output |
UART3_RE | UART3 Receiver Output Enable |
UART3_DE | UART3 Driver Output Enable |
UART3_RS485_EN | UART3 RS485 Enable |
TIMER0_TOGGLE1 | TIMER0 Toggle Output 1 |
TIMER0_TOGGLE2 | TIMER0 Toggle Output 2 |
TIMER0_TOGGLE3 | TIMER0 Toggle Output 3 |
TIMER0_TOGGLE4 | TIMER0 Toggle Output 4 |
TIMER1_TOGGLE1 | TIMER1 Toggle Output 1 |
TIMER1_TOGGLE2 | TIMER1 Toggle Output 2 |
TIMER1_TOGGLE3 | TIMER1 Toggle Output 3 |
TIMER1_TOGGLE4 | TIMER1 Toggle Output 4 |
TIMER2_TOGGLE1 | TIMER2 Toggle Output 1 |
TIMER2_TOGGLE2 | TIMER2 Toggle Output 2 |
TIMER2_TOGGLE3 | TIMER2 Toggle Output 3 |
TIMER2_TOGGLE4 | TIMER2 Toggle Output 4 |
CLK_SPI2 | Clock SPI2 |
CLK_I2C2 | Clock I2C2 |
GPIO
General Purpose Input Output (通用输入/输出)简称为 GPIO,或总线扩展器。
K210上有高速 GPIO(GPIOHS) 和通用 GPIO 在 K210 上, GPIO 有一下特征:
-
高速 GPIO:
高速 GPIO 为 GPIOHS,共 32 个。具有如下特点:
- 可配置输入输出信号
- 每个 IO 具有独立中断源
- 中断支持边沿触发和电平触发
- 每个 IO 可以分配到 FPIOA 上 48 个管脚之一
- 可配置上下拉,或者高阻
-
通用 GPIO:
通用 GPIO 共 8 个,具有如下特点:
- 8 个 IO 使用一个中断源
- 可配置输入输出信号
- 可配置触发 IO 总中断,边沿触发和电平触发
- 每个 IO 可以分配到 FPIOA 上 48 个管脚之一
注意:
一下 GPIOHS 默认已经被使用, 程序中如非必要尽量不要使用:
GPIOHS | 功能 |
---|---|
GPIOHS31 | LCD_DC |
GPIOHS30 | LCD_RST |
GPIOHS29 | SD_CS |
GPIOHS28 | MIC_LED_CLK |
GPIOHS27 | MIC_LED_DATA |
1. 构造函数
class GPIO(ID, MODE, PULL, VALUE)
通过指定的参数新建一个 SPI 对象
1.1. 参数
-
ID
: 使用的 GPIO 引脚(一定要使用 GPIO 里带的常量来指定) -
MODE
: GPIO模式• GPIO.IN就是输入模式
• GPIO.OUT就是输出模式
-
PULL
: GPIO上下拉模式• GPIO.PULL_UP 上拉
• GPIO.PULL_DOWN 下拉
• GPIO.PULL_NONE 即不上拉也不下拉
2. 方法
2.1. value
修改/读取 GPIO 引脚状态
GPIO.value([value])
参数
[value]
: 可选参数,如果此参数不为空,则返回当前 GPIO 引脚状态
返回值
如果 [value]
参数不为空,则返回当前 GPIO 引脚状态
2.2. irq
配置一个中断处理程序,当 pin
的触发源处于活动状态时调用它。如果管脚模式为 pin.in,则触发源是管脚上的外部值。
GPIO.irq(CALLBACK_FUNC,TRIGGER_CONDITION,GPIO.WAKEUP_NOT_SUPPORT,PRORITY)
参数
-
CALLBACK_FUNC
:中断回调函数,当中断触发的时候被调用,一个入口函数pin_num
• PIN_NUM 返回的是触发中断的 GPIO 引脚号(只有GPIOHS支持中断,所以这里的引脚号也是GPIOHS的引脚号)
-
TRIGGER_CONDITION
:GPIO 引脚的中断触发模式• GPIO.IRQ_RISING 上升沿触发
• GPIO.IRQ_FALLING 下降沿触发
• GPIO.IRQ_BOTH 上升沿和下降沿都触发
返回值
无
2.3. disirq
关闭中断
GPIO.disirq()
参数
无
返回值
无
2.4. mode
GPIO模式
GPIO.mode(MODE)
参数
-
MODE
•
GPIO.IN
就是输入模式•
GPIO.OUT
就是输出模式
返回值
无
2.5. pull
GPIO上下拉模式
GPIO.pull(PULL)
参数
-
PULL
•
GPIO.IRQ_RISING
上升沿触发•
GPIO.IRQ_FALLING
下降沿触发•
GPIO.IRQ_BOTH
上升沿和下降沿都触发
返回值
无
3. 常量
GPIO0
: GPIO0GPIO1
: GPIO1GPIO2
: GPIO2GPIO3
: GPIO3GPIO4
: GPIO4GPIO5
: GPIO5GPIO6
: GPIO6GPIO7
: GPIO7GPIOHS0
: GPIOHS0GPIOHS1
: GPIOHS1GPIOHS2
: GPIOHS2GPIOHS3
: GPIOHS3GPIOHS4
: GPIOHS4GPIOHS5
: GPIOHS5GPIOHS6
: GPIOHS6GPIOHS7
: GPIOHS7GPIOHS8
: GPIOHS8GPIOHS9
: GPIOHS9GPIOHS10
: GPIOHS10GPIOHS11
: GPIOHS11GPIOHS12
: GPIOHS12GPIOHS13
: GPIOHS13GPIOHS14
: GPIOHS14GPIOHS15
: GPIOHS15GPIOHS16
: GPIOHS16GPIOHS17
: GPIOHS17GPIOHS18
: GPIOHS18GPIOHS19
: GPIOHS19GPIOHS20
: GPIOHS20GPIOHS21
: GPIOHS21GPIOHS22
: GPIOHS22GPIOHS23
: GPIOHS23GPIOHS24
: GPIOHS24GPIOHS25
: GPIOHS25GPIOHS26
: GPIOHS26GPIOHS27
: GPIOHS27GPIOHS28
: GPIOHS28GPIOHS29
: GPIOHS29GPIOHS30
: GPIOHS30GPIOHS31
: GPIOHS31GPIO.IN
: 输入模式GPIO.OUT
: 输出模式GPIO.PULL_UP
: 上拉GPIO.PULL_DOWN
: 下拉GPIO.PULL_NONE
: 即不上拉也不下拉GPIO.IRQ_RISING
: 上升沿触发GPIO.IRQ_FALLING
:下降沿触发GPIO.IRQ_BOTH
: 上升沿和下降沿都触发
3.1. DEMO1: 点亮 LED
import utime
from Maix import GPIO
from board import board_info
from fpioa_manager import fm
fm.register(board_info.LED_R,fm.fpioa.GPIO0)
led_r=GPIO(GPIO.GPIO0,GPIO.OUT)
utime.sleep_ms(500)
led_r.value()
fm.unregister(board_info.LED_R,fm.fpioa.GPIO0)
3.2. DEMO2: 按键按下点亮 LED
import utime
from Maix import GPIO
from board import board_info
from fpioa_manager import fm
fm.register(board_info.LED_R,fm.fpioa.GPIO0)
led_b = GPIO(GPIO.GPIO0,GPIO.OUT)
led_b.value(1)
fm.register(board_info.BOOT_KEY, fm.fpioa.GPIOHS1)
key = GPIO(GPIO.GPIOHS1, GPIO.IN)
utime.sleep_ms(100)
while True:
if key.value() == 0: # 等待按键按下
led_b.value(0)
utime.sleep_ms(1000)
break
utime.sleep_ms(10)
led_b.value(1)
fm.unregister(board_info.LED_R,fm.fpioa.GPIOHS0)
fm.unregister(board_info.BOOT_KEY,fm.fpioa.GPIOHS1)
3.3. DEMO3: 在 3 秒内等待按键触发中断
import utime
from Maix import GPIO
from board import board_info
from fpioa_manager import fm
def test_irq(pin_num):
print("key", pin_num, "\n")
fm.register(board_info.BOOT_KEY, fm.fpioa.GPIOHS0)
key = GPIO(GPIO.GPIOHS0, GPIO.IN, GPIO.PULL_NONE)
utime.sleep_ms(100)
key.irq(test_irq, GPIO.IRQ_BOTH, GPIO.WAKEUP_NOT_SUPPORT,7)
utime.sleep_ms(3000) # 在 3 秒内等待触发
key.disirq() # 禁用中断
fm.unregister(board_info.BOOT_KEY,fm.fpioa.GPIOHS0)