文章目录
- arduino - pinMode参数1的确定 - 以arduino nano every核心板为例
- 概述
- 笔记
- pins_arduino.h
- ABX00028-datasheet.pdf
- 简单的辨认管脚号就照ABX00028-datasheet.pdf来
- END
arduino - pinMode参数1的确定 - 以arduino nano every核心板为例
概述
arduino nano every的核心板使用的MCU为ATMega4809
在看一个工程(基于arduino nano every核心板), 在初始化代码中看到了很多 pinMode(x, x); e.g. pinMode(2, OUTPUT);
突然懵逼了… 到底是在初始化核心板哪个引出的引脚呢? 如果分不清操作的是哪个管脚, 就无法将工程实现和使用核心板的原理图一一对应.
假设要在核心板的数字IO上点亮一个灯, 或者用数字IO模拟串口发送一些数据(节省成本), 可能要初始化20个数字IO(就是模拟20个串口发送), 如果整错了, 都不知道操作的哪个引脚…
要先确定是核心板哪个引出管脚是哪个pin数字, 才可能正确初始化指定的pin数字为输出模式.
arduino库是经过封装的, 同一个函数(e.g. pinMode), 名称一样, 但是选不同核心板时, 是不同的实现(这就是封装).
而且基于arduino nano every的工程是不支持单步的. 所以想进基于arduino nano every的pinMode实现去看看, 这个参数1(管脚号码)是怎么使用的, 是不可能的.
即使使用能单步调试的arduino核心板(e.g. arduino zero)工程, 即使单步或转到pinMode的实现, 也是arduino zero的实现, 不是arduino nano every的实现.
看不到基于arduino nano every的工程库实现, 有点为难.
在arduinoIDE相关的目录中, 找到了 C:\Users\me\AppData\Local\Arduino15\packages\arduino\hardware\megaavr\1.8.8\variants\nona4809\pins_arduino.h
再结合ABX00028-datasheet.pdf中的核心板引脚导出图, 这才明白.
笔记
pins_arduino.h
C:\Users\me\AppData\Local\Arduino15\packages\arduino\hardware\megaavr\1.8.8\variants\nona4809\pins_arduino.h
// On the Arduino board, digital pins are also used
// for the analog output (software PWM). Analog input
// pins are a separate set.
// ATMEGA4809 / ARDUINO
//
// (SCL)(SDA) (7) (2) (R) (3~) (6~)
// PA4 PA3 PA2 PA1 PA0 GND VDD UPDI PF6 PF5 PF4 PF3
//
// 48 47 46 45 44 43 42 41 40 39 38 37
// + ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ +
// PA5 1| |36 PF2
// PA6 2| |35 PF1 (TOSC2)
// PA7 3| |34 PF0 (TOSC1)
// (9~) PB0 4| |33 PE3 (8)
// (10~) PB1 5| |32 PE2 (13)
// (5~) PB2 6| |31 PE1 (12)
// PB3 7| 48pin QFN |30 PE0 (11~)
// (Tx) PB4 8| |29 GND
// (Rx) PB5 9| |28 AVDD
// PC0 10| |27 PD7 (VREF)
// PC1 11| |26 PD6
// PC2 12| |25 PD5 (A5)
// + ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ +
// 13 14 15 16 17 18 19 20 21 22 23 24
//
// PC3 VDD GND PC4 PC5 PC6 PC7 PD0 PD1 PD2 PD3 PD4
// (1) (0) (4) (A0) (A1) (A2) (A3) (A4)
//
const uint8_t digital_pin_to_port[] = {
PC, // 0 PC5/USART1_Rx
PC, // 1 PC4/USART1_Tx
PA, // 2 PA0
PF, // 3 PF5
PC, // 4 PC6
PB, // 5 PB2
PF, // 6 PF4
PA, // 7 PA1
PE, // 8 PE3
PB, // 9 PB0
PB, // 10 PB1
PE, // 11 PE0
PE, // 12 PE1
PE, // 13 PE2
PD, // 14 PD3/AI3
PD, // 15 PD2/AI2
PD, // 16 PD1/AI1
PD, // 17 PD0/AI0
PF, // 18 PF2/AI12
PF, // 19 PF3/AI13
PD, // 20 PD4/AI4
PD, // 21 PD5/AI5
PA, // 22 PA2/TWI_SDA
PA, // 23 PA3/TWI_SCL
PB, // 24 PB5/USART3_Rx
PB, // 25 PB4/USART3_Tx
};
上面的摘录, 可以看出从MCU侧, 看到的引脚号码. 但是这个要和核心板引出的管脚对应的话, 就需要看数据表. 因为我们要操作的数字IO, 是核心板引出的管脚, 如果只看MCU侧, 看不明白.
ABX00028-datasheet.pdf
红色的Dx和~Dx, 就是数字IO(只能赋值为0和1的引脚),
D2就说明数字IO编号为2, 对照 pins_arduino.h 如下
~D9就说明数字IO为9, 对照 pins_arduino.h 如下
简单的辨认管脚号就照ABX00028-datasheet.pdf来
如果要操作核心板引出的哪根数字IO, 就可以对照ABX00028-datasheet.pdf中的6 Connector Pinouts中带的核心板引脚导出图中的Dx, ~Dx带的数字来确认pinMode的参数1该填哪个数字.
假设核心板D2引脚要初始化为输出, 引脚号就是2, 就调用 pinMode(2, OUTPUT);
假设核心板~D10引脚要初始化为输出, 引脚号就是10, 就调用 pinMode(10, OUTPUT);