让Arduino程序具备更好的兼容性
本文将编入《Arduino程序设计基础(第3版)》,转载请注明出处不同型号的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 | #if DEBUG
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
#define DEBUG_Serial Serial1
#else
#include <SoftwareSerial.h>
SoftwareSerial myserial(10, 11);
#define DEBUG_Serial myserial
#endif
#define DEBUG_Print(...) DEBUG_Serial.print(__VA_ARGS__)
#define DEBUG_Println(...) DEBUG_Serial.println(__VA_ARGS__)
#else
#define DEBUG_Print(...)
#define DEBUG_Println(...)
#endif 请问,Arduino Due能理解成 STM32duino 不? Highnose 发表于 2021-2-1 21:40
请问,Arduino Due能理解成 STM32duino 不?
due芯片是SAMD21G18A,不是STM32 奈何col 发表于 2021-2-1 21:53
due芯片是SAMD21G18A,不是STM32
明白,谢谢你的解答
页:
[1]