让Arduino程序具备更好的兼容性-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7728|回复: 4

[拓展] 让Arduino程序具备更好的兼容性

[复制链接]
发表于 2021-2-1 19:04 | 显示全部楼层 |阅读模式
本文将编入《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]
发表于 2021-2-1 19:59 | 显示全部楼层
  1. #if DEBUG
  2. #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
  3. #define DEBUG_Serial Serial1
  4. #else
  5. #include <SoftwareSerial.h>
  6. SoftwareSerial myserial(10, 11);
  7. #define DEBUG_Serial myserial
  8. #endif
  9. #define DEBUG_Print(...) DEBUG_Serial.print(__VA_ARGS__)
  10. #define DEBUG_Println(...) DEBUG_Serial.println(__VA_ARGS__)
  11. #else
  12. #define DEBUG_Print(...)
  13. #define DEBUG_Println(...)
  14. #endif
复制代码
发表于 2021-2-1 21:40 | 显示全部楼层
请问,Arduino Due  能理解成 STM32duino 不?

点评

due芯片是SAMD21G18A,不是STM32  详情 回复 发表于 2021-2-1 21:53
 楼主| 发表于 2021-2-1 21:53 | 显示全部楼层
Highnose 发表于 2021-2-1 21:40
请问,Arduino Due  能理解成 STM32duino 不?

due芯片是SAMD21G18A,不是STM32
发表于 2021-2-2 09:51 | 显示全部楼层
奈何col 发表于 2021-2-1 21:53
due芯片是SAMD21G18A,不是STM32

明白,谢谢你的解答
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-1 01:20 , Processed in 0.112078 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表