四、端口的内部复用
AVR系芯片的设计是非常精妙的,每个引脚有2~4个复用。只有一种运用的,险些没有。要玩大型的、繁芜的项目,就要深入理解Arduino端口的底细。

4.1 ADC
在(一)里已经说过了,A0~A7基本构造也是数字口,只是内置了ADC,因而可以兼作仿照输入。多数项目,仿照输入口需求不多。因此,建议你留起须要的仿照输入口后,把剩下的仿照口优先用作数字口。
4.2 PWM
在(二)里已经说过了,D3、D5、D6、D9、D10、D11这六个数字口内置了PWM,可以兼作仿照输出。为什么在4.1节要说把多余的仿照口优先用作数字口?就由于数字口每每不足用。如果有较多须要PWM输出的,你先要留起PWM口。
4.3 UART
你用串口直连、USB、RS-232等多种通信时,实在都是在玩UART,Universal Asynchronous Receiver/Transmitter,通用异步收发器。UART是串行通信,只须要发送口和一个吸收口。Arduino内置支持UART通信,利用D0作为RX(吸收口),D11为TX(发送口)。因此,如果你的代码里须要做UART通信,你就得留出D0和D1。你在PC上编的代码要上传(确切说是下传)到Arduino板,走的也是D0和D1,也是UART通信。代码上传不搭界,由于上传时,代码还没有运行。
4.4 I2C
I2C,Inter-Integrated Circuit,芯片间总线。也写作IIC。Atmel也搞了一个千篇一律,叫TWI,Two Wire Interface,双线接口。由于Arduino紧张采取Atmel的AVR系芯片作为主芯片,因此,Arduino的资料里,也每每称之为TWI。
Arduino UNO板和NANO板的TWI(I2C)占用两个仿照输入口,A4作为SDA(Serial Data Line,串行数据线),A5作为SCL(Serial Clock Line,串行时钟线)。Lennardo板则是占用D20和D3。Mega2560板和Due板占用D20和D21。
通过I2C与Arduino板通信的组件很多。譬如,Sparkfun的加速度计和陀螺仪、DS1307实时时钟、HT16K33等LED显示点阵、LCD1602等多种液晶屏、PCFC8575等多种端口扩展板、PCA9685十六路舵机扩展板、AT24C等EEPROM存取接口、MLX90640 红外热像仪模块、Grove颜色识别传感器、VL53L1X ToF 测距模块传感器、LM75温度传感器、WM8960音频编译码模块、M5双摇杆、INA226电压电流功率监视模块、……。还有很多。I2C也可以连接两个Arduino板,或作为总线,把至多128个Arduino板连成一个物联网。
4.5 SPI
SPI,Serial Peripheral Interface,串行外设接口。是一种高速、全双工的通信总线。I2C是两线通信,SPI是四线通信。SCK:Serial ClocK,串行时钟旗子暗记。MOSI:Master Output Slave Input,主出从入。MISO:Master Input Slave Output,主入从出。SS:Selection Signal,选择旗子暗记。
UNO板与NANO板占用D13作为SCK,D11作为MOSI,D12作为MISO。Mega2560板占用D52、D51、D50 。如果有多个从设备,就须要片选旗子暗记SS,可以任意选一个或更多个数字口。
采取SPI的组件也不少,特殊是须要与Arduino高速交流信息的组件,只能采取SPI。譬如,多种SD存储卡读写模块、EEPROM模块、FLASH模块、MCP3008八通道ADC、12864等很多种液晶屏、倾角传感器、九轴传感器、AS5048A磁编码模块、ADXL345三轴重力加速度传感器、SX1278无线射频数据传输模块、STM32F407高速视频传输模块等等。
4.6 CLKO
数字口D8兼作系统时钟分频输出。当外部组件须要与Arduino时钟精准同步时,你就得利用这个引脚,引出系统时钟,接入要同步的组件的外部时钟输入。这时,就不能再项目里利用D8口了。
4.7 外部中断
须要对外部组件做实时相应时,要利用外部中断。外部中断也是实现多进程并发的手段。UNO板有两个外部中断,D2是INT0,D3是INT1。如果不足,还可以利用引脚变革中断,PCINT0~23,共24个。ATmega328的大多数引脚兼作引脚变革中断。
4.8 定时器/计数器
ATmega328内部有3个定时器/计数器,占用端口见下表。
序号
0
1
2
输入
D4
D8、D5
输出
D6、D5
D9、D10
D11、D3
4.9 还有很多
AVR系芯片的设计是非常精妙的,每个引脚有2~4个复用。其它复用,往后再说。





