打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Arduino安装目录探秘.1

最近一直用Arduino写各种东西,但是也用到了许多非标准板的硬件

对于这个具体的实现过程很有兴趣,也找到了一些资料,故此做记录

这篇文章都是自我探索和经验论,并没有很多引用的资料

首先一切的根源就是这个安装目录,所以来看看


驱动嘛,都是变成了CP210了

用vscode也看了一眼,都是一些dll文件,我现在不想分析它

这个地方是自带的示例,比较写的好,可以参考

打开一个?电压读取串口

其实有大量注释,就是你别看见英文就头秃

配置段初始化了一个串口,指定了baud

然后用函数读取A0这个引脚,赋值给senorValue

接着打印出来,用了一个延时.为了稳定读取

void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600);}
// the loop routine runs over and over again forever:void loop() { // read the input on analog pin 0: int sensorValue = analogRead(A0); // print out the value you read: Serial.println(sensorValue); delay(1); // delay in between reads for stability}

然后一个简短的项目介绍,ReadMe吧~

一个是实物连接图

一个是电路图

这个是程序框架

小灯闪烁,这个LED在13jio~,就是浪费掉了其实,完全可以引出来再用

这个也简单

在code的最上面指定了按下的按钮的引脚号,设置它的模式

然后代码和上面的一样

我们也可以看看这个ISP就是烧写AVR芯片进Bootloader,出现了这个Arduino.h的头文件.我们来研究一下(之后重点研究)

