庐山派K230学习日记3 外设模块GPIO

GPIO和FPIOA

1 本节介绍​

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

🏆学习目标

1️⃣如何将GPIO引脚配置为输出模式,通过引脚电平来控制RGB灯的颜色变化。

2️⃣如何将GPIO引脚配置为输入模式,来检测按键是否按下或松开,去改变RGB灯的亮灭。

2 名词解释​

名词说明
GPIOGeneral Purpose Input Output (通用输入/输出)
FPIOAField Programmable Input and Output Array(现场可编程 IO 阵列)
iomuxPin multiplexing(管脚功能选择)
Pin 模块在MicroPython 中用于控制设备的GPIO 引脚。
  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 类提供了访问和控制硬件引脚的功能,主要包括配置引脚模式,读写引脚状态等

 CanMV-K230 快速入门指南 — K230 CanMV

3 开发板引脚介绍​

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

图 8

排针处的GPIO还可复用为IIC,SPI,PWM,PDM,IIS等功能,这些IO电平都是3.3V的。

上方的I2C0I2C1并没有标明实际的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座和大焊盘触点引出

图 0

左边是立创·庐山派-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()

图 2

查看全部引脚的可复用功能

pincur funccan be func
0GPIO0GPIO0/BOOT0/RESV/
1GPIO1GPIO1/BOOT1/RESV/
2JTAG_TCKGPIO2/JTAG_TCK/PULSE_CNTR0/RESV/
3JTAG_TDIGPIO3/JTAG_TDI/PULSE_CNTR1/UART1_TXD/RESV/
4JTAG_TDOGPIO4/JTAG_TDO/PULSE_CNTR2/UART1_RXD/RESV/
5UART2_TXDGPIO5/JTAG_TMS/PULSE_CNTR3/UART2_TXD/RESV/
6UART2_RXDGPIO6/JTAG_RST/PULSE_CNTR4/UART2_RXD/RESV/
7PWM2GPIO7/PWM2/IIC4_SCL/RESV/RESV/
8PWM3GPIO8/PWM3/IIC4_SDA/RESV/RESV/
9PWM4GPIO9/PWM4/UART1_TXD/IIC1_SCL/RESV/
10CTRL_IN_3DGPIO10/CTRL_IN_3D/UART1_RXD/IIC1_SDA/RESV/
11CTRL_O1_3DGPIO11/CTRL_O1_3D/UART2_TXD/IIC2_SCL/RESV/
12CTRL_O2_3DGPIO12/CTRL_O2_3D/UART2_RXD/IIC2_SDA/RESV/
13M_CLK1GPIO13/M_CLK1/RESV/
14OSPI_CSGPIO14/OSPI_CS/RESV/QSPI0_CS0/RESV/
15OSPI_CLKGPIO15/OSPI_CLK/RESV/QSPI0_CLK/RESV/
16OSPI_D0GPIO16/OSPI_D0/QSPI1_CS4/QSPI0_D0/RESV/
17OSPI_D1GPIO17/OSPI_D1/QSPI1_CS3/QSPI0_D1/RESV/
18OSPI_D2GPIO18/OSPI_D2/QSPI1_CS2/QSPI0_D2/RESV/
19OSPI_D3GPIO19/OSPI_D3/QSPI1_CS1/QSPI0_D3/RESV/
20GPIO20GPIO20/OSPI_D4/QSPI1_CS0/PULSE_CNTR0/RESV/
21OSPI_D5GPIO21/OSPI_D5/QSPI1_CLK/PULSE_CNTR1/RESV/
22OSPI_D6GPIO22/OSPI_D6/QSPI1_D0/PULSE_CNTR2/RESV/
23GPIO23GPIO23/OSPI_D7/QSPI1_D1/PULSE_CNTR3/RESV/
24GPIO24GPIO24/OSPI_DQS/QSPI1_D2/PULSE_CNTR4/RESV/
25GPIO25GPIO25/PWM5/QSPI1_D3/PULSE_CNTR5/RESV/
26PDM_CLKGPIO26/MMC1_CLK/RESV/PDM_CLK/
27GPIO27GPIO27/MMC1_CMD/PULSE_CNTR5/PDM_IN0/RESV/
28GPIO28GPIO28/MMC1_D0/UART3_TXD/PDM_IN1/RESV/
29GPIO29GPIO29/MMC1_D1/UART3_RXD/CTRL_IN_3D/RESV/
30GPIO30GPIO30/MMC1_D2/UART3_RTS/CTRL_O1_3D/RESV/
31GPIO31GPIO31/MMC1_D3/UART3_CTS/CTRL_O2_3D/RESV/
32IIS_CLKGPIO32/IIC0_SCL/IIS_CLK/UART3_TXD/RESV/
33IIS_WSGPIO33/IIC0_SDA/IIS_WS/UART3_RXD/RESV/
34IIS_D_IN0GPIO34/IIC1_SCL/IIS_D_IN0/PDM_IN3/UART3_RTS/
35IIS_D_OUT0GPIO35/IIC1_SDA/IIS_D_OUT0/PDM_IN1/UART3_CTS/
36GPIO36GPIO36/IIC3_SCL/IIS_D_IN1/PDM_IN2/UART4_TXD/
37GPIO37GPIO37/IIC3_SDA/IIS_D_OUT1/PDM_IN0/UART4_RXD/
38UART0_TXDGPIO38/UART0_TXD/RESV/QSPI1_CS0/HSYNC0/
39UART0_RXDGPIO39/UART0_RXD/RESV/QSPI1_CLK/VSYNC0/
40IIC1_SCLGPIO40/UART1_TXD/IIC1_SCL/QSPI1_D0/RESV/
41IIC1_SDAGPIO41/UART1_RXD/IIC1_SDA/QSPI1_D1/RESV/
42GPIO42GPIO42/UART1_RTS/PWM0/QSPI1_D2/RESV/
43GPIO43GPIO43/UART1_CTS/PWM1/QSPI1_D3/RESV/
44IIC3_SCLGPIO44/UART2_TXD/IIC3_SCL/RESV/SPI2AXI_CK/
45IIC3_SDAGPIO45/UART2_RXD/IIC3_SDA/RESV/SPI2AXI_CS/
46IIC4_SCLGPIO46/UART2_RTS/PWM2/IIC4_SCL/RESV/
47IIC4_SDAGPIO47/UART2_CTS/PWM3/IIC4_SDA/RESV/
48IIC0_SCLGPIO48/UART4_TXD/RESV/IIC0_SCL/SPI2AXI_DI/
49IIC0_SDAGPIO49/UART4_RXD/RESV/IIC0_SDA/SPI2AXI_DO/
50UART3_TXDGPIO50/UART3_TXD/IIC2_SCL/QSPI0_CS4/RESV/
51UART3_RXDGPIO51/UART3_RXD/IIC2_SDA/QSPI0_CS3/RESV/
52GPIO52GPIO52/UART3_RTS/PWM4/IIC3_SCL/RESV/
53GPIO53GPIO53/UART3_CTS/PWM5/IIC3_SDA/
54MMC1_CMDGPIO54/QSPI0_CS0/MMC1_CMD/PWM0/RESV/
55MMC1_CLKGPIO55/QSPI0_CLK/MMC1_CLK/PWM1/RESV/
56MMC1_D0GPIO56/QSPI0_D0/MMC1_D0/PWM2/RESV/
57MMC1_D1GPIO57/QSPI0_D1/MMC1_D1/PWM3/RESV/
58MMC1_D2GPIO58/QSPI0_D2/MMC1_D2/PWM4/RESV/
59MMC1_D3GPIO59/QSPI0_D3/MMC1_D3/PWM5/
60GPIO60GPIO60/PWM0/IIC0_SCL/QSPI0_CS2/HSYNC1/
61GPIO61GPIO61/PWM1/IIC0_SDA/QSPI0_CS1/VSYNC1/
62M_CLK2GPIO62/M_CLK2/UART3_DE/RESV/
63M_CLK3GPIO63/M_CLK3/UART3_RE/RESV/

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.GPIO0FPIOA.GPIO1FPIOA.GPIO2等,范围【0,63】
    • 串口:FPIOA.UART0_TXDFPIOA.UART0_RXDFPIOA.UART1_RXD等。
    • IIC:FPIOA.IIC0_SCLFPIOA.IIC0_SDAFPIOA.IIC1_SCLFPIOA.IIC1_SDA等。
    • PWM: FPIOA.PWM0, FPIOA.PWM1, FPIOA.PWM2等。
    • 以及其他功能,更多详情请参考上方3.3章的 各引脚可复用功能

