实验现象:程序运行后配置高分辨率定时器,并开启中断,在中断回调函数中翻转LED的状态。
esptim.h文件负责声明ESPTIMER相关的函数和变量,而esptim.c文件则实现了ESPTIMER的驱动代码。
esptim.h
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_timer.h"
#include "led.h"
/* 函数声明 */
void esptim_int_init(uint64_t tps); /* 初始化初始化高分辨率定时器 */
void esptim_callback(void *arg); /* 定时器回调函数 */
esptim.c
#include "esptim.h"
/**
* @brief 初始化高精度定时器(ESP_TIMER)
* @param tps: 定时器周期,以微妙为单位(μs),以一秒为定时器周期来执行一次定时器中断,
* 那此处tps = 1s = 1000000μs
* @retval 无
*/
void esptim_int_init(uint64_t tps)
{
esp_timer_handle_t esp_tim_handle; /* 定时器回调函数句柄 */
/* 定义一个定时器结构体 */
esp_timer_create_args_t tim_periodic_arg = {
.callback = &esptim_callback, /* 设置回调函数 */
.arg = NULL, /* 不携带参数 */
};
esp_timer_create(&tim_periodic_arg, &esp_tim_handle); /* 创建一个事件 */
esp_timer_start_periodic(esp_tim_handle, tps); /* 每周期内触发一次 */
}
/**
* @brief 定时器回调函数
* @param arg: 不携带参数
* @retval 无
*/
void esptim_callback(void *arg)
{
LED_TOGGLE();
}
main.c
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "nvs_flash.h"
#include "led.h"
#include "esptim.h"
/**
* @brief 程序入口
* @param 无
* @retval 无
*/
void app_main(void)
{
esp_err_t ret;
ret = nvs_flash_init(); /* 初始化NVS */
if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
{
ESP_ERROR_CHECK(nvs_flash_erase());
ret = nvs_flash_init();
}
led_init(); /* 初始化LED */
esptim_int_init(1000000); /* 初始化高分辨率定时器,此处设置定时器周期为1秒,
但该函数事宜微妙为单位进行计算,
故而1秒钟换算为1000000微秒 */
}
从ESPTIMER的初始化代码中可以看到,结构体esp_timer_create_args_t通过其中两个结构体成员,以指针的形式调用定时器回调函数。
传入的参数 tim_periodic_arg,目的在于方便后续的调用,而 esp_timer_create()函数便是通过指针的方式完成对该结构体的调用,之后再通过esp_timer_start_periodic()函数设定周期,最终完成ESPTIMER的初始化配置。
在定时器回调函数中,我们调用了LED状态翻转函数,并设定,定时器的每一次计数溢出都会翻转一次LED的状态。
ESP定时器的周期值配置为1000000,因为ESP32-S3高分辨率定时器的计数周期是以微秒作为基础单位进行运算,所以当我们设定计数周期为 1秒时需要将单位换算为微秒。因此LED的闪烁周期为1秒
编写于:2024/11/13 15:52:07
发布 IP 属地:广东省深圳市
版权声明
阅读:74 点赞:0 留言:0
实验现象:程序运行后配置高分辨率定时器,并开启中断,在中断回调函数中翻转LED的状态。
esptim.h文件负责声明ESPTIMER相关的函数和变量,而esptim.c文件则实现了ESPTIMER的驱动代码。
esptim.h
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_timer.h"
#include "led.h"
/* 函数声明 */
void esptim_int_init(uint64_t tps); /* 初始化初始化高分辨率定时器 */
void esptim_callback(void *arg); /* 定时器回调函数 */
esptim.c
#include "esptim.h"
/**
* @brief 初始化高精度定时器(ESP_TIMER)
* @param tps: 定时器周期,以微妙为单位(μs),以一秒为定时器周期来执行一次定时器中断,
* 那此处tps = 1s = 1000000μs
* @retval 无
*/
void esptim_int_init(uint64_t tps)
{
esp_timer_handle_t esp_tim_handle; /* 定时器回调函数句柄 */
/* 定义一个定时器结构体 */
esp_timer_create_args_t tim_periodic_arg = {
.callback = &esptim_callback, /* 设置回调函数 */
.arg = NULL, /* 不携带参数 */
};
esp_timer_create(&tim_periodic_arg, &esp_tim_handle); /* 创建一个事件 */
esp_timer_start_periodic(esp_tim_handle, tps); /* 每周期内触发一次 */
}
/**
* @brief 定时器回调函数
* @param arg: 不携带参数
* @retval 无
*/
void esptim_callback(void *arg)
{
LED_TOGGLE();
}
main.c
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "nvs_flash.h"
#include "led.h"
#include "esptim.h"
/**
* @brief 程序入口
* @param 无
* @retval 无
*/
void app_main(void)
{
esp_err_t ret;
ret = nvs_flash_init(); /* 初始化NVS */
if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
{
ESP_ERROR_CHECK(nvs_flash_erase());
ret = nvs_flash_init();
}
led_init(); /* 初始化LED */
esptim_int_init(1000000); /* 初始化高分辨率定时器,此处设置定时器周期为1秒,
但该函数事宜微妙为单位进行计算,
故而1秒钟换算为1000000微秒 */
}
从ESPTIMER的初始化代码中可以看到,结构体esp_timer_create_args_t通过其中两个结构体成员,以指针的形式调用定时器回调函数。
传入的参数 tim_periodic_arg,目的在于方便后续的调用,而 esp_timer_create()函数便是通过指针的方式完成对该结构体的调用,之后再通过esp_timer_start_periodic()函数设定周期,最终完成ESPTIMER的初始化配置。
在定时器回调函数中,我们调用了LED状态翻转函数,并设定,定时器的每一次计数溢出都会翻转一次LED的状态。
ESP定时器的周期值配置为1000000,因为ESP32-S3高分辨率定时器的计数周期是以微秒作为基础单位进行运算,所以当我们设定计数周期为 1秒时需要将单位换算为微秒。因此LED的闪烁周期为1秒
编写于:2024/11/13 15:52:07
发布 IP 属地:广东省深圳市
版权声明
本站内容均来自网络转载或网友提供,如有侵权请及时联系我们删除!本站不承担任何争议和法律责任!
每一个童年的梦想都值得用青春去捍卫!