[TOC]

K210点灯

一、硬件平台

MAIX Bit开发板

IMG_20210211_161250

二、软件平台

MAIXPY IDE

20210211161417

三、程序编写

K210的GPIO编程方式

K210与我们以往的单片机GPIO编程区别较大,传统GPIO编程直接对IO口进行编程,配置模式,确认输入输出,而K210则拥有一个可编程IO口阵列- FPIOA (现场可编程 IO 阵列),支持每个外设随意映射到任意引脚, 使用 FPIOA 功能来实现或者通过fpioa_manager(简称fm)来管理,这两个功能的API如下:

1. fpioa_manager

该模块用于注册芯片内部功能和引脚,帮助用户管理内部功能和引脚映射关系的功能模块。使用映射管理首先声明,代码如下

1
from fpioa_manager import fm

声明之后则可以在程序主体内进行映射函数调用,主要使用如下两个函数

  1. 映射关联函数—register(pin, func, force=True)
  • pin: 功能映射引脚

  • function : 芯片功能

  • force: 强制分配,如果为True,则可以多次对同一个引脚注册;False则不允许同一引脚多次注册。默认为True是为了方便IDE多次运行程序使用

注明:设置引脚(pin)对应的外设功能(func),默认启用强制绑定参数(force=True),它将强制更换指定的引脚功能,如果发现存在上一个绑定的引脚,则会发出一个警告,但不影响代码继续执行。如果设置 force=False ,则会在 register 发现硬件功能已经被使用了,此时就会弹出异常,方便深度开发的时候不清楚 GPIO/HS 的分配情况,常见于运行某个代码的按键在访问某些功能的时候不能使用了的场合。

1
fm.register(11, fm.fpioa.GPIO0, force=True)	#force未输入时默认为True
  1. 映射解除关联函数—unregister(pin)

    释放引脚上的硬件功能

1
fm.unregister(11)

2. FPIOA的模块内的函数

使用先调用包:

1
from Maix import FPIOA
  1. 调用函数set_function(pin, func)

设置引脚对应的外设功能, 即引脚映射

参数

  • pin: 引脚编号,取值 [0, 47], 具体的引脚连接请看电路图, 也可以使用 board_info. 然后按 TAB 按键补全来获得板子的常用引脚,比如 board_info.LED_G
  • func: 外设功能,传一个整型值,可以通过 fm.fpioa.help()或者查本页末尾的附录外设表得到
  1. 获取功能当前映射引脚get_Pin_num(func)

获取外设映射到哪个引脚上了

参数

  • func: 外设功能,传一个整型值,可以通过 fm.fpioa.help()或者查本页末尾的附录外设表得到

3. GPIO引脚映射功能

K210上有高速 GPIO(GPIOHS) 和通用 GPIO(GPIO)在 K210 上, GPIO 有一下特征:

  • 高速 GPIO:

    高速 GPIO 为 GPIOHS 共 32 个。具有如下特点:

    • 可配置输入输出信号
    • 每个 IO 具有独立中断源
    • 中断支持边沿触发和电平触发
    • 每个 IO 可以分配到 FPIOA 上 48 个管脚之一
    • 可配置上下拉,或者高阻
  • 通用 GPIO:

    通用 GPIO 共 8 个,具有如下特点:

    • 8 个 IO 使用一个中断源
    • 可配置输入输出信号
    • 可配置触发 IO 总中断,边沿触发和电平触发
    • 每个 IO 可以分配到 FPIOA 上 48 个管脚之一

以下 GPIOHS 默认已经被使用, 程序中如非必要尽量不要使用:

GPIOHS 功能 描述
GPIOHS5 LCD_DC LCD 读写信号引脚
GPIOHS4 LCD_RST LCD 复位芯片脚
GPIOHS29 SD_CS SD 卡 SPI 片选
GPIOHS28 MIC_LED_CLK SK9822_DAT
GPIOHS27 MIC_LED_DATA SK9822_CLK