set_function其他可选参数

  • ie: 输入使能,可选参数(-1为默认值,0为不使能,1为使能)
  • oe: 输出使能,可选参数(-1为默认值,0为不使能,1为使能)
  • pu: 上拉使能,可选参数(-1为默认值,0为不使能,1为使能)
  • pd: 下拉使能,可选参数(-1为默认值,0为不使能,1为使能)
  • st: st 使能,可选参数(-1为默认值,0为不使能,1为使能)
    • 输入施密特触发器控制使能,使能后提高信号的干扰抵抗能力和改善信号的完整性,简单来说,施密特触发器是一种具有滞回特性的电子电路,其输出只在输入信号超过设定的正向或负向阈值时改变,提高了对噪声的抗干扰能力。
  • sl: sl 使能,可选参数(-1为默认值,0为不使能,1为使能)
    • 目前已经不再使用,建议直接设置为-1.
  • ds: 驱动电流能力,可选参数(-1为默认值)
    • 默认值为7,范围0-15,数值越大IO的驱动能力越强,除了boot 0 1其他引脚都可以设置最大15。

更多关于K230 IO引脚的信息,设计最大电压,施密特触发器高低阈值,上下拉电阻阻值,各IO驱动电流能力:

图 6

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被RT SMART占用,主要用来调试。

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

