立创·庐山派K230CanMV开发板的入门学习——GPIO和FPIOA

学习目标:立创·庐山派K230CanMV开发板的入门学习

第3课:立创·庐山派K230CanMV开发板的GPIO和FPIOA
1/2 :理论部分

学习内容:GPIO和FPIOA

1 本节介绍
📝本节您将学习如何通过控制开发板的GPIO引脚,实现对RGB灯和按键的控制。

🏆学习目标

1️⃣如何将GPIO引脚配置为输出模式,通过引脚电平来控制RGB灯的颜色变化。
2️⃣如何将GPIO引脚配置为输入模式,来检测按键是否按下或松开,去改变RGB灯的亮灭。

2 名词解释

在这里插入图片描述

INFO

  1. GPIO就是我们常说的IO引脚,它直接从芯片上引出,可以被设置为输入或输出信号。没有额外功能的GPIO主要用来控制简单的设备,比如点亮LED灯或者读取按键的状态。
  2. FPIOA是一种灵活的输入输出阵列,允许芯片对IO功能进行重新配置,类似用STM32上的复用引脚,也就是说不同的引脚可以根据需求重新定义。
  3. iomux就是引脚复用了,主要是配置物理PAD(管脚)的功能,由于soc功能多管脚(pads)少,多个功能共享同一个I/O管脚(pads),但是一个pads同一时间只能使用其中一个功能,所以需要IOMUX进行功能选择。IOMUX也叫FPIOA,Pin multiplexing,管脚功能选择等,在K230中,FPIOA就是iomux。
  4. 我们使用 MicroPython语法来控制K230的引脚,machine.Pin 模块用于控制微控制器的 GPIO 引脚。Pin类提供了访问和控制硬件引脚的功能,主要包括配置引脚模式,读写引脚状态等。

3 开发板引脚介绍
3.1 兼容树莓派40Pin排针引脚
在这里插入图片描述
排针处的GPIO还可复用为IIC,SPI,PWM,PDM,IIS等功能,这些IO电平都是3.3V的。

上方的I2C0和I2C1并没有标明实际的IO引脚,而且由于也要驱动摄像头,都已经有了内部上拉电阻了,大家在做外部扩展板或连接外部模块时,就可以不用再加上拉电阻了。这里为了方便大家,不用再去查看原理图,也进行一下GPIO号说明。

I2C0:

  • I2C0_SCL:BANK3_GPIO48
  • I2C0_SDA:BANK3_GPIO49

I2C1:

  • I2C1_SCL:BANK3_GPIO40
  • I2C1_SDA:BANK3_GPIO41

需要注意的是,这里的排针都没有ADC功能,也就是没有模拟功能,这里主要有两个考虑点:

  1. 考虑到K230的ADC仅支持最高1.8V的输入电压。为了避免用户在使用过程中意外将超过1.8V的电压输入ADC,从而导致芯片损坏,这里并未将ADC接口直接引出到标准的GPIO排针上

  2. K230的ADC引脚只能作为模拟输入,不能当做普通GPIO来使用。

结合以上两点本开发板采用了FPC排线座来引出ADC引脚,需要用到的时候用一个fpc转出来就可以了,这里印出来4个ADC通道,可以连接两个摇杆。

3.2 GH1.25座和大焊盘触点引出

在这里插入图片描述
左边是立创·庐山派-K230-CanMV开发板的正面图,右边是立创·庐山派-K230-CanMV开发板的背面图,分别用3个GH1.25-4P带锁接口和3组2.54mm间距的大触点焊盘接口对GPIO进行了引出。它们既可以被当做普通GPIO来控制,也可以被复用为串口(UART)来和外部设备进行通讯,其中串口2还可以被复用为IIC2。

串口0:

UART0_TXD:BANK3_GPIO38
UART0_RXD:BANK3_GPIO39

串口2:

UART2_TXD:BANK0_GPIO11
UART2_RXD:BANK0_GPIO12

串口3:
UART3_TXD:BANK4_GPIO50
UART3_RXD:BANK4_GPIO51

⚠️注意!

串口0默认被系统大核RT-Smart占用,作为调试串口使用,所以以上三个串口我们在运行CanMV固件时能用的只有串口2和串口3。

3.3 各引脚可复用功能
使用以下程序即可打印出各GPIO的复用功能,把程序复制到CanMV IDE K230里面然后执行就可以从串行终端中得到所有引脚的复用信息了,为了方便大家查阅,这里也一并以表格的形式放出来。

