开源ESP32S3R8N8的driverlib库 | INCREDIBLE_KING

#我为什么要上传自己的程序

笔者从大一开始学习单片机,现在已经是大三老狗,学习使用过很多mcu,对dsp和fpga也是有些许的接触,ST,STC,Infineon,NXP,沁恒,TI,Altera的各式各样的微控制器都有较为熟练的使用,并且在不断地写代码的过程中,逐渐规范自己的书写习惯,有了自己习惯的代码风格。笔者认为,对于初学者而言,不断地观摩高手的成果,学习并模仿,然后逐渐有了自己的理解,是个不错的学习方式,不敢说我的代码有多么的简洁,多么的高级,只希望能看到这篇博客的arduino或esp32的初学者们,有一点点的收获,就够了。

下图为笔者使用的ESP32S3最小系统板。

#由于外因引起的Bootloader丢失的解决方案

笔者在进行编写的过程中,一天内出现过多次bootloader固件丢失的情况,此时单片机是无法进行程序的烧录的,经过查阅相关资料,笔者找到了解决方案:

step1:使得微控制器进入Boot模式。笔者手头的mcu是通过按下板载BOOT按键同时上电实现。

step2:点击Arduino IDE --> 菜单栏-->Tools --> Burn Bootloader  点击后会出现下图字样

 step3:点击Upload烧录按键,烧录固件

step4:烧录完成后,按下板载RST复位键,进入正常的工作模式

以上四步就可以解决由外因引起的Bootloader丢失的问题。

#代码的driverlib库的内容

这些代码仅仅是起到引导性的作用,广大读者可以根据编写的架构进行相关的修改和二次开发,本人也会进行不定期的迭代和维护,完善一些常用的外设和模块的库。

最终解释权为笔者所有。

//**********************************************************

//AUTHOR: INCREDIBLE_KING in Shandong University,Jinan,China 

//**********************************************************


#include <WiFi.h>
//全局变量定义区域****************************************
#define LED 48
#define KEY 0

bool led_status = LOW;
uint32_t delaytime = 100;           //延时时间
unsigned long preciousMillis = 0;  //计时点
int key_status = 1;
int key_last_status = 1;
uint8_t key_flag = 0;
hw_timer_t *timer = NULL;  //定义定时器结构体 timer
//定义要连接的wifi和密码
const char * ssid = "INCREDIBLE_KING";
const char * password = "12345678";
//全局变量定义区域****************************************


