目录

ESP32入门之点灯

学习一门编程语言,第一个教程是输出hello world。而学习单片机,第一个教程通常是点灯

利用延时函数闪灯

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
void setup()
{
    // 开启串口,并配置波特率
    Serial.begin(115200);
    // 配置灯的管脚模式
    pinMode(BUILTIN_LED, OUTPUT);
    // 高电平灯灭
    digitalWrite(BUILTIN_LED, HIGH);
}

void loop()
{
    delay(1000);
    digitalWrite(BUILTIN_LED, LOW);
    delay(1000);
    digitalWrite(BUILTIN_LED, LOW);
    // 任务
    Serial.println("hello world");
}

使用延时函数闪灯,最大的缺点是,后面的任务被阻塞了。就是说灯在延时的过程时,任务不会执行。而任务执行的时候,灯就不会闪烁,灯被任务阻塞了。

而我们希望任务一直执行,一旦闪灯的时间到了,立即闪灯。哈哈,那不就是外部中断吗?给个定时器中断不就好了吗?

定时器闪灯

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// 引入 esp32 定时器中断库
#include <Ticker.h>

// 定义闪灯定时器
Ticker shanTicker;

void shanshuo()
{
    uint8_t status = digitalRead(BUILTIN_LED);
    digitalWrite(BUILTIN_LED, !status);
}

void setup()
{
    Serial.begin(115200);
    // 配置灯的管脚模式
    pinMode(BUILTIN_LED, OUTPUT);
    // 高电平灯灭
    digitalWrite(BUILTIN_LED, HIGH);
    // 开启定时器,到了 1 秒就触发外部中断,执行回调函数 shanshuo
    shanTicker.attach(1, shanshuo);
}

void loop()
{
    // 任务
    Serial.println("hello world");
}

这样任务和闪灯,就能交替执行了。记住定时器中断的优先级比任务高。

esp32 是多核的,那我们能不能利用==多核==,让闪灯和任务同时执行。