from machine import FPIOA
# 实例化FPIOA
fpioa = FPIOA()
# 打印所有引脚配置
fpioa.help()

在这里插入图片描述

4 GPIO 使用指南
4.1 使用FPIOA
FPIOA(灵活外设输入/输出阵列)是 K230 CanMV 系列微处理器提供的功能,允许用户灵活配置引脚来连接不同的外设。通过这个模块,我们可以轻松管理各种硬件接口。FPIOA 可以允许用户根据需要,将特定的引脚分配给不同的功能(比如 SPI、I2C、UART 等),每个引脚在同一时刻只能激活一种功能。使用 FPIOA,可以简化引脚管理,提升芯片的灵活性。

TIP

FPIOA 类位于 machine 模块中,可以像使用其他 Python 模块一样进行操作。如from machine import
FPIOA。

4.1.1 构造函数

fpioa = FPIOA()

4.1.2 设置引脚功能

fpioa.set_function(pin, func, ie=-1, oe=-1, pu=-1, pd=-1, st=-1, sl=-1, ds=-1)

参数:

  • pin: 要配置的引脚编号,范围:[0, 63]

  • func: 要分配给引脚的功能代码

    • 普通GPIO:FPIOA.GPIO0,FPIOA.GPIO1,FPIOA.GPIO2等,范围【0,63】
    • 串口:FPIOA.UART0_TXD,FPIOA.UART0_RXD,FPIOA.UART1_RXD等。
    • IIC:FPIOA.IIC0_SCL,FPIOA.IIC0_SDA,FPIOA.IIC1_SCL,FPIOA.IIC1_SDA等。
    • PWM: FPIOA.PWM0, FPIOA.PWM1, FPIOA.PWM2等。
    • 以及其他功能,更多详情请参考上方3.3章的 各引脚可复用功能。

4.1.3 引脚功能读取获取

fpioa.get_pin_func(pin)

参数:

pin: 要配置的引脚编号,范围:[0, 63]。

返回值:

返回引脚当前的功能号。

示列
当前返回的功能号还不是字符串,是标号,大家根据获取到的序号来比对下方的序号确定。 例如以下代码,获取38号引脚的当前功能:

from machine import FPIOA

print(fpioa.get_pin_func(38))

其运行结果打印出来的数值为166,结合下方表格,可知166代表当前38号引脚的功能为 UART0_TXD,串口0被RTSMART占用,主要用来调试。

TIP

使用以上函数可以查询指定引脚的当前功能。

fpioa.get_pin_num(func)

获取指定功能当前所在的引脚。

参数

  • func: 功能号

返回值

返回引脚号,如果未找到相应功能则返回None 。

例如以下代码,获取38号引脚的当前功能:

from machine import FPIOA

print(fpioa.get_pin_num(FPIOA.UART0_TXD))

其运行结果打印出来为38,标明当前UART0_TXD功能正在被38引脚使用。

TIP

使用以上函数可以查找想要功能的当前引脚。

4.1.4 帮助方法

fpioa.help([number, func=False])

打印引脚配置提示信息。

参数

  • number: 引脚号或功能号, 可选参数
  • func: 是否启用功能号查询,默认为 False

返回值

可能为以下三种:

  1. 所有引脚的配置信息(未设置 number)
  2. 指定引脚的详细配置信息(设置了 number,未设置 func 或设置为 False)
  3. 指定功能的所有可配置引脚号(设置了 number,并将 func 设置为 True)

示列
例如以下代码,获取38号引脚的当前功能:

from machine import FPIOA

print("---run fpioa.help(38) result:")
fpioa.help(38)
print("---run fpioa.help(38) result:")
fpioa.help(FPIOA.UART0_TXD,func=True)

其运行结果打印如下:

---run fpioa.help(38) result:
|pin num          |38                                                          |
|current config   |UART0_TXD,ie:0,oe:1,pd:0,pu:0,msc:0-3.3v,ds:7,st:1,sl:0,di:0|
|can be function  |GPIO38/UART0_TXD/RESV/QSPI1_CS0/HSYNC0/                     |
---run fpioa.help(FPIOA.UART0_TXD,func=True) result:
UART0_TXD function can be set to PIN38

4.2 使用machine.Pin