//自定义区域函数区域************************************
//****************************************
//  函数简介      led灯初始化函数
//  参数说明      pin 引脚定义
//  返回参数      void
//  使用示例      led_init(LED);
//****************************************
void led_init(uint8_t pin)
{
  pinMode(pin,OUTPUT);
  digitalWrite(pin,LOW); //默认初始化led后灯亮
}
//****************************************
//  函数简介      led闪烁(阻塞延时)
//  参数说明      pin 引脚定义 
//               time 延时时间 
//  返回参数      void
//  使用示例      led_blink_test_blockingDelay(LED,delaytime);
//****************************************
void led_blink_test_blockingDelay(uint8_t pin, uint32_t time)  //阻塞延时
{
  led_status = !led_status;
  digitalWrite(pin,led_status);
  delay(time);
}
//****************************************
//  函数简介      led闪烁(非阻塞延时)
//  参数说明      pin 引脚定义 
//               time 延时时间 
//  返回参数      void
//  使用示例      led_blink_test_non_blockongDelay(LED,delaytime);
//****************************************
void led_blink_test_non_blockongDelay(uint8_t pin ,unsigned long time)//非阻塞延时
{
  unsigned long currentMillis = millis(); //获取当前时间 单位ms
  if(currentMillis - preciousMillis >= time) 
  //每次currentMillis比preciousMillis大time的时候,都会执行一次if中的函数
  {
    preciousMillis = currentMillis;
    led_status = !led_status;
    digitalWrite(pin,led_status);
  }
}
//****************************************
//  函数简介      按键初始化
//  参数说明      pin 引脚定义 
//  返回参数      void
//  使用示例      key_init(KEY);
//****************************************
void key_init(uint8_t pin)
{
    pinMode(pin, INPUT_PULLUP); //内部上拉输入
}
//****************************************
//  函数简介      按键控制led灯亮灭(电平检测)
//  参数说明      key_pin 按键引脚
//               led_pin led引脚
//  使用示例      key_control_led_blink_test1(KEY,LED);
//****************************************
void key_control_led_blink_test1(uint8_t key_pin,uint8_t led_pin)
{
  if(digitalRead(key_pin) == 0) //按键按下
  {
    delay(80);//按键软件消抖
    if(digitalRead(key_pin) == 0) //再次确认按键按下
    {
      led_status = !led_status;
      digitalWrite(led_pin,led_status);
    }
    delay(150);
  }
}
//****************************************
//  函数简介      按键控制led灯亮灭(边缘检测)
//  参数说明      key_pin 按键引脚
//               led_pin led引脚
//  使用示例      key_control_led_blink_test2(KEY,LED);
void key_control_led_blink_test2(uint8_t key_pin,uint8_t led_pin)
{
  key_last_status = key_status;      //保存按键状态
  key_status = digitalRead(key_pin); //更新按键状态
  if(key_status && !key_last_status) //检验按键松开的一瞬间,由0跳变为1 _|--
  //if(!key_status && key_last_status) //检验按键按下的一瞬间,由1跳变为0 --|_
    key_flag = 1;
  if(key_flag)
  {
    key_flag = 0;

    led_status = !led_status;
    digitalWrite(led_pin,led_status);
  }
  
}
//****************************************
//  函数简介      pwm控制led呼吸灯(使用Arduino内部库函数)
//  参数说明      led_pin led引脚
//  使用示例      pwm_control_led_test(LED);
//****************************************
void pwm_control_led_test(uint8_t led_pin)
{
 //默认是8位分辨率,频率不晓得,没有用示波器测量
 // 实现渐亮效果
  for(int i=0;i<256;i++) 
  {
    // 设置亮度模拟值,占空比不断加大
    analogWrite(led_pin, i);
    // 延时 10ms
    delay(10);
    }
  // 实现渐灭效果
  for(int i=255;i>=0;i--) 
  {
    // 设置亮度模拟值,占空比不断减少
    analogWrite(led_pin, i);
    // 延时 10ms
    delay(10);
    }
}
//****************************************
//  函数简介      ledc_pwm初始化
//  参数说明      void
//  使用示例      ledc_pwm_init();
//****************************************
void ledc_pwm_init(void)
{
  ledcSetup(0,17000,10); //通道0-7 频率 分辨率1-14,范围是 0 到 (2^bit_num- 1)
  ledcAttachPin(LED,0); //GPIO 通道
}
//****************************************
//  函数简介      ledc_pwm输出
//  参数说明      void
//  使用示例      ledc_pwm_output();
//****************************************
void ledc_pwm_output(void)
{
  for (int i=0;i<pow(2, 10); i++)
  {
    ledcWrite(0, i); // 输出PWM
    delay(1);
  }

  // 逐渐变暗
  for (int i=pow(2, 10)-1;i>=0;i--)
  {
    ledcWrite(0, i); // 输出PWM
    delay(1);
  }
}
//****************************************
//  函数简介      定时器初始化
//  参数说明      void
//  使用示例      timer_init();
//****************************************
void timer_init(void)
{
  timer = timerBegin(0,80,true); //指定定时器编号0-3、分频器80分频和向上计数
  timerAttachInterrupt(timer, timer0_ISR, true);//绑定定时器中断服务函数 onTimerISR,true:边沿触发  false:电平触发
  timerAlarmWrite(timer, 1000000, true);//设置定时器的周期为 1000000微秒(即 1 秒),自动重装载
  
  timerAlarmEnable(timer);    // 启动定时器
}
//****************************************
//  函数简介      ADC初始化
//  参数说明      void
//  使用示例      adc_init();
//****************************************
void adc_init(void)
{
  pinMode(1,INPUT);
  //实际上一下的参数配置可以都不用    
  analogReadResolution(10);// 设置 ADC 分辨率9-12
  analogSetAttenuation(ADC_11db); // 配置衰减器大约3.9v最大可测量电压
  //以下参数采用默认值即可
  // analogSetCycles(8);//设置每个样本的循环次数。默认是 8。取值范围:1 ~ 255。
  // analogSetSamples(1);//设置范围内的样本数量。默认为 1 个样本。它有增加灵敏度的作用。
  // analogSetClockDiv(1);//设置ADC时钟的分压器。默认值为1。取值范围:1 ~ 255。
}
//****************************************
//  函数简介      ADC测试
//  参数说明      void
//  使用示例      adc_test();
//****************************************
void adc_test(void)
{
  //调用本函数之前记得初始化串口   Serial.begin(115200);
  Serial.println(analogRead(1));
  delay(100);
}
//****************************************
//  函数简介      WiFi_STA模式初始化(连接到其他wifi)
//  参数说明      void
//  使用示例      wifi_STA_init();
//****************************************
void wifi_STA_init(void)
{
  //调用本函数之前记得初始化串口   Serial.begin(115200);
  // 断开之前的连接
  WiFi.disconnect(true);
  // 连接 Wi-Fi
  WiFi.begin(ssid, password);
  Serial.print("正在连接 Wi-Fi");
  // 检测是否链接成功
  while(WiFi.status()!= WL_CONNECTED)//WL_CONNECTED:已连接到 Wi-Fi 网络WL_DISCONNECTED:未连接到 Wi-Fi 网络。WL_IDLE_STATUS:Wi-Fi 处于空闲状态。WL_NO_SSID_AVAIL:未找到指定的 Wi-Fi 网络
  {
    delay(100);
    Serial.print("-");
  }
  Serial.print(">>");
  Serial.println("Connection is OK!");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}
