本文将编入《Arduino程序设计基础(第3版)》,转载请注明出处
[md]不同型号的Arduino开发板可能使用了不同的核心控制器,如Arduino UNO使用的核心控制器为8位AVR架构的Atmega328P,而Arduino Due使用的是32位ARM Cortex m4架构的 SAMD21G18A。两者主要区别如下:
工作电压不一样。AVR核心的arduino通常工作电压为5V,ARM核心的arduino通常工作电压为3.3V。因此在接入外部设备时,可能需要转换通信电平,以兼容不同的工作电压的外设。
在软件层面,不同架构的芯片对应的编译环境,可能相同数据类型的数据长度不一样。如在Arduino UNO、MEGA中,int及unsigned int占用2字节(16位);而在Arduino Due、Zero中,int及unsigned int占用4字节(32位)。
所以在编写和移植时程序时,如果直接复用代码,可能会造成一些错误。
这种情况下,可以使用宏判断来判断当前编译的目标开发板上的核心MCU型号,进而选择编译对应的语句,方式如下:
```
#ifdef(__arm__)
#endif
#ifdef(__AVR__)
#endif
```
可以通过以下宏判断芯片类型:
| 芯片类型 | 对应的宏 |
| -------- | ----------- |
| AVR | \_\_AVR\_\_ |
| ARM | \_\_arm\_\_ |
可以通过以下宏判断开发板型号:
| 开发板型号 | 对应的宏 |
| ---------------- | ----------------------- |
| Arduino UNO | __AVR_ATmega328P__ |
| Arduino MEGA | \_\_AVR\_ATmega2560\_\_ |
| Arduino Leonardo | \_\_AVR\_ATmega32U4\_\_ |
| Arduino Zero | \_\_SAMD21G18A\_\_ |
| Arduino Due | \_\_SAM3X8E\_\_ |
兼容数据长度不一样的情况,可以使用intx_t指定长度方式定义变量,如int8_t即是长度为8位的整形。使用方式和int一样:
```
int8_t a = 123;
```
常用类型如下:
| 类型 | 取值范围 | 长度(bit) |
| :------: | :----------------------------------------------------------: | :-------: |
| int8_t | -128 ~ 127<br/>( -2<sup>7</sup> ~ 2<sup>7</sup> - 1) | 8 |
| uint8_t | 0 ~ 255<br/>( 0 ~ 2<sup>8</sup> - 1) | 8 |
| int16_t | -32,768 ~ 32,767<br/>( -2<sup>15</sup> ~ 2<sup>15</sup> - 1) | 16 |
| uint16_t | 0 ~ 65,535<br/>( 0 ~ 2<sup>16</sup> - 1) | 16 |
| int32_t | -2,147,483,648 ~ 2,147,483,647<br/>( -2<sup>31</sup> ~ 2<sup>31</sup> - 1) | 32 |
| uint32_t | 0 ~ 4,294,967,295<br/>( 0 ~ 2<sup>32</sup> - 1) | 32 |[/md] |