引脚功能序号表: 
序号功能名
0GPIO0
1GPIO1
2GPIO2
3GPIO3
4GPIO4
5GPIO5
6GPIO6
7GPIO7
8GPIO8
9GPIO9
10GPIO10
11GPIO11
12GPIO12
13GPIO13
14GPIO14
15GPIO15
16GPIO16
17GPIO17
18GPIO18
19GPIO19
20GPIO20
21GPIO21
22GPIO22
23GPIO23
24GPIO24
25GPIO25
26GPIO26
27GPIO27
28GPIO28
29GPIO29
30GPIO30
31GPIO31
32GPIO32
33GPIO33
34GPIO34
35GPIO35
36GPIO36
37GPIO37
38GPIO38
39GPIO39
40GPIO40
41GPIO41
42GPIO42
43GPIO43
44GPIO44
45GPIO45
46GPIO46
47GPIO47
48GPIO48
49GPIO49
50GPIO50
51GPIO51
52GPIO52
53GPIO53
54GPIO54
55GPIO55
56GPIO56
57GPIO57
58GPIO58
59GPIO59
60GPIO60
61GPIO61
62GPIO62
63GPIO63
64BOOT0
65BOOT1
66CI0
67CI1
68CI2
69CI3
70CO0
71CO1
72CO2
73CO3
74DI0
75DI1
76DI2
77DI3
78DO0
79DO1
80DO2
81DO3
82HSYNC0
83HSYNC1
84IIC0_SCL
85IIC0_SDA
86IIC1_SCL
87IIC1_SDA
88IIC2_SCL
89IIC2_SDA
90IIC3_SCL
91IIC3_SDA
92IIC4_SCL
93IIC4_SDA
94IIS_CLK
95IIS_D_IN0_PDM_IN3
96IIS_D_IN1_PDM_IN2
97IIS_D_OUT0_PDM_IN1
98IIS_D_OUT1_PDM_IN0
99IIS_WS
100JTAG_RST
101JTAG_TCK
102JTAG_TDI
103JTAG_TDO
104JTAG_TMS
105M_CLK1
106M_CLK2
107M_CLK3
108MMC1_CLK
109MMC1_CMD
110MMC1_D0
111MMC1_D1
112MMC1_D2
113MMC1_D3
114OSPI_CLK
115OSPI_CS
116OSPI_D0
117OSPI_D1
118OSPI_D2
119OSPI_D3
120OSPI_D4
121OSPI_D5
122OSPI_D6
123OSPI_D7
124OSPI_DQS
125PDM_IN0
126PDM_IN1
127PDM_IN2
128PDM_IN3
129PULSE_CNTR0
130PULSE_CNTR1
131PULSE_CNTR2
132PULSE_CNTR3
133PULSE_CNTR4
134PULSE_CNTR5
135PWM0
136PWM1
137PWM2
138PWM3
139PWM4
140PWM5
141QSPI0_CLK
142QSPI0_CS0
143QSPI0_CS1
144QSPI0_CS2
145QSPI0_CS3
146QSPI0_CS4
147QSPI0_D0
148QSPI0_D1
149QSPI0_D2
150QSPI0_D3
151QSPI1_CLK
152QSPI1_CS0
153QSPI1_CS1
154QSPI1_CS2
155QSPI1_CS3
156QSPI1_CS4
157QSPI1_D0
158QSPI1_D1
159QSPI1_D2
160QSPI1_D3
161SPI2AXI_CK
162SPI2AXI_CS
163SPI2AXI_DI
164SPI2AXI_DO
165UART0_RXD
166UART0_TXD
167UART1_CTS
168UART1_RTS
169UART1_RXD
170UART1_TXD
171UART2_CTS
172UART2_RTS
173UART2_RXD
174UART2_TXD
175UART3_CTS
176UART3_DE
177UART3_RE
178UART3_RTS
179UART3_RXD
180UART3_TXD
181UART4_RXD
182UART4_TXD
183PDM_CLK
184VSYNC0
185VSYNC1
186CTRL_IN_3D
187CTRL_O1_3D
188CTRL_O2_3D
189TEST_PIN0
190TEST_PIN1
191TEST_PIN2
192TEST_PIN3
193TEST_PIN4
194TEST_PIN5
195TEST_PIN6
196TEST_PIN7
197TEST_PIN8
198TEST_PIN9
199TEST_PIN10
200TEST_PIN11
201TEST_PIN12
202TEST_PIN13
203TEST_PIN14
204TEST_PIN15
205TEST_PIN16
206TEST_PIN17
207TEST_PIN18
208TEST_PIN19
209TEST_PIN20
210TEST_PIN21
211TEST_PIN22
212TEST_PIN23
213TEST_PIN24
214TEST_PIN25
215TEST_PIN26
216TEST_PIN27
217TEST_PIN28
218TEST_PIN29
219TEST_PIN30
220TEST_PIN31
221FUNC_MAX
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座子。

更多关于K230 IO引脚的信息,设计最大电压,施密特触发器高低阈值,上下拉电阻阻值,各IO驱动电流能力等。

图 6

示例:

# 实例化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()

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

off 方法​
pin.off()

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

high 方法​
pin.high()

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

low 方法​
pin.low()

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

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())

5 点亮板载RGB灯​

如果说学C语言的第一个程序是Hello world!,那么我们学习嵌入式板子的第一个程序就应该是点亮一个LED灯。RGB灯其实就是一种由三个LED灯组成的灯,由三个基本颜色的 LED 组成:红色、绿色和蓝色。通过调整这三种颜色的亮度,我们可以混合出几乎任何颜色,不过庐山派CanMV开发板的这个RGB灯为了节约多功能的IO,并没有连接到具有PWM功能的IO上,所以只能控制个LED灯的亮灭而改变不了亮度。初学时我们可以只点亮其中的一个灯。

5.1 LED 灯结构组成​

LED 灯(发光二极管)是一种半导体光源,主要结构包括以下部分:

  • 外壳:通常由塑料或玻璃制成,用于保护内部元件。
  • 发光材料:LED 最核心的部分,由特殊半导体材料制成,例如:常见的 InGaN(氮化铟镓)或 AlInGaP(铝铟镓磷)。
  • 芯片:用于产生光的发光二极管芯片。
  • 引线:提供电连接的金属引线。
  • 焊点:将LED 芯片与引线连接在一起的焊接点。
  • 电极:负责连接半导体材料与外部电路,通常由金属制成。
  • 反射腔:用于增强发光效果的一个结构,将发出的光反射到正面。