machine.Pin 类是 MicroPython 中用于控制输入/输出引脚的核心模块。通过该模块,我们可以轻松地管理微控制器上的 GPIO 引脚,进行基础的输入输出操作。

要使用 machine.Pin,首先需要导入该模块:

from machine import Pin

4.2.1 构造函数

pin = Pin(index, mode, pull=Pin.PULL_NONE, drive=7)

用于构造pin对象,可同时对引脚进行初始化。

参数

  • index: 引脚编号,范围为 [0, 63]。

  • mode: 引脚的模式,支持输入模式或输出模式。

    • Pin.OUT
  • Pin.IN

  • pull: 上下拉配置(可选),默认为 Pin.PULL_NONE

    • Pin.PULL_NONE
    • Pin.PULL_UP
    • Pin.PULL_DOWN
  • drive: 驱动能力配置(可选),默认值为 7。

    • 默认值为7范围0-15,数值越大IO的驱动能力越强,除了boot 0 1其他引脚都可以设置最大15。

⚠️注意!

K230的普通IO无法被配置为模拟输入输出功能,ADC功能有固定的引脚且最高只能输入1.8V,在板子上的物理引出形式为一个6P的FPC座子。

示例:

# 实例化Pin2为输出
pin = Pin(2, Pin.OUT, pull=Pin.PULL_NONE, drive=7)

4.2.2 初始化引脚

pin.init(mode, pull=Pin.PULL_NONE, drive=7)

用于初始化引脚的模式、上下拉配置及驱动能力。

参数

  • mode: 引脚的模式(输入或输出)。
    • Pin.OUT
    • Pin.IN
  • pull: 上下拉配置(可选),默认值为 Pin.PULL_NONE。
    • Pin.PULL_NONE
    • Pin.PULL_UP Pin.
    • PULL_DOWN
  • drive: 驱动能力(可选),默认值为 7。
    • 默认值为7,范围0-15,数值越大IO的驱动能力越强,除了boot 0 1其他引脚都可以设置最大15。
      示例:
# 初始化pin为输入
pin.init(Pin.IN, pull=Pin.PULL_UP, drive=7)

4.2.3 控制PIN
value 方法

pin.value([value])

获取引脚的输入电平值或设置引脚的输出电平。

参数

  • value: 输出值(可选),如果传递该参数则设置引脚输出为指定值。如果不传参则返回引脚的当前输入电平值。
    • 0:输出低电平。
    • 1:输出高电平。

返回值

返回空或当前引脚的输入电平值。
- 0:当前引脚输入为低电平
- 1:当前引脚输入为高电平

示例:

# 设置输出为高
pin.value(1)
# 设置输出为低
pin.value(0)
# 获取引脚输入电平
print(pin.value())

mode 方法

pin.mode([mode])

主要用来获取或设置引脚的模式。
参数

  • mode: 引脚模式(输入或输出),如果不传参则返回当前引脚的模式。
    • Pin.OUT
    • Pin.IN

返回值

返回空或当前引脚模式。

示例:

# 设置引脚为输入模式
pin.mode(Pin.IN)
# 设置引脚为输出模式
pin.mode(Pin.OUT)

pull 方法
pin.pull([pull])
获取或设置引脚的上下拉配置。

参数

pull: 上下拉配置(可选),如果不传参则返回当前上下拉配置。

返回值

返回空或当前引脚的上下拉配置。

drive 方法

pin.drive([drive])

获取或设置引脚的驱动能力。

参数

  • drive: 驱动能力(可选),如果不传参则返回当前驱动能力。

返回值

返回空或当前引脚的驱动能力。

on 方法

pin.on()

将引脚输出设置为高电平。

high 方法

pin.high()

将引脚输出设置为低电平。

4.2.4 中断模式

⚠️注意!

当前的CanMV固件还不支持将引脚配置为中断模式,请等待后续更新。

PIN综合示例

from machine import Pin
from machine import FPIOA

# 实例化FPIOA
fpioa = FPIOA()
# 设置Pin2为GPIO2
fpioa.set_function(2, FPIOA.GPIO2)