//****************************************
//  函数简介      WiFi_AP模式初始化(作为路由器向外发送wifi)
//  参数说明      void
//  使用示例      wifi_AP_init();
//当ESP32S3单独处于AP模式下时,可以被认为是一个无法访问外网的局域网WiFi路由器节点,
//它可以接受各类设备的连接请求。并可以和连接设备进行TCP、UDP连接,实现数据流。在局域
//物联网的设计中可以承担数据收发节点的作用。可以同时连接到soft-AP的最大站数可以设置4,默认为4。
//****************************************
void wifi_AP_init(void)
{
  //调用本函数之前记得初始化串口   Serial.begin(115200);
  // 设置要创建的热点名与密码
  const char * ssid = "I_K's ESP32S3";
  const char * password = "12345678";
  // 创建热点
  WiFi.softAP(ssid, password);
  //  打印热点 IP
  Serial.print("Wi-Fi 接入的 IP:");
  Serial.println(WiFi.softAPIP());
}
//自定义区域函数区域************************************

//MAIN函数区域****************************************
void setup() 
{
  Serial.begin(115200);
  led_init(LED);
  key_init(KEY);
  adc_init();
  //wifi_STA_init();//sta模式和ap模式只能同时开启一个
  //wifi_AP_init();
  //ledc_pwm_init();
  //attachInterrupt(digitalPinToInterrupt(KEY),key_control_led_blink_test_ISR,RISING);   //外部中断使能
  timer_init();//定时器中断使能
}