5.2 LED 灯发光原理​

LED(发光二极管)发光原理基于半导体特性。在半导体中,存在着两类载流子:电子(n型半导体)和空穴(p型半导体)。当n型与p型半导体材料接触时,会在交界处形成一个层结。当施加适当的电压时,层结中空穴和电子可重组并释放能量。这个能量以光子的形式释放出来,产生光。

5.3 LED 灯驱动原理​

LED 驱动指的是通过稳定的电源为 LED 提供合适的电流和电压,使其正常工作点亮。LED 驱动方式主要有恒流和恒压两种。限定电流的恒流驱动是最常见的方式,因为 LED 灯对电流敏感,电流大于其额定值可能导致损坏。恒流驱动保证了稳定的电流,从而确保了 LED 安全。 LED 灯的驱动比较简单,只需要给将对应的正负极接到单片机的正负极即可驱动。LED的接法也分有两种,灌入电流和输出电流。

TIP

在庐山派开发板中,我们使用的为共阳级的RGB灯,详情请看后面的原理图。

  • 灌入电流指的是LED的供电电流是由外部提供电流,将电流灌入我们的MCU
  • 输出电流指的是由MCU提供电压电流,将电流输出给LED;如果使用 MCU的GPIO 直接驱动 LED,则驱动能力较弱,可能无法提供足够的电流驱动 LED。
  • 需要注意的 是 LED 灯的颜色不同,对应的电压也不同。电流不可过大,通常需要接入220欧姆到10K欧姆左右的限流电阻,限流电阻的阻值越大,LED的亮度越暗。

5.4 RGB灯原理图​

结合之前介绍,我们已经知道了LED(发光二极管)灯通常只有一个发光二极管,它能产生单一颜色的光。比如,一个红色 LED 只会发出红光,而一个蓝色 LED 只会发出蓝光。而本庐山派开发板和泰山派一样,板载了一个RGB灯,他是红色、绿色和蓝色 LED 灯的组合,可以单独控制每个 LED 的亮灭。

那么我们先来看一下开发板上的RGB灯分别连接的是哪些引脚,看一下原理图:

图 3

这里的LED1就是我们需要控制的用户指示灯,结合左上角的短接符我们可以了解到以下信息:

  • 这是一个共阳级的RGB灯,当对应颜色引脚为低电平时对应引脚就会亮
  • 这个RGB灯内部有三个不同颜色的灯珠,红灯绿灯蓝灯分别接到了GPIO62GPIO20GPIO63上面。

5.5 基础点灯试验​

接下来我们实现一个让RGB灯里面的红灯每1秒闪烁一次的程序:

from machine import Pin
from machine import FPIOA
import time

# 创建FPIOA对象,用于初始化引脚功能配置
fpioa = FPIOA()

# 设置引脚功能,将指定的引脚配置为普通GPIO功能,
fpioa.set_function(62,FPIOA.GPIO62)
fpioa.set_function(20,FPIOA.GPIO20)
fpioa.set_function(63,FPIOA.GPIO63)

# 实例化Pin62, Pin20, Pin63为输出,分别用于控制红、绿、蓝三个LED灯
LED_R = Pin(62, Pin.OUT, pull=Pin.PULL_NONE, drive=7)  # 红灯
LED_G = Pin(20, Pin.OUT, pull=Pin.PULL_NONE, drive=7)  # 绿灯
LED_B = Pin(63, Pin.OUT, pull=Pin.PULL_NONE, drive=7)  # 蓝灯

# 板载RGB灯是共阳结构,设置引脚为高电平时关闭灯,低电平时点亮灯
# 初始化时先关闭所有LED灯
LED_R.high()  # 关闭红灯
LED_G.high()  # 关闭绿灯
LED_B.high()  # 关闭蓝灯

# 基础点灯试验:选择一个LED灯并让其闪烁
# 默认选择红色LED灯,后续可以通过变量改变需要控制的灯
LED = LED_R  # 当前控制的LED为红色LED

while True:
    LED.low()   # 点亮当前选择的LED
    time.sleep(0.5)  # 等待0.5秒
    LED.high()  # 熄灭当前选择的LED
    time.sleep(0.5)  # 等待0.5秒from machine import Pin

在上述程序中,首先从machine导入了 Pin 和FPIOA模块,用来初始化和控制K230的GPIO引脚,也导入了 time 模块,来调用时间延迟函数

将对应LED灯的GPIO初始化为普通GPIO后实例化了这三个GPIO引脚,分别用于控制RGB灯的红、绿和蓝三种颜色的LED灯,都指定了对应的引脚号,输出模式,不使用上下拉,输出驱动能力。

接下来初始化了LED灯的状态,通过让每个灯的控制引脚变为高电平来熄灭所有LED灯。

然后定义了一个变量 LED,初始设置为控制红色LED。这个小细节在后面可以轻松改变 LED 变量为其他颜色的灯(比如如 LED_G 或 LED_B),就可以控制不同的RGB颜色来闪烁了。

比如这里改成LED_G,那点亮的就是绿色LED灯了:

LED = LED_G  # 那当前控制的LED为绿色LED

改成LED_G,那点亮的就是蓝色LED了:

LED = LED_B  # 那当前控制的LED为蓝色LED

最后就是一段无限循环的代码,来控制LED变量所选RGB颜色的闪烁效果。首先用LED.low()方法点亮,然后使用time.sleep(0.5)延时0.5秒,再通过 LED.high() 熄灭LED,再次等待0.5秒后继续循环。

5.6 点亮7种不同颜色的RGB灯​

接下来我们实现一个让RGB灯组合成七种不同的颜色然后每1秒闪烁一次的程序:

# 点亮7种不同颜色的RGB灯
from machine import Pin
from machine import FPIOA
import time

# 创建FPIOA对象,用于初始化引脚功能配置
fpioa = FPIOA()

# 设置引脚功能,将指定的引脚配置为普通GPIO功能,
fpioa.set_function(62,FPIOA.GPIO62)
fpioa.set_function(20,FPIOA.GPIO20)
fpioa.set_function(63,FPIOA.GPIO63)

# 实例化Pin62, Pin20, Pin63为输出,分别控制红、绿、蓝灯
LED_R = Pin(62, Pin.OUT, pull=Pin.PULL_NONE, drive=7)
LED_G = Pin(20, Pin.OUT, pull=Pin.PULL_NONE, drive=7)
LED_B = Pin(63, Pin.OUT, pull=Pin.PULL_NONE, drive=7)

def set_color(r, g, b):
    """设置RGB灯的颜色,使用Pin.high()和Pin.low()控制"""
    if r == 0:
        LED_R.low()  # 红灯亮
    else:
        LED_R.high()  # 红灯灭

    if g == 0:
        LED_G.low()  # 绿灯亮
    else:
        LED_G.high()  # 绿灯灭

    if b == 0:
        LED_B.low()  # 蓝灯亮
    else:
        LED_B.high()  # 蓝灯灭

def blink_color(r, g, b, delay):
    """设置颜色并让灯亮一段时间后熄灭"""
    set_color(r, g, b)  # 设置颜色
    time.sleep(delay)   # 保持该颜色一段时间
    set_color(1, 1, 1)  # 熄灭所有灯(共阳:1为熄灭)
    time.sleep(delay)   # 熄灭后等待一段时间

while True:
    # 红色
    blink_color(0, 1, 1, 0.5)
    # 绿色
    blink_color(1, 0, 1, 0.5)
    # 蓝色
    blink_color(1, 1, 0, 0.5)
    # 黄色(红+绿)
    blink_color(0, 0, 1, 0.5)
    # 紫色(红+蓝)
    blink_color(0, 1, 0, 0.5)
    # 青色(绿+蓝)
    blink_color(1, 0, 0, 0.5)
    # 白色(红+绿+蓝)
    blink_color(0, 0, 0, 0.5)

前面和基础点灯试验重复的地方就不再赘述,不同的是这里实现了一个设置颜色的函数set_color(r, g, b),它用于设置 RGB 灯内部的三个LED的颜色。接受三个参数 rg 和 b,分别代表红、绿、蓝灯的状态(0 为亮,1 为灭)。函数内部通过判断每个参数的值来控制对应 LED 灯的状态。使用 Pin.low() 让对应的灯亮,用 Pin.high() 使对应的灯灭,实现了三种颜色的灵活配置。

然后定义了一个让对应RGB颜色闪烁的函数blink_color(r, g, b, delay),它先设置所需的颜色,然后让 LED 灯保持亮起一段设定时间(通过 delay 参数调整)。然后,调用 set_color 函数将所有灯熄灭(因为我们庐山派板子上的RGB灯为共阳结构,熄灭时三个灯都设置为高电平),防止影响下一个颜色,再在熄灭状态下等待一段时间。

接下来就到无限循环了,依次调用blink_color 函数,使 板载RGB 灯以不同的颜色闪烁。

6 使用用户按键​

TODO:待更新实际开发板的照片,标识出用户按键的位置

6.1 独立按键是什么​

独立按键是一种简单的输入设备,广泛应用于各种电子设备中,用于实现基本的用户交互。它们的工作原理通常基于一个简单的机械开关,当按下按键时触发某些操作。独立按键可以有多种尺寸、形状和颜色,便于用户辨识和使用。常见按键展示:

4.2 独立按键结构组成​

独立按键的主要结构组成包括:按钮、外壳、弹簧、触点、导电片和引脚。由一个弹性体(如弹簧或金属片)和一个按键帽组成。当按键被用户按下时,弹性体会缩短,使按键帽压缩,使按钮顶部变得接近或触摸基底。当用户松开按钮时,弹性体恢复原状,按键返回初始位置。所以当按键未被按下时,通常触点是分开的,电路是断开的。当按下按键时,导电片触碰到触点,从而形成一个闭合电路。常见按键原理图示意如下:

6.3 独立按键驱动原理​

独立按键驱动是为了让微控制器能识别按键的状态,而微控制器正好可以识别高电平和低电平,所以大多数的按键都是通过给按键的一端接入高电平,一端接入GPIO;或者是给按键的一端接入低电平,一端接入GPIO。通过检测连接按键的引脚有没有发生电平变化,就可以知道按键是否按下。

6.4 消抖措施​