GPIO调用API:

1. 构造函数
1
name = GPIO(ID, MODE, PULL, VALUE)

调用此函数返回一个初始化对象,用于之后的操作

  • ID: 使用的 GPIO 引脚(使用 GPIO 里带的常量来指定,不能在范围外)

  • MODE: GPIO模式

    • GPIO.IN就是输入模式

    • GPIO.OUT就是输出模式

  • PULL: GPIO上下拉模式

    • GPIO.PULL_UP 上拉

    • GPIO.PULL_DOWN 下拉

    • GPIO.PULL_NONE 即不上拉也不下拉

  • VALUE:初始上电的IO口电平值

2. value

修改/读取 GPIO 引脚状态

1
GPIO.value([value])
  • [value]: 可选参数,如果此参数不为空,则设置当前 GPIO 的引脚状态,如果 [value] 参数不为空,则返回当前 GPIO 引脚状态
3. irq

配置一个中断处理程序,当 pin 的触发源处于活动状态时调用它。如果管脚模式为 pin.in,则触发源是管脚上的外部值。

1
GPIO.irq(CALLBACK_FUNC,TRIGGER_CONDITION,GPIO.WAKEUP_NOT_SUPPORT,PRORITY)
  • CALLBACK_FUNC:中断回调函数,当中断触发的时候被调用

  • TRIGGER_CONDITION:GPIO 引脚的中断触发模式

    • GPIO.IRQ_RISING 上升沿触发

    • GPIO.IRQ_FALLING 下降沿触发

    • GPIO.IRQ_BOTH 上升沿和下降沿都触发

  • PRORITY:中断优先级

4. disirq

关闭中断

1
GPIO.disirq()
5. mode

设置 GPIO 输入输出模式

1
GPIO.mode(MODE)
  • MODE可选模式如下

    GPIO.IN 输入模式

    GPIO.PULL_UP 上拉输入模式

    GPIO.PULL_DOWN 下拉输入模式

    GPIO.OUT 输出模式

MAIX BIT引脚原理图

LED引脚查询MAIX BIT LED的原理图如下

20210211200136

我们使用到的是IO_12\13\14三个引脚

程序编写

打开IDE编译环境新建文件,开发板与电脑连接

20210212114301

点击IDE右下角连接标志,选择COM口连接MAIX BIT

20210212114420

连接后我们开始编写程序,程序基于MicroPython来编写,需要一定的Python基础,语法简单,但代码比较赘余,在一般情况下使用足够

首先我们确定使用到的模块,声明调用,代码如下:

1
2
3
import utime
from Maix import GPIO
from fpioa_manager import fm

utimes:延时模块

GPIO:IO口模块

fm:映射管理模块

然后编写主循环,分别映射三个LED IO口到通用GPIO,配置GPIO模式返回一个LED对象,对LED进行赋值,延时500ms,代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
while True:
fm.register(13,fm.fpioa.GPIO0)
fm.register(12,fm.fpioa.GPIO1)
fm.register(14,fm.fpioa.GPIO2)
led_r=GPIO(GPIO.GPIO0,GPIO.OUT)
led_g=GPIO(GPIO.GPIO1,GPIO.OUT)
led_b=GPIO(GPIO.GPIO2,GPIO.OUT)
utime.sleep_ms(500)
led_r.value(1)
led_g.value(1)
led_b.value(1)
utime.sleep_ms(500)
led_r.value(0)
led_g.value(0)
led_b.value(0)

四、程序下载

点击左下角测试运行代码,观察现象

20210212123639

现象没问题点击工具-选择保存脚本-等待下载完成,从新上电进行测试

20210212123832

五、实验现象

RGB 三色同时闪亮

_-977518850_IMG_20210212_124025_1613104826000_xg_

六、源码仓库

github

七、附录

引脚映射表

外设功能(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

wechat