介绍
本节内容将会在ESP8266 SDK代码中使用硬件定时器创建一个定时任务,任务很简单
代码实现
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_spi_flash.h"
#include "driver/gpio.h"
#include "driver/hw_timer.h"
#include "esp_log.h"
#define LED_NUM 2
const char* TAG = "esp_timer";
uint16_t sec=0;
uint16_t msec=0;
bool led_status = false;
static esp_err_t delay_ms(uint32_t time)
{
vTaskDelay(time / portTICK_RATE_MS);
return ESP_OK;
}
void HeartbeatLED(void)
{
gpio_set_level(LED_NUM,0);
delay_ms(40);
gpio_set_level(LED_NUM,1);
delay_ms(70);
gpio_set_level(LED_NUM,0);
delay_ms(40);
gpio_set_level(LED_NUM,1);
}
void gpio_toggle(gpio_num_t gpio_num)
{
gpio_set_level(gpio_num,!gpio_get_level(gpio_num));
}
void hw_timer_callback1(void *arg)
{
msec++;
if(msec==1000)
{
led_status=!led_status;
msec=0;
sec++;
gpio_set_level(LED_NUM,led_status);
}
if(sec == 1000){
sec = 0;
}
}
void app_main()
{
gpio_config_t gpio_conf={
.pin_bit_mask = (1ULL << LED_NUM),
.mode = GPIO_MODE_OUTPUT,
.pull_down_en = false,
.pull_up_en = false,
.intr_type = GPIO_INTR_DISABLE
};
//初始化LED
ESP_ERROR_CHECK(gpio_config(&gpio_conf));
//初始化定时器
//1ms
hw_timer_init(hw_timer_callback1,NULL);
hw_timer_alarm_us(1000,true);
hw_timer_enable(1);
// vTaskDelay(1000 / portTICK_RATE_MS);
while(1){
ESP_LOGI(TAG,"VAL:%d val2:%d\n",msec,sec);
vTaskDelay(1000/portTICK_RATE_MS);
}
}
核心代码
//初始化定时器
hw_timer_init(hw_timer_callback1,NULL);
//设置定时器的定时级别 us级别
hw_timer_alarm_us(1000,true);
定时器回调函数
void hw_timer_callback1(void *arg)
{
msec++;
if(msec==1000)
{
led_status=!led_status;
msec=0;
sec++;
gpio_set_level(LED_NUM,led_status);
}
if(sec == 1000){
sec = 0;
}
}
在定时器回调函数中 我们现将ms相加 1000ms为1s执行一次任务 因为在定时器设置中 为1000us即1ms 所以累计到1000ms就是1s
##注意事项
不要在回调函数中使用printf 或者ESP_LOGI打印函数,调试过程中 加入它会导致程序崩溃也不要在里面运行长时间的函数,比如心跳灯间隔是30ms多 但是这个定时器中断时1ms进来一次 所以进来就会打断心跳灯的执行。
对于中断函数,一般的额原则是快进快出,不要在里面执行过多的操作,或者耗时的操作
对于LED的翻转电平操作,一般做法是读取电平值再翻转,但是使用gpio_get_level函数得到的永远是0 好像只有input模式才可以得到数据值,在ESP32中 单一的输出模式也会出现这个问题,解决方法是将其设置为输入输出模式,但是在8266上只有单独的输入或者输出模式 所以行不通 只能采取bool值翻转的方式来改变电平
效果展示
LED灯每隔一秒闪烁一次