我们通常用的按键内部都是机械弹性开关,当它按下或者弹起的时候,机械触点会因为弹性作用而在闭合和断开的瞬间伴随着一连串的抖动。这种抖动会导致输入信号在高低电位之间弹跳,产生不正确的输入。这就是按键抖动现象。消抖措施主要分为软件消抖和硬件消抖:

  1. 软件消抖主要是通过编程的方法,设定一个延迟或计时器,确保不读取按键在抖动状态时的电平,避免抖动对程序的影响
  2. 硬件RC消抖:在按键电路中加入元器件如电阻、电容组成的RC滤波器,对按键信号进行平滑处理,降低抖动的影响。注意硬件消抖只能改善而不能消除抖动(除非你用比较大的电容,但那样会导致上升沿太缓,也会造成按钮反应时间太长)。同时,如果你只用一个电容直接并联在按键两端,当按键按下时,按键相当于短路了这个电容,但是按钮的电阻又很小,就会有很大的放电电流,造成按钮机械接触点加速老化,从而导致按钮寿命极具减少。所以这个电路的设计需要下一些功夫,一般来说即使你的硬件电路中做了硬件消抖,也是需要软件消抖来配合的。
  3. 硬件RS触发器消抖:成本极高,每个按钮都需要单独的RS电路,这里不过多介绍,想详细理解请从逻辑门电路开始。

图 7

TIP

在本庐山派开发板中,按键部分的电路很简单(如下面的原理图所示),没有使用硬件消抖,所以在需要使用按钮来进行状态切换功能时需要进行软件消抖处理。

6.5 板载独立按键原理图​

图 4

开发板原理图中,将按键一端(1号引脚)通过电阻R78接到3.3V的高电平上,另一端(2号引脚)接到K230芯片的引脚GPIO53上,2号引脚和4号引脚是我们板载侧按按钮的固定角,没有电气作用,只是用来固定按键的。这样当按键按下时,1号引脚和2号引脚就会导通,GPIO53的电平就会变为3.3V。

这里面电阻(R78)的作用是限流(害怕初学者不小心给设置成推挽输出了)。

在这里要注意的是要在芯片内部将该GPIO(GPIO53)设置为下拉输入模式,这样当按钮没被按下时,引脚为默认的低电平状态。

6.6 按键控制板载RGB灯亮灭​

当用户按下用户按键时关闭对应的LED灯

from machine import Pin
from machine import FPIOA
import time

# 创建FPIOA对象,用于初始化引脚功能配置
fpioa = FPIOA()

# 设置引脚功能,将指定的引脚配置为普通GPIO功能,
fpioa.set_function(62,FPIOA.GPIO62)
fpioa.set_function(20,FPIOA.GPIO20)
fpioa.set_function(63,FPIOA.GPIO63)
fpioa.set_function(53,FPIOA.GPIO53)

# 实例化Pin62, Pin20, Pin63为输出,分别用于控制红、绿、蓝三个LED灯
LED_R = Pin(62, Pin.OUT, pull=Pin.PULL_NONE, drive=7)  # 红灯
LED_G = Pin(20, Pin.OUT, pull=Pin.PULL_NONE, drive=7)  # 绿灯
LED_B = Pin(63, Pin.OUT, pull=Pin.PULL_NONE, drive=7)  # 蓝灯

# 按键引脚为53,按下时为高电平,所以这里设置为下拉并设置为输入模式
button = Pin(53, Pin.IN, Pin.PULL_DOWN)  # 使用下拉电阻

# 板载RGB灯是共阳结构,设置引脚为高电平时关闭灯,低电平时点亮灯
# 初始化时先关闭所有LED灯
LED_R.high()  # 关闭红灯
LED_G.high()  # 关闭绿灯
LED_B.high()  # 关闭蓝灯

# 基础控制RGB灯亮灭试验:选择一个LED灯并让其闪烁
# 默认选择红色LED灯,后续可以通过变量改变需要控制的灯
LED = LED_R  # 当前控制的LED为红色LED

while True:
    if button.value() == 1:
        LED.high()
    else:
        LED.low()

前半部分和我们在前面学习的点亮RGB灯是一样的,就是初始化灯对应的引脚。不同的是我们这里还对按键用到的GPIO(Pin53)进行了初始化,引脚62、20和63将用于控制LED灯,而引脚53将用于读取按钮的状态,将控制LED灯的引脚设置为了输出模式,将读取按钮的GPIO设置为了输入模式。

然后把按钮配置为了下拉输入模式,代表当按钮没有被按下是,输入信号为低电平(0),按下时为高电平(1)。

由于板载的LED灯是共阳结构,这里设置引脚为高电平从而所有LED灯熄灭。

接下来就到主循环了,通过不断检查按钮对应GPIO的状态来控制LED的开关,如果按钮被按下(button.value() 为 高电平(1)),LED会被设置为高电平,即熄灭。如果按钮未被按下,则LED会被设置为低电平,即点亮。

可以看到我们这里并没有进行按键消抖处理,这里按钮的作用是直接控制LED灯的熄灭,而不是在不同状态之间切换。当我们按下按钮时,LED灯熄灭;而当我们释放按钮时,LED灯将再次点亮。在上面的程序中,我们关注的是按钮是否被按下(按下就熄灭LED灯),而不是按钮有没有改变状态。如果我们需要判断按钮的改变状态来切换LED灯状态,就必须要进行消抖处理了,详情请看下面的程序。

6.7 用按键切换RGB灯状态​

流程图如下:

from machine import Pin
from machine import FPIOA
import time

# 创建FPIOA对象,用于初始化引脚功能配置
fpioa = FPIOA()