# 实例化Pin2为输出
pin = Pin(2, Pin.OUT, pull=Pin.PULL_NONE, drive=7)
# 设置输出为高
pin.value(1)
# pin.on()
# pin.high()
# 设置输出为低
pin.value(0)
# pin.off()
# pin.low()
# 初始化Pin2为输入
pin.init(Pin.IN, pull=Pin.PULL_UP, drive=7)
# 获取输入
print(pin.value())
# 设置模式
pin.mode(Pin.IN)
# 获取模式
print(pin.mode())
# 设置上下拉
pin.pull(Pin.PULL_NONE)
# 获取上下拉
print(pin.pull())
# 设置驱动能力
pin.drive(7)
# 获取驱动能力
print(pin.drive())

声明:
上述中关于立创・庐山派 K230-CanMV开发板的内容,均来源于立创开发板官方资料,包括但不限于硬件参数、功能特性、应用案例、开源资源等信息。
若您希望详细学习和了解立创・庐山派K230-CanMV开发板的更多技术细节、使用教程及相关资源,可访问立创开发板官方资料页面进行查阅,具体网址为:https://wiki.lckfb.com/zh-hans/lushan-pi-k230/


学习时间:7月19日

1. 本节介绍

原文内容:本节目标是通过控制GPIO引脚实现对RGB灯和按键的控制,具体包括将GPIO配置为输出模式控制RGB灯颜色变化,配置为输入模式检测按键状态以改变灯的亮灭。

感悟
这部分明确了学习的“落脚点”——从最基础的GPIO输入输出入手,连接硬件(灯、按键)与软件控制。对嵌入式开发而言,GPIO是“入门钥匙”,几乎所有外设(如传感器、执行器)的交互都离不开GPIO的基础操作。RGB灯和按键是最经典的入门案例,既能直观看到输出结果(灯亮灭/变色),又能理解输入检测(按键状态)的逻辑,非常适合建立“代码控制硬件”的认知。

2. 名词解释

原文内容

  • GPIO:通用输入输出引脚,可配置为输入/输出,控制简单设备(如LED、按键)。
  • FPIOA:灵活输入输出阵列,实现引脚功能复用(类似STM32的复用引脚),允许重新定义引脚功能。
  • iomux:即FPIOA,因SOC功能多但引脚少,需通过它选择引脚的具体功能(同一时间只能用一种功能)。
  • machine.Pin:MicroPython中控制GPIO的模块,提供配置模式、读写状态等功能。

感悟

  • GPIO的“通用性”是其核心价值——不需要复杂协议,直接通过高低电平交互,适合新手入门。
  • FPIOA(iomux)的设计体现了嵌入式硬件的“资源优化”思路:芯片引脚数量有限,但功能丰富(如UART、I2C、SPI等),通过复用可让一个引脚承担多种角色(但同一时间只能选一种),极大提升了硬件灵活性。例如,一个引脚既可以当普通GPIO控制LED,也可以切换为UART_TXD进行串口通信,这对开发板的扩展能力至关重要。
  • machine.Pin模块是“软件与硬件的桥梁”,MicroPython将底层硬件操作封装成简洁的API(如Pin()value()),降低了入门门槛,让开发者无需深入寄存器级编程就能控制硬件。

3. 开发板引脚介绍

3.1 兼容树莓派40Pin排针引脚

原文内容:40Pin排针的GPIO可复用为IIC、SPI等功能(电平3.3V),明确了I2C0和I2C1的具体引脚(BANK3_GPIO48/49、BANK3_GPIO40/41);未引出ADC功能,原因是ADC仅支持最高1.8V输入(避免用户误接高电压损坏芯片),且ADC引脚不能作为普通GPIO使用,需通过FPC排线座引出。

感悟

  • 兼容树莓派40Pin排针是开发板的“兼容性设计”,方便用户复用树莓派的扩展板,降低迁移成本。
  • I2C引脚的明确标注体现了“实用性”——开发者无需查原理图即可快速接线,减少调试障碍。
  • ADC未直接引出的设计体现了“硬件保护思维”:嵌入式开发中,“防呆”很重要,通过物理设计避免用户因操作失误(如接入5V电压)损坏芯片,这是硬件设计成熟度的体现。同时,ADC与普通GPIO的功能隔离(ADC不能当GPIO)也提醒开发者:硬件引脚有“专属分工”,不能随意混用。
3.2 GH1.25座和大焊盘触点引出

原文核心内容:通过GH1.25-4P接口和大焊盘引出GPIO,可复用为串口(UART),其中串口2还可复用为IIC2;明确了串口0(BANK3_GPIO38/39)、串口2(BANK0_GPIO11/12)、串口3(BANK4_GPIO50/51)的引脚,且串口0被系统大核RT-Smart占用,CanMV固件仅能用串口2和3。