void loop() 
{
  //led_blink_test_blockingDelay(LED,delaytime);
  //led_blink_test_non_blockongDelay(LED,delaytime);
  //key_control_led_blink_test1(KEY,LED);
  //key_control_led_blink_test2(KEY,LED);
  //Serial.write("Hello, world!");
  //pwm_control_led_test(LED);
  //ledc_pwm_output();
  //adc_test();
  
}
//MAIN函数区域****************************************



//中断服务函数定义区域
void key_control_led_blink_test_ISR(void)//外部中断
{
  led_status = !led_status;
  digitalWrite(LED,led_status);
}
void timer0_ISR(void)//timer0中断
{
  digitalWrite(LED, !digitalRead(LED));//又是一种新奇的写法
}
//中断服务函数定义区域
//回调函数定义区域

//回调函数定义区域
/*
1.常用库名称
Wire:i2c SPI:spi Serial:串行通信 WiFi:wifi通信 Serivo:舵机 SD:sd-card 
Stepper:步进电机 DHT:温湿度传感器
在使用Arduino库时,通常需要在代码的顶部包含库的头文件,通过 #include 指令包含在程序中,然后就可以使用库中的功能了。
2.delay()是阻塞形式的延时函数,等待延时的期间无法进行其他的进程
millis()是非阻塞形式的计时函数,用于获得当前的时间,可以进行其他的函数进程
3.按键消抖
软件消抖:主要是通过编程的方法,设定一个延迟或计时器,确保在一定的时间内只读取一次按键状态
硬件消抖:在按键电路中加入元器件如电阻、电容组成的RC低通滤波器,对按键信号平滑处理,降低抖动影响
按键检测跳变沿比检测电平好使
4.中断: 
硬件中断:需要用到预先定义的中断服务程序 ISR中来响应
软件中断:由软件指令引发(举例:操作系统的系统调用)
中断中非必要不放置阻塞延时函数(delay)和串口通信函数(Serial)
与主程序共享的变量要加上 volatile 关键字
外部中断是硬件中断的一种,他又微控制器的外部事件引发,微控制器的某些引脚被设定为对特定事件的发生做出反应,例如按键的按压,传感器的信号改变等.esp32s3的外部中断有上升沿触发、下降沿触发、低电平触发、高电平触发
attachInterrupt(digitalPinToInterrupt(pin);ISR, mode);其中CHANGE RISING FALLING LOW HIGH是不同的触发mode
5.串口通信
分类:单工 半双工 全双工
常见通讯协议:ASCII modbus rs232  本IDE中Serial库就是用来进行串口通信的
串口通信的参数包括
波特率:衡量通信速度的参数,表示每秒传递的bit的个数
数据位:衡量通信中实际数据位的参数
校验位:奇偶校验位,表示一种简单的检查错误的方式
停止位:用于表示单个信息包的最后位,典型值有1,1.5,2位,停止位仅仅表示传输的结束,还能提供校正时钟同步的机会。停止位的位数越多,不同时钟同步的容忍程度越大,但是数据的传输效率越慢 
6.回调函数:回调函数是在特定情况下被调用的函数,而不是在程序的线性循环执行流程中被调用。类似于中断服务函数,它可以用来处理异步操作、事件触发、消息传递等情况。
 Serial.onReceive(Function)用于将Function函数注册为串口回调函数,通过在setup()中放置该函数,就不需要在loop()函数中轮询串口的可用性 
 7.PWM
频率,占空比外,esp32还有个参数分辨率。8 位分辨率就表示设备可以输出 2^8 个不同占空比级别,即 0%、1/256、2/256 … 直到 100%。有两个硬件外设 LEDC(ledpwm控制器)和MCPWM(电机控制脉宽调制器)
8.ADC
esp32s3集成了两个12位的adc,每个adc有10个通道,最多可以测量20个管脚的电压,该芯片内部还有一个随温度传感器,温度不同,内部adc的电压就不一样
adc分配 gpio1-10 对应adc1通道0-9 gpio11-20 对应adc2通道0-9
analogRead是arduino库,默认12位的分辨率
*/

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值