# 设置引脚功能,将指定的引脚配置为普通GPIO功能,
fpioa.set_function(62,FPIOA.GPIO62)
fpioa.set_function(20,FPIOA.GPIO20)
fpioa.set_function(63,FPIOA.GPIO63)
fpioa.set_function(53,FPIOA.GPIO53)

# 实例化Pin62, Pin20, Pin63为输出,分别控制红、绿、蓝三个LED灯
LED_R = Pin(62, Pin.OUT, pull=Pin.PULL_NONE, drive=7)  # 红灯
LED_G = Pin(20, Pin.OUT, pull=Pin.PULL_NONE, drive=7)  # 绿灯
LED_B = Pin(63, Pin.OUT, pull=Pin.PULL_NONE, drive=7)  # 蓝灯

# 按键引脚为53,按下时高电平,设置为输入模式
button = Pin(53, Pin.IN, Pin.PULL_DOWN)  # 使用下拉电阻

# 初始选择控制红灯
LED = LED_R  # 默认控制红灯

# 初始化时关闭所有LED灯(共阳:高电平时为灭灯)
LED_R.high()
LED_G.high()
LED_B.high()

# 消抖时间设置为20毫秒
debounce_delay = 20  # 毫秒
last_press_time = 0  # 上次按键按下的时间,单位为毫秒

# 记录LED当前状态,True表示亮,False表示灭
led_on = False

# 记录按键状态,用于检测按下和松开的状态变化
button_last_state = 0  # 上次按键状态

# 主循环
while True:
    button_state = button.value()  # 获取当前按键状态
    current_time = time.ticks_ms()  # 获取当前时间(单位:毫秒)

    # 检测按键从未按下(0)到按下(1)的变化(上升沿)
    if button_state == 1 and button_last_state == 0:
        # 检查按键是否在消抖时间外
        if current_time - last_press_time > debounce_delay:
            # 切换LED的状态
            if led_on:
                LED.high()  # 熄灭LED
            else:
                LED.low()   # 点亮LED

            led_on = not led_on  # 反转LED状态
            last_press_time = current_time  # 更新按键按下时间

    # 更新上次按键状态
    button_last_state = button_state

    # 简单延时,防止主循环过于频繁
    time.sleep_ms(10)

前半部分和【按键控制板载RGB灯亮灭】一样,这里不再赘述。

不同的是,在该程序中引入了按键消抖处理,以及通过按钮状态的变化来控制LED灯的亮灭切换,和前面的代码相比,不只是简单地根据按钮的按下与否来控制LED的亮灭,而是实现了按键状态的变化检测。

在这个程序中我们设置按钮的消抖时间为20毫秒,然后创建了几个变量来辅助进行状态记录,last_press_time用来记录上次按键按下的时间,单位为毫秒;led_on用来记录LED灯的亮灭状态;button_last_state用来记录上次检查按钮时的按键状态。

接下来就是主循环了,首先获取当前按钮状态和时间。如果按钮的状态从未按下(0,低电平)变为按下(1,高电平),且在消抖延迟后,程序将切换LED的状态(点亮或熄灭),然后更新LED当前状态和最后按键按下的时间。

这个程序最重要的改进就是进行了按键的消抖,确保每次按钮的状态变化都有效,避免由于机械抖动造成的错误信号。

参考资料:

  1. 2.6 Pin 模块 API 手册 — CanMV K230 (canaan-creative.com)
  2. class Pin – control I/O pins — MicroPython latest documentation

本页面更新于: 2024年12月6日 15:41:58

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/949058.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【网络安全 | 漏洞挖掘】通过模拟功能实现提权(Bugcrowd)

未经许可,不得转载。 我将与大家分享我在 Bugcrowd 的某个项目中发现的一个漏洞,该项目中有一个“用户模拟”功能。 什么是用户模拟? 用户模拟允许管理员在不知晓用户凭据的情况下“以用户身份登录”。这种功能常见于管理员需要调试问题、审查用户权限或解决投诉的平台中。…

TCP Analysis Flags 之 TCP Retransmission

前言 默认情况下,Wireshark 的 TCP 解析器会跟踪每个 TCP 会话的状态,并在检测到问题或潜在问题时提供额外的信息。在第一次打开捕获文件时,会对每个 TCP 数据包进行一次分析,数据包按照它们在数据包列表中出现的顺序进行处理。可…

doris:基于 Arrow Flight SQL 的高速数据传输链路

Doris 基于 Arrow Flight SQL 协议实现了高速数据链路,支持多种语言使用 SQL 从 Doris 高速读取大批量数据。 用途​ 从 Doris 加载大批量数据到其他组件,如 Python/Java/Spark/Flink,可以使用基于 Arrow Flight SQL 的 ADBC/JDBC 替代过去…

HTML5实现好看的二十四节气网页源码

HTML5实现好看的新年春节元旦网站源码 前言一、设计来源1.1 主界面1.2 关于我们界面1.3 春季节气界面1.4 夏季节气界面1.5 秋季节气界面1.6 冬季节气界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现好看的二十四节气网页源码,春季节气&#xf…

Elasticsearch:利用 AutoOps 检测长时间运行的搜索查询

作者:来自 Elastic Valentin Crettaz 了解 AutoOps 如何帮助你调查困扰集群的长期搜索查询以提高搜索性能。 AutoOps 于 11 月初在 Elastic Cloud Hosted 上发布,它通过性能建议、资源利用率和成本洞察、实时问题检测和解决路径显著简化了集群管理。 Au…

