|
前言:
本文讲述了使用Arduino IDE对RP2040进行编程时,GPIO与pinMode的对应关系,和使用PWM功能时的注意点。
需注意函数pinMode的入参序号与实际GPIO不对应;需注意通过函数analogWrite最多输出16种PWM占空比,且周期均为2ms。
上一贴说到RP2040在Arduino Nano上的GPIO分布:
【Follow me第二季第4期】Arduino Nano RP2040 Connect之GPIO控制 - DigiKey得捷技术专区 - 电子工程世界-论坛
感觉没有说透,因此专门梳理了下在Arduino IDE中如何使用RP2040 datasheet中提到的30个多功能IO。
首先,Arduino IDE对RP2040的GPIO序号进行了重新编号,所以在使用时一定要小心。
直接贴答案:
char level[30];
char count[30];
char gpiopin[] = {
1, 0, 20, 24, 12, 10, 13, 11, 25, 26, 27, 28, 18, 19, 29, 3, 4, 5, 6, 7, 8, 9, 22, 23, 21, 2, 14, 15, 16, 17
};
void setup() {
// put your setup code here, to run once:
for (char i = 0; i < 30; i++) {
pinMode(i, OUTPUT);
}
memset(level, 0, sizeof(level));
memset(count, 0, sizeof(count));
}
void loop() {
// put your main code here, to run repeatedly:
delay(1);
for (int i = 0; i < 30; i++) {
count[i]++;
if (count[i] > i) {
count[i] = 0;
level[i] ^= 1;
digitalWrite(gpiopin[i], level[i]);
}
}
}
以上这一段代码,演示了RP2040的30个IO分别输出不同的波形,IO0输出1ms的高电平,IO1输出2ms高电平,以此类推,IO29输出30ms高电平,可以通过示波器实际测量,来帮助我们从硬件上区分开。
因此结合RP2040的datasheet可以整理出对应关系,如下表格:
RP2040 pin number |
PWM | RP2040 GPIO | Arduino IDE pinMode |
|
2 | 0 | A | GPIO0 | 1 |
3 | B | GPIO1 | 0 | |
4 | 1 | A | GPIO2 | 20 |
5 | B | GPIO3 | 24 | |
6 | 2 | A | GPIO4 | 12 |
7 | B | GPIO5 | 10 | |
8 | 3 | A | GPIO6 | 13 |
9 | B | GPIO7 | 11 | |
11 | 4 | A | GPIO8 | 25 |
12 | B | GPIO9 | 26 | |
13 | 5 | A | GPIO10 | 27 |
14 | B | GPIO11 | 28 | |
15 | 6 | A | GPIO12 | 18 |
16 | B | GPIO13 | 19 | |
17 | 7 | A | GPIO14 | 29 |
18 | B | GPIO15 | 3 | |
27 | 0 | A | GPIO16 | 4 |
28 | B | GPIO17 | 5 | |
29 | 1 | A | GPIO18 | 6 |
30 | B | GPIO19 | 7 | |
31 | 2 | A | GPIO20 | 8 |
32 | B | GPIO21 | 9 | |
34 | 3 | A | GPIO22 | 22 |
35 | B | GPIO23 | 23 | |
36 | 4 | A | GPIO24 | 21 |
37 | B | GPIO25 | 2 | |
38 | 5 | A | GPIO26 | 14 |
39 | B | GPIO27 | 15 | |
40 | 6 | A | GPIO28 | 16 |
41 | B | GPIO29 | 17 |
所以在Arduino IDE中对IO进行控制时,一定要认准实际的index。
表格中还对应了PWM,RP2040最多支持8个PWM通道,每个通道有2个输出引脚,所以这30个引脚,同一时间只能输出16种不同占空比的PWM波,且所有输出只能对应一种周期:2ms。
所以在通过Arduino IDE使用函数analogWrite时,假设操作完GPIO0为占空比30%后,又去操作了GPIO16为80%,由于这两个IO共用0A PWM,最后的结果是GPIO0和16均输出80%。