感悟

  • 多方式引出引脚(排针、接口、焊盘)是为了适应不同场景:排针适合插线,焊盘适合焊接固定,体现了开发板的“场景适配性”。
  • 串口0被占用的说明是“资源冲突提示”:嵌入式系统中,部分硬件资源会被系统内核或底层驱动占用,开发者需提前了解,避免因“重复使用”导致功能异常。这也提醒我们:使用外设前需确认资源是否可用,是开发中的重要习惯。
3.3 各引脚可复用功能

原文内容:通过fpioa.help()代码可打印所有引脚的复用功能,方便查询。

解读与感悟

  • 提供fpioa.help()工具体现了“开发者友好”的设计:硬件引脚功能复杂,手动记忆不现实,通过代码动态查询可快速获取信息,大幅提升开发效率。
  • 实际开发中,引脚复用是“双刃剑”:灵活但需注意冲突(同一引脚不能同时用两种功能)。例如,若将某引脚配置为UART_TXD,就不能同时作为GPIO控制LED,需提前规划引脚功能分配。

4. GPIO 使用指南

4.1 使用FPIOA

原文内容

  • 构造函数:fpioa = FPIOA()实例化对象。
  • 设置引脚功能:fpioa.set_function(pin, func, ...),参数包括引脚号、功能代码(如GPIO、UART、IIC等)。
  • 读取功能:get_pin_func(pin)获取引脚当前功能,get_pin_num(func)获取功能对应的引脚。
  • 帮助方法:fpioa.help()打印引脚配置信息。

感悟

  • FPIOA的操作逻辑是“先配置,后使用”:必须先通过set_function为引脚分配功能(如将Pin2设为GPIO2),才能用machine.Pin控制,这是硬件操作的“前置步骤”,不可省略。
  • 功能代码的设计(如FPIOA.UART0_TXDFPIOA.GPIO0)将底层寄存器值封装为可读性强的常量,降低了记忆成本,体现了MicroPython的“易用性”。
  • get_pin_funcget_pin_num是“调试利器”:当开发中遇到引脚功能异常时,可通过这两个方法确认当前配置,快速定位是否因功能冲突导致问题。
4.2 使用machine.Pin

原文内容

  • 构造函数:pin = Pin(index, mode, pull=Pin.PULL_NONE, drive=7),初始化引脚为输入/输出模式,配置上下拉和驱动能力。
  • 初始化方法:pin.init(...)重新配置引脚参数。
  • 控制方法:value()读写电平,mode()设置/获取模式,pull()设置/获取上下拉,drive()设置/获取驱动能力,on()/high()输出高电平,off()/low()输出低电平。
  • 限制:当前固件不支持中断模式。

感悟

  • 构造函数和init方法的参数设计(模式、上下拉、驱动能力)覆盖了GPIO的核心配置需求:
    • 上下拉电阻(pull)对输入检测至关重要,例如按键检测通常需上拉(未按下时为高电平,按下时接地为低电平),避免引脚悬空导致状态不稳定。
    • 驱动能力(drive)影响输出电流:驱动LED时可能需要较高驱动能力(数值大),而驱动敏感电路时需较低能力,体现了硬件控制的“精细化”。
  • 电平控制方法(value()on()等)简洁直观,符合“所见即所得”的逻辑,适合新手快速上手。
  • 中断模式暂不支持的说明是“功能边界提示”:开发时需根据固件能力调整方案,例如用轮询(循环读取value())替代中断检测按键,这也是嵌入式开发中“灵活适配”的体现。

总结

本文围绕K230CanMV开发板的GPIO和FPIOA展开,从概念到实操,层层递进。核心逻辑是:通过FPIOA实现引脚功能的灵活分配,再通过machine.Pin模块完成GPIO的输入输出控制。学习时需注意:硬件资源的复用与冲突、引脚配置的前置步骤、实际场景中参数(如上下拉、驱动能力)的合理选择。这些内容不仅是操作K230的基础,更是理解嵌入式系统“软件控制硬件”逻辑的关键,为后续学习更复杂的外设(如I2C传感器、SPI屏幕)奠定了基础。


学习产出:

  • 了解并学习k230的GPIO和FPIOA
  • 理解并总结感悟
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芸翳&Camellia

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值