#ifndef Arduino_h#define Arduino_h#include <stdlib.h>#include <stdbool.h>#include <string.h>#include <math.h>#include <avr/pgmspace.h>#include <avr/io.h>#include <avr/interrupt.h>#include "binary.h"#ifdef __cplusplusextern "C"{#endifvoid yield(void);#define HIGH 0x1#define LOW  0x0#define INPUT 0x0#define OUTPUT 0x1#define INPUT_PULLUP 0x2#define PI 3.1415926535897932384626433832795#define HALF_PI 1.5707963267948966192313216916398#define TWO_PI 6.283185307179586476925286766559#define DEG_TO_RAD 0.017453292519943295769236907684886#define RAD_TO_DEG 57.295779513082320876798154814105#define EULER 2.718281828459045235360287471352#define SERIAL 0x0#define DISPLAY 0x1#define LSBFIRST 0#define MSBFIRST 1#define CHANGE 1#define FALLING 2#define RISING 3#if defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) #define DEFAULT 0 #define EXTERNAL 1 #define INTERNAL1V1 2 #define INTERNAL INTERNAL1V1#elif defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) #define DEFAULT 0 #define EXTERNAL 4 #define INTERNAL1V1 8 #define INTERNAL INTERNAL1V1 #define INTERNAL2V56 9 #define INTERNAL2V56_EXTCAP 13#else #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__) || defined(__AVR_ATmega644__) || defined(__AVR_ATmega644A__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__)#define INTERNAL1V1 2#define INTERNAL2V56 3#else#define INTERNAL 3#endif#define DEFAULT 1#define EXTERNAL 0#endif// undefine stdlib's abs if encountered#ifdef abs#undef abs#endif#define min(a,b) ((a)<(b)?(a):(b))#define max(a,b) ((a)>(b)?(a):(b))#define abs(x) ((x)>0?(x):-(x))#define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt)))#define round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5))#define radians(deg) ((deg)*DEG_TO_RAD)#define degrees(rad) ((rad)*RAD_TO_DEG)#define sq(x) ((x)*(x))#define interrupts() sei()#define noInterrupts() cli()#define clockCyclesPerMicrosecond() ( F_CPU / 1000000L )#define clockCyclesToMicroseconds(a) ( (a) / clockCyclesPerMicrosecond() )#define microsecondsToClockCycles(a) ( (a) * clockCyclesPerMicrosecond() )#define lowByte(w) ((uint8_t) ((w) & 0xff))#define highByte(w) ((uint8_t) ((w) >> 8))#deine bitRead(value, bit) (((value) >> (bit)) & 0x01)#define bitSet(value, bit) ((value) |= (1UL << (bit)))#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))#define bitToggle(value, bit) ((value) ^= (1UL << (bit)))#define bitWrite(value, bit, bitvalue) ((bitvalue) ? bitSet(value, bit) : bitClear(value, bit))// avr-libc defines _NOP() since 1.6.2#ifndef _NOP#define _NOP() do { __asm__ volatile ("nop"); } while (0)#endif
typedef unsigned int word;
#define bit(b) (1UL << (b))
typedef bool boolean;typedef uint8_t byte;
void init(void);void initVariant(void);
int atexit(void (*func)()) __attribute__((weak));
void pinMode(uint8_t pin, uint8_t mode);void digitalWrite(uint8_t pin, uint8_t val);int digitalRead(uint8_t pin);int analogRead(uint8_t pin);void analogReference(uint8_t mode);void analogWrite(uint8_t pin, int val);
unsigned long millis(void);unsigned long micros(void);void delay(unsigned long ms);void delayMicroseconds(unsigned int us);unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout);unsigned long pulseInLong(uint8_t pin, uint8_t state, unsigned long timeout);
void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val);uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder);
void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode);void detachInterrupt(uint8_t interruptNum);
void setup(void);void loop(void);
// Get the bit location within the hardware port of the given virtual pin.// This comes from the pins_*.c file for the active board configuration.
#define analogInPinToBit(P) (P)
// On the ATmega1280, the addresses of some of the port registers are// greater than 255, so we can't store them in uint8_t's.extern const uint16_t PROGMEM port_to_mode_PGM[];extern const uint16_t PROGMEM port_to_input_PGM[];extern const uint16_t PROGMEM port_to_output_PGM[];
extern const uint8_t PROGMEM digital_pin_to_port_PGM[];// extern const uint8_t PROGMEM digital_pin_to_bit_PGM[];extern const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[];extern const uint8_t PROGMEM digital_pin_to_timer_PGM[];
// Get the bit location within the hardware port of the given virtual pin.// This comes from the pins_*.c file for the active board configuration.// // These perform slightly better as macros compared to inline functions//#define digitalPinToPort(P) ( pgm_read_byte( digital_pin_to_port_PGM + (P) ) )#define digitalPinToBitMask(P) ( pgm_read_byte( digital_pin_to_bit_mask_PGM + (P) ) )#define digitalPinToTimer(P) ( pgm_read_byte( digital_pin_to_timer_PGM + (P) ) )#define analogInPinToBit(P) (P)#define portOutputRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_output_PGM + (P))) )#define portInputRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_input_PGM + (P))) )#define portModeRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_mode_PGM + (P))) )
#define NOT_A_PIN 0#define NOT_A_PORT 0
#define NOT_AN_INTERRUPT -1
#ifdef ARDUINO_MAIN#define PA 1#define PB 2#define PC 3#define PD 4#define PE 5#define PF 6#define PG 7#define PH 8#define PJ 10#define PK 11#define PL 12#endif
#define NOT_ON_TIMER 0#define TIMER0A 1#define TIMER0B 2#define TIMER1A 3#define TIMER1B 4#define TIMER1C 5#define TIMER2 6#define TIMER2A 7#define TIMER2B 8
#define TIMER3A 9#define TIMER3B 10#define TIMER3C 11#define TIMER4A 12#define TIMER4B 13#define TIMER4C 14#define TIMER4D 15#define TIMER5A 16#define TIMER5B 17#define TIMER5C 18#ifdef __cplusplus} // extern "C"#endif#ifdef __cplusplus#include "WCharacter.h"#include "WString.h"#include "HardwareSerial.h"#include "USBAPI.h"#if defined(HAVE_HWSERIAL0) && defined(HAVE_CDCSERIAL)#error "Targets with both UART0 and CDC serial not supported"#endifuint16_t makeWord(uint16_t w);uint16_t makeWord(byte h, byte l);#define word(...) makeWord(__VA_ARGS__)unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout = 1000000L);unsigned long pulseInLong(uint8_t pin, uint8_t state, unsigned long timeout = 1000000L);void tone(uint8_t _pin, unsigned int frequency, unsigned long duration = 0);void noTone(uint8_t _pin);// WMath prototypeslong random(long);long random(long, long);void randomSeed(unsigned long);long map(longlonglonglonglong);#endif#include "pins_arduino.h"#endif

可以看到是定位在了这里,也有标准的C库.通过溯源

找到了最终的位置在哪里~

对于这个Arduino的安装目录探秘还有很多要说的,但是限于篇幅

就下次再说吧.arduino大家不要小看.对于它的库,CPP味道十足

你学会了Arduino以后学传统的嵌入式开发,就会发现其实就是一个不断深入的过程.思想上面没有什么不同.只是Arduino抽象的更多,封装的更好.

但是也失去了完全可控的一些东西,总归是有得有失.不要太较真

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
源码共享:AVR EVB PWM正弦波产生程序
IAR学习(杂项)
How do i store a byte array in Arduino flash memory using PROGMEM
治标治本,彻底解决AVR单片机EEPROM数据丢失问题
单片机C语言设计实例——第1篇基础程序设计
单片机流水灯(自带)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服