回答

收藏

[资料] Arduino操作一览

模拟/电源 模拟/电源 1183 人阅读 | 0 人回复 | 2021-09-02

最近学习的一块板子esp8266NodeMcu 内部跑的是基于arduino的代码,所以也可以把这块板子当做arduino来使用,使用c语言去进行操作,但是由于使用的均为网络方面的知识,一直没有去看看arduino的基础用法,刚好找到了相关的资料,在此做一个总结

由于之前有过51和32的学习经验,对于arduino而言,基础上手还算比较自然,但是由于它封装地太好了,没有多少人去按照原生的方法使用寄存器或者传统的库函数方法去开发,对于arduino而言,存在着很多的第三方库,根据这些库去操作相应的功能,操作相对来说会比stm32简单不少

总结如下:
1.GPIO设置

  使用pinMode(pin, mode)来设置GPIO口工作模式,pin取值范围0 ~ 16,mode可选值见下文;

  使用digitalWrite(pin, value)来设置输出状态,value可选值为HIGH或LOW,即1和0;

  使用digitalRead(pin)来读取GPIO口电平,返回值为HIGH或LOW,即1和0;

  GPIO0 ~ 15可以设置为INPUT、OUTPUT、INPUT_PULLUP模式(输入、输出、上拉输入),GPIO16可以设置为INPUT、OUTPUT、INPUT_PULLDOWN_16模式(输入、输出、下拉输入);

  在系统上电启动的时候这些管脚默认设置为INPUT模式;

  GPIO6 ~ 11在大多数模块中用来连接外部flash芯片,所以对这些管脚进行 操作可能会引起程序崩溃

2.中断设置

  使用attachInterrupt(digitalPinToInterrupt(pin), ISR, mode)来设置中断,mode可选值CHANGE、RISING、FALLING(电平改变时、上升沿、下降沿);

  使用detachInterrupt(digitalPinToInterrupt(pin))来关闭中断;

3.PWM设置

  PWM一般用于设置LED灯的闪烁(呼吸灯)和电机的驱动等

  GPIO0 ~ 16支持PWM输出,具体说明如下:

  使用analogWrite(pin, value)在对于pin上输出PWM信号,value表示高电平保持时间,参数value表示PWM输出的占空比,范围在0~255的区间,对应的占空比为0%~100%,当value为0时即停止PWM输出;

  使用analogWriteRange(new_range)修改PWM value可写范围,默认range为1023;

  使用analogWriteFreq(new_frequency)修改PWM频率,new_frequency取值范围100 ~ 40000,默认为1000;

  range*frequency不应大于1000000;

4.串口

  Arduino for esp8266可以使用Serial和Serial1两个串口,Serial可以将针脚映射到某些其他的GPIO口上;

  Serial1只能用于发送数据;

  串口具有硬件FIFO,收发各128字节,另外收发还各自有256字节缓存;

  串口收发均有硬件及中断完成,但是当缓存不够用时将会阻塞程序;

  接收缓存可以通过Serial.setRxBufferSize(size_t size)更改接收缓存大小(默认256字节);

  可以使用Serial.detectBaudrate(time_t timeoutMillis)来检测外部输入串口的波特率;

  串口发送可用print()、println()、write()等方法;

  串口接收可用read()、readBytes()等方法;

  串口可用于进行信息交互 或者进行debug

  
5.iic
  https://www.arduino.cn/thread-2170-1-1.html

  一种简单的总线结构 存在两根信号线 scl(时间线) sda(双向数据线)

  在arduino中 iic通信又称作TWI

  Arduino的IIC通信使用wire库,该库包含以下方法:

    begin()//开启iic功能
    requestFrom()//接收
    beginTransmission()//开启传输
    endTransmission()//结束传输
    write()//写入值
    available()//数据是否有效
    read()//读数据
    onReceive(funcion)//发送信息时调用回调函数
    onRequest()//接收信息时调用回调函数



6.SPI
  https://blog.csdn.net/xxxxxx91116/article/details/42620413

  相对于iic而言是一种略微复杂的总线结构,存在四总线(MOSI MISO SCLK HWCS)
  主要用于实现芯片的读取(W25XXX)

  与I2C不同,利用SPI库操作时,读和写都用同一个函数SPI.transfer()实现。

  读取时,可以任意地址、任意长度进行读取。

  与EEPROM不同,SPI Flash写入前,需要对写入的存储空间进行擦除(Erase)操作,
  否则写入不成功。芯片支持Chip Erase(整片擦除)、Block Erase(32K bytes/64K bytes块擦除)和Sector Erase(4K bytes  扇区擦除)。
  当写操作对应的地址空间到达page的边界,再继续写入时目的地址会自动roll over到本页的起始位置

7.延时方法

使用millis()和micros()可分别获取以毫秒及微秒为单位的系统时间;

使用delay(ms)可进行毫秒级延时;

使用delayMicroseconds(us)可进行微秒级延时,该操作会阻塞系统运行,不建议用该方法完成20毫秒以上延时;

当进行耗时操作时(>50ms)会影响系统网络功能,需要调用delay(0)或yield()来维持网络功能;

8.PROGMEMM

  https://arduino-esp8266.readthedocs.io/en/latest/PROGMEM.html#

  PROGMEMM是AVR中的功能,可以将数据储存到闪存中,从而可以节省内存的使用

  没有使用PPOGMEMM: static const char array[]="This is a string stored in flash";

  使用PPOGMEMM:     static const char array[] PROGMEM = "This is a string stored in flash";

  可以减少内存的使用量 但是会增加闪存的使用量.

分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /2 下一条