mysql报错2059

客户端连接mysql服务时提示2059错误,通常与身份验证插件有关,具体表现为客户端无法加载指定的身份验证插件。这个错误在MySQL 8.0及更高版本中较为常见,因为从MySQL 8.0开始,默认的加密规则从mysql_native_password变为了caching_…

应用架构模式

设计模式 设计模式是指根据通用需求来设计解决方案的模板或蓝图,使用设计模式能够更加有效地解决设计过程中的常见问题。设计模式针对不同的问题域有不同的内涵,主要涉及业务、架构、程序设计等问题域,本文主要讨论架构设计模式。 业务设计模…

基于MPPT算法的光伏并网发电系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于MPPT算法的光伏并网发电系统simulink建模与仿真,包括PV光伏发电模块,并网电路,MPPT,PWM等模块。 2.系统仿真结果 3.核心程…

DeepSeek v3为何爆火?如何用其集成Milvus搭建RAG?

最近,DeepSeek v3(一个MoE模型,拥有671B参数,其中37B参数被激活)模型全球爆火。 作为一款能与Claude 3.5 Sonnet,GPT-4o等模型匹敌的开源模型DeepSeek v3不仅将其算法开源,还放出一份扎实的技术…

GPU算力平台的应用之任意门:任意穿搭匹配模型的应用教程

大家好,今天给大家介绍一下:GPU算力平台的应用之任意门:任意穿搭匹配模型的应用教程。 文章目录 一、GPU算力平台概述人工智能智能发展为什么需要GPU算力平台 二、注册与登录账号注册流程 三、平台的应用之Anydoor应用启动器选择Anydoor的应用场景Anydoo…

微信小程序中 “页面” 和 “非页面” 的区别

微信小程序中 “页面” 和 “非页面” 的区别,并用表格进行对比。 核心概念: 页面 (Page): 页面是微信小程序中用户可以直接交互的视图层,也是小程序的基本组成部分。每个页面都有自己的 WXML 结构、WXSS 样式和 JavaScript 逻辑…

exam0-试卷整理

exam0-试卷整理 2010,2013是梦开始的地方,大概率会出原题的 2010 2013 2015 大题 manchester RIP更新 说出ISO与TCP/IP模型的相同点和不同点(8分) 相似: 两者都有层次,网络专业人员都需要知道二者&a…

QT-------------对话框和多窗口程序设计

一、标准对话框 1. QFileDialog 对话框 功能&#xff1a;提供文件选择对话框&#xff0c;方便用户选择文件或目录。 #include <QApplication> #include <QFileDialog> #include <QMessageBox>int main(int argc, char *argv[]) {QApplication app(argc, a…

论文解读 | NeurIPS'24 IRCAN:通过识别和重新加权上下文感知神经元来减轻大语言模型生成中的知识冲突...

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 点击 阅读原文 观看作者讲解回放&#xff01; 作者简介 史丹&#xff0c;天津大学博士生 内容简介 大语言模型&#xff08;LLM&#xff09;经过海量数据训练后编码了丰富的世界知识。最近的研究表明&#xff0c…

在DJI无人机上运行VINS-FUISON(PSDK 转 ROS)

安装ceres出现以下报错&#xff0c;将2版本的ceres换成1版本的ceres CMake did not find one.Could not find a package configuration file provided by "absl" with any ofthe following names:abslConfig.cmakeabsl-config.cmakeAdd the installation prefix of …

A*算法与人工势场法结合的路径规划(附MATLAB源码)

A*算法与人工势场法&#xff08;APF&#xff09;结合实现路径规划 路径规划是机器人、无人机及自动驾驶等领域中的一个重要问题。本文结合了经典的 A* 算法与 人工势场法&#xff08;Artificial Potential Field, APF&#xff09;&#xff0c;实现了一种改进的路径规划方法。下…

SASS 简化代码开发的基本方法

概要 本文以一个按钮开发的实例&#xff0c;介绍如何使用SASS来简化CSS代码开发的。 代码和实现 我们希望通过CSS开发下面的代码样式&#xff0c;从样式来看&#xff0c;每个按钮的基本样式相同&#xff0c;就是颜色不同。 如果按照传统的方式开发&#xff0c;需要开发btn &…

Spring为什么要用三级缓存解决循环依赖?

1.什么是循环依赖 本文为了方便说明&#xff0c;先设置两个业务层对象&#xff0c;命名为AService和BService。其中Spring是如何把一个Bean对象创建出来的&#xff0c;其生命周期如下&#xff1a; 构造方法–> 不同对象 --> 注入依赖 -->初始化前 --> 初始化后–&…

R shiny app | 网页应用 空格分隔的文本文件在线转csv

shiny 能快速把R程序以web app的形式提供出来&#xff0c;方便使用&#xff0c;降低技术使用门槛。 本文提供的示例&#xff1a;把空格分隔的txt文件转为逗号分隔的csv文件。 前置依赖&#xff1a;需要有R环境(v4.2.0)&#xff0c;安装shiny包(v1.9.1)。括号内是我使用的版本…

LLM - 使用 LLaMA-Factory 部署大模型 HTTP 多模态服务 教程 (4)

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/144881432 大模型的 HTTP 服务,通过网络接口,提供 AI 模型功能的服务,允许通过发送 HTTP 请求,交互大模型,通常基于云计算架构,无需在本地部署复杂的模型和硬件,…