欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

ESP32-C3硬件定時(shí)器簡(jiǎn)介及使用

CHANBAEK ? 來源:編程圈子 ? 作者:編程圈子 ? 2023-03-14 11:43 ? 次閱讀

一、 簡(jiǎn)介

ESP32-C3硬件定時(shí)器分辨率高,一般可用于:

  • 獲取時(shí)間戳
  • 周期性任務(wù)

本文主要內(nèi)容參考 官網(wǎng)API文檔

本文主要代碼參考 來自這里

ESP32-C3 有2個(gè)定時(shí)器組,每個(gè)組有2個(gè)定時(shí)器,共有4個(gè)定時(shí)器。
每組定時(shí)器包括一個(gè)普通定時(shí)器和一個(gè)看門狗定時(shí)器。

timer_types.h 里可以看到結(jié)構(gòu)體的定義:

typedef enum {
    TIMER_GROUP_0 = 0, /*!

每個(gè)通用硬件定時(shí)器都是基于16位預(yù)分頻器和64位自動(dòng)重載功能的向上/向下計(jì)數(shù)的64位通用定時(shí)器。

二、使用步驟

  1. 資源分配
  2. 設(shè)置和獲取計(jì)數(shù)器值
  3. 設(shè)置報(bào)警動(dòng)作
  4. 注冊(cè)事件回調(diào)函數(shù)
  5. 使能或禁用定時(shí)器
  6. 啟動(dòng)和停止定時(shí)器

其它的操作有:

三、操作函數(shù)

1. 基本操作

(1)定時(shí)器實(shí)例gptimer_handle_t

(2) 定時(shí)器配置結(jié)構(gòu)體gptimer_config_t

使用結(jié)構(gòu)體 gptimer_config_t 來創(chuàng)建定時(shí)器實(shí)例, gptimer_config_t 結(jié)構(gòu)體的屬性值:

  • gptimer_config_t::clk_src 選擇定時(shí)器的時(shí)鐘源,枚舉值: gptimer_clock_source_t
  • gptimer_config_t::direction 設(shè)置定時(shí)器的計(jì)數(shù)方向,枚舉值: gptimer_count_direction_t
  • gptimer_config_t::resolution_hz 設(shè)置內(nèi)部計(jì)數(shù)器的分辨率,計(jì)數(shù)器滴答一次用時(shí)秒數(shù)為:1 r e s o l u t i o n _ h z \\frac {1} {resolution_hz} resolution _hz1
  • gptimer_config_t::intr_shared 設(shè)置是否將定時(shí)器中斷源標(biāo)記為共享源。
    示例:
// 配置定時(shí)器,默認(rèn)時(shí)鐘源:APB
    timer_config_t config = {
            .divider = TIMER_DIVIDER,       //定時(shí)器預(yù)分頻;esp32-c3的APB_CLK=80MHz,80MHz/TIMER_DIVIDER(16)=5MHz
            .counter_dir = TIMER_COUNT_UP,  //計(jì)數(shù)器向上計(jì)數(shù),從0開始
            .counter_en = TIMER_PAUSE,      //計(jì)數(shù)器暫時(shí)中止
            .alarm_en = TIMER_ALARM_EN,     //定時(shí)器警報(bào)使能
            .auto_reload = auto_reload,     //1:定時(shí)器硬件在警報(bào)事件后自動(dòng)重裝載;0:則相反
    };

(3) 定時(shí)器初始化timer_init()

示例:

/*
    * 函數(shù)功能:初始化和配置定時(shí)器
    * group_num:定時(shí)器分組值, 從0開始
    * timer_num:定時(shí)器序號(hào),從0開始 【一組定時(shí)器包含:普通定時(shí)器,看門狗定時(shí)器】
    * *config:  定時(shí)器配置結(jié)構(gòu)體
    */
    timer_init(group, timer, &config);

(3) 設(shè)置定時(shí)器初值timer_set_counter_value()

示例:

// 設(shè)置定時(shí)器值,如果設(shè)置了auto_reload,則報(bào)警后會(huì)也會(huì)重置為此值
    timer_set_counter_value(group, timer, 0);

(4)設(shè)置報(bào)警值timer_set_alarm_value()

示例:

// 設(shè)置報(bào)警值、使能中斷ISR
    timer_set_alarm_value(group, timer, timer_interval_sec * TIMER_SCALE);

(5)使用定時(shí)器timer_enable_intr()

示例:

// 使能定時(shí)器組(group)、定時(shí)器x(timer)中斷
    timer_enable_intr(group, timer);

(6) 定時(shí)器添加ISR中斷回調(diào)timer_isr_callback_add()

示例:

// 定時(shí)器添加ISR中斷回調(diào)函數(shù)
    timer_info_t *timer_info = calloc(1, sizeof(timer_info_t));
    timer_info->timer_group = group;
    timer_info->timer_idx = timer;
    timer_info->auto_reload = auto_reload;
    timer_info->alarm_interval = timer_interval_sec;
    timer_isr_callback_add(group, timer, timer_group_isr_callback, timer_info, 0);//???

(7)啟動(dòng)定時(shí)器timer_start()

示例:

timer_start(group, timer);

(8) 獲取定時(shí)器值timer_get_counter_value()

示例:

uint64_t task_counter_value;
        // 獲取定時(shí)器組,中定時(shí)器,的計(jì)數(shù)器的值;
        timer_get_counter_value(evt.info.timer_group, evt.info.timer_idx, &task_counter_value);

2. 其它操作

(1) 創(chuàng)建新定時(shí)器gptimer_new_timer()

示例: 創(chuàng)建分辨率為1 MHz 的通用定時(shí)器:

gptimer_handle_t gptimer = NULL;
gptimer_config_t timer_config = {
    .clk_src = GPTIMER_CLK_SRC_DEFAULT,
    .direction = GPTIMER_COUNT_UP,
    .resolution_hz = 1 * 1000 * 1000, // 1MHz, 1 tick = 1us
};
ESP_ERROR_CHECK(gptimer_new_timer(&timer_config, &gptimer));

(2) 設(shè)置和獲取計(jì)數(shù)值gptimer_get_raw_count()

gptimer_get_raw_count 用來獲取計(jì)數(shù)值。

  • 創(chuàng)建計(jì)數(shù)器后,內(nèi)部計(jì)數(shù)器將默認(rèn)重置為0
  • 計(jì)數(shù)值重置時(shí),將會(huì)從新值計(jì)數(shù)。
  • 計(jì)數(shù)值達(dá)最大值后將重置,最大值與SOC宏: SOC_TIMER_GROUP_COUNTER_BIT_WIDTH 有關(guān)。

3. 使能和禁用定時(shí)器

(1)使能gptimer_enable()

此函數(shù)功能:

  • 將定時(shí)器驅(qū)動(dòng)的狀態(tài)從init切換為enable
  • 如果gptimer_register_event_callbacks() 已經(jīng)延遲安裝中斷服務(wù),此函數(shù)將使能中斷服務(wù)
  • 如果選擇了特定的時(shí)鐘源,此函數(shù)將獲取適當(dāng)?shù)?a target="_blank">電源管理鎖。

(2)禁用gptimer_disable

4. 啟動(dòng)和停止定時(shí)器

(1)啟動(dòng)gptimer_start()

(2)停止gptimer_stop()

四、示例程序

#include "freertos/FreeRTOS.h"
#include "freertos/queue.h"
#include "driver/timer.h"

#define TIMER_DIVIDER         (16)  //  Hardware timer clock divider
// 計(jì)數(shù)值轉(zhuǎn)為秒
#define TIMER_SCALE           (TIMER_BASE_CLK / TIMER_DIVIDER)

typedef struct {
    // 定時(shí)器組號(hào)
    int timer_group;
    // 定時(shí)器序號(hào)
    int timer_idx;
    // 報(bào)警時(shí)間
    int alarm_interval;
    // 是否自動(dòng)重裝
    bool auto_reload;
} timer_info_t;

// 定義一個(gè)示例結(jié)構(gòu)體
typedef struct {
    // 定時(shí)器的參數(shù)
    timer_info_t info;
    // 計(jì)數(shù)器值
    uint64_t timer_counter_value;
} timer_event_t;

// 主程序接收?qǐng)?bào)警數(shù)據(jù)的隊(duì)列
static xQueueHandle s_timer_queue;

/*
* A simple helper function to print the raw timer counter value
* and the counter value converted to seconds
*/
static void inline print_timer_counter(uint64_t counter_value)
{
printf("Counter: 0x%08x%08x \\t", (uint32_t) (counter_value >> 32),
(uint32_t) (counter_value));
printf("Time   : %.8f s\\r\\n", (double) counter_value / TIMER_SCALE);
}

/**
 * 報(bào)警回調(diào)函數(shù)
 * @param args timer_info_t結(jié)構(gòu)體
 * @return
 */
static bool IRAM_ATTR timer_group_isr_callback(void *args)
{
    // 計(jì)算回調(diào)函數(shù)返回值
    BaseType_t high_task_awoken = pdFALSE;
    timer_info_t *info = (timer_info_t *) args;

    // 在ISR中獲取計(jì)數(shù)器值
    uint64_t timer_counter_value =
            timer_group_get_counter_value_in_isr(info->timer_group, info->timer_idx);

    // 將定時(shí)器中斷響應(yīng)的定時(shí)器賦予結(jié)構(gòu)體變量evt
    timer_event_t evt = {
            .info.timer_group = info->timer_group,
            .info.timer_idx = info->timer_idx,
            .info.auto_reload = info->auto_reload,
            .info.alarm_interval = info->alarm_interval,
            .timer_counter_value = timer_counter_value
    };

    // 定時(shí)器組中的定時(shí)器,是否有自動(dòng)重載
    if (!info->auto_reload) {
        timer_counter_value += info->alarm_interval * TIMER_SCALE;
        // 重置定時(shí)器組中定時(shí)器的時(shí)間間隔(定時(shí)器自身的時(shí)間間隔)
        timer_group_set_alarm_value_in_isr(info->timer_group, info->timer_idx, timer_counter_value);
    }

    // 以隊(duì)列形式把數(shù)據(jù)發(fā)送到主函數(shù),消息存儲(chǔ)在結(jié)構(gòu)體evt中
    // high_task_awoken 用于接收返回值
    xQueueSendFromISR(s_timer_queue, &evt, &high_task_awoken);

    return high_task_awoken == pdTRUE;
}

/**
* @brief 初始化定時(shí)器
*
* @param group 定時(shí)器組序號(hào),從0開始
* @param timer timer ID, 從0開始
* @param auto_reload 是否自動(dòng)重載
* @param timer_interval_sec 間隔
*/
static void timer_config_start(int group, int timer, bool auto_reload, int timer_interval_sec)
{
    // 配置定時(shí)器,默認(rèn)時(shí)鐘源:APB
    timer_config_t config = {
            .divider = TIMER_DIVIDER,       //定時(shí)器預(yù)分頻;esp32-c3的APB_CLK=80MHz,80MHz/TIMER_DIVIDER(16)=5MHz
            .counter_dir = TIMER_COUNT_UP,  //計(jì)數(shù)器向上計(jì)數(shù),從0開始
            .counter_en = TIMER_PAUSE,      //計(jì)數(shù)器暫時(shí)中止
            .alarm_en = TIMER_ALARM_EN,     //定時(shí)器警報(bào)使能
            .auto_reload = auto_reload,     //1:定時(shí)器硬件在警報(bào)事件后自動(dòng)重裝載;0:則相反
    };
    /*
    * 函數(shù)功能:初始化和配置定時(shí)器
    * group_num:定時(shí)器分組值, 從0開始
    * timer_num:定時(shí)器序號(hào),從0開始 【一組定時(shí)器包含:普通定時(shí)器,看門狗定時(shí)器】
    * *config:  定時(shí)器配置結(jié)構(gòu)體
    */
    timer_init(group, timer, &config);

    // 設(shè)置定時(shí)器值,如果設(shè)置了auto_reload,則報(bào)警后會(huì)也會(huì)重置為此值
    timer_set_counter_value(group, timer, 0);

    // 設(shè)置報(bào)警值、使能中斷ISR
    timer_set_alarm_value(group, timer, timer_interval_sec * TIMER_SCALE);

    // 使能定時(shí)器組(group)、定時(shí)器x(timer)中斷
    timer_enable_intr(group, timer);

    // 定時(shí)器添加ISR中斷回調(diào)函數(shù)
    timer_info_t *timer_info = calloc(1, sizeof(timer_info_t));
    timer_info->timer_group = group;
    timer_info->timer_idx = timer;
    timer_info->auto_reload = auto_reload;
    timer_info->alarm_interval = timer_interval_sec;
    timer_isr_callback_add(group, timer, timer_group_isr_callback, timer_info, 0);//???
    // 啟動(dòng)定時(shí)器
    timer_start(group, timer);
}

void app_main(void)
{
    // xQueueCreate是freeRTOS宏,用于創(chuàng)建隊(duì)列實(shí)例
    s_timer_queue = xQueueCreate(10, sizeof(timer_event_t));

    // 配置定時(shí)器組1,中的定時(shí)器0,無自動(dòng)重裝,間隔是5s
    timer_config_start(TIMER_GROUP_1, TIMER_0, false, 10);

    while (1) {
        timer_event_t evt;
        // 等待隊(duì)列事件,時(shí)間是永遠(yuǎn)等待
        xQueueReceive(s_timer_queue, &evt, portMAX_DELAY);

        // 定時(shí)器組自動(dòng)重裝
        if (evt.info.auto_reload) {
            printf("====== Timer Group with auto reload ======\\n");
        } else {
            printf("====== Timer Group without auto reload ======\\n");
        }
        printf("------ Group[%d], timer[%d] alarm event ------\\n", evt.info.timer_group, evt.info.timer_idx);

        // 打印事件上報(bào)的計(jì)數(shù)器值
        printf("[ evt.timer_counter_value ] ");
        print_timer_counter(evt.timer_counter_value);

        // 直接從定時(shí)器獲取計(jì)數(shù)器值
        printf("[timer.timer_counter_value] ");
        uint64_t task_counter_value;
        // 獲取定時(shí)器組,中定時(shí)器,的計(jì)數(shù)器的值;
        timer_get_counter_value(evt.info.timer_group, evt.info.timer_idx, &task_counter_value);
        print_timer_counter(task_counter_value);
    }
}

運(yùn)行結(jié)果:

====== Timer Group without auto reload ======
------ Group[1], timer[0] alarm event ------
[ evt.timer_counter_value ] Counter: 0x0000000002faf089 	Time   : 10.00000180 s
[timer.timer_counter_value] Counter: 0x0000000002fb43ab 	Time   : 10.00425820 s
====== Timer Group without auto reload ======
------ Group[1], timer[0] alarm event ------
[ evt.timer_counter_value ] Counter: 0x0000000005f5e112 	Time   : 20.00000360 s
[timer.timer_counter_value] Counter: 0x0000000005f632f5 	Time   : 20.00419620 s

如果 timer_config_start函數(shù)的auto_reload設(shè)置為true,則輸出示例:

可以看到達(dá)到報(bào)警值后,計(jì)數(shù)器值會(huì)還原。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 硬件
    +關(guān)注

    關(guān)注

    11

    文章

    3395

    瀏覽量

    66476
  • 分頻器
    +關(guān)注

    關(guān)注

    43

    文章

    448

    瀏覽量

    50082
  • 定時(shí)器
    +關(guān)注

    關(guān)注

    23

    文章

    3256

    瀏覽量

    115407
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4346

    瀏覽量

    62990
  • ESP32-C3
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    439
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    淺談ESP32-C3ESP32-S3芯片

    ESP32-C3、ESP32-S3的發(fā)布,不僅為IOT行業(yè)提供了高性價(jià)比、穩(wěn)定、好用、安全的通訊層,支持AI加速,同時(shí)在顯示層應(yīng)用也將占有一席之地。
    發(fā)表于 04-28 10:37 ?1.9w次閱讀

    ESP32-C3芯片的性價(jià)比有多高

    今天小明為大家捋一捋ESP32-C3性價(jià)比到底有多高呢?很多在說樂鑫急著發(fā)布ESP32-C3ESP32-S3,是在布一個(gè)大局,到底在布啥局呢?
    發(fā)表于 04-28 09:52 ?5357次閱讀
    <b class='flag-5'>ESP32-C3</b>芯片的性價(jià)比有多高

    ESP32-C3芯片特性介紹

    它的性價(jià)比到底有多高呢?ESP32-C3首先它是一款安全穩(wěn)定、低功耗、低成本的物聯(lián)網(wǎng)芯片,搭載RISC-V32位單核處理,支持2.4GHzWi-Fi和BluetoothLE5.0。為物聯(lián)網(wǎng)產(chǎn)品提供
    發(fā)表于 04-28 09:44 ?1.3w次閱讀

    淺談ESP32-C3芯片的應(yīng)用領(lǐng)域

    之前大家期待已久的ESP32-C3,將在4月份量產(chǎn)啦!屆時(shí)大家可以看到它的真面目。那么介紹了那么多,它的應(yīng)用有哪些?
    發(fā)表于 04-06 14:31 ?3345次閱讀

    ESP32-C3芯片到底有哪些特性

    五一假期,讓大家身處快樂星球一般?,F(xiàn)在假期結(jié)束了,快樂難道就消失了嗎?答案是否定的。快樂其實(shí)很簡(jiǎn)單,本月樂鑫esp32驅(qū)動(dòng)86面板,esp32-C3 +2.4寸彩屏,esp32- C3
    發(fā)表于 06-01 18:12 ?3070次閱讀

    ESP32-C3模組芯片的功能特性

    重磅消息來嘍!本月樂鑫esp32驅(qū)動(dòng)86面板,esp32-C3 +2.4寸彩屏,esp32- C3+1.3寸圓屏 QSPI即將出品!一顆mcu搞定WIFI藍(lán)牙和驅(qū)動(dòng)彩屏,而且
    發(fā)表于 06-03 11:22 ?2164次閱讀

    基于nanoESP32-C3開發(fā)板用ESP32-c3下試跑Zephyr

    上周MuseLab的吳同學(xué)寄來一片nanoESP32-C3–一塊帶有ESPLink(base DAPlink)的ESP32-C3開發(fā)板。 正好最近支持esp32-c3的pr已經(jīng)merge進(jìn)入
    的頭像 發(fā)表于 08-09 09:10 ?9614次閱讀

    ESP32ESP-IDF 教學(xué)(三)——通用硬件定時(shí)器(Timer)

    ESP32ESP-IDF 學(xué)習(xí)筆記(三)【通用硬件定時(shí)器(Timer)】文章目錄ESP32E
    發(fā)表于 11-26 11:36 ?38次下載
    <b class='flag-5'>ESP32</b> 之 <b class='flag-5'>ESP</b>-IDF 教學(xué)(三)——通用<b class='flag-5'>硬件</b><b class='flag-5'>定時(shí)器</b>(Timer)

    【DFRobot Beetle ESP32-C3開發(fā)板試用體驗(yàn)】車載導(dǎo)航天氣掛件?

    1602A顯示屏 合宙Air 551G導(dǎo)航模塊 DFRobot Beetle ESP32-C3開發(fā)板 杜邦線若干 連接方式 跟之前的連接一樣。 ESP32-C3通過自制一分二的線分別給LCD屏幕和Air
    的頭像 發(fā)表于 11-28 11:01 ?1403次閱讀
    【DFRobot Beetle <b class='flag-5'>ESP32-C3</b>開發(fā)板試用體驗(yàn)】車載導(dǎo)航天氣掛件?

    【DFRobot Beetle ESP32-C3開發(fā)板試用體驗(yàn)】與GNSS模塊串口通信

    Beetle ESP32-C3 合宙Air 551G LCD 1602A顯示屏 杜邦線若干 連線 ESP32-C3通過自制一分二的線分別給LCD屏幕和Air 551G供電。 ESP32-C3的Pin 8
    的頭像 發(fā)表于 11-28 11:06 ?1073次閱讀
    【DFRobot Beetle <b class='flag-5'>ESP32-C3</b>開發(fā)板試用體驗(yàn)】與GNSS模塊串口通信

    【DFRobot Beetle ESP32-C3開發(fā)板試用體驗(yàn)】開箱和1602A顯示

    提供的 DFRobot Beetle ESP32-C3 開發(fā)板 試用機(jī)會(huì)。 拿到板子后,感覺的確是很小,比之前買的一個(gè)esp32 C3板子要小上一半。盒子里包含ESP32-C3開發(fā)板、
    的頭像 發(fā)表于 11-28 14:06 ?1915次閱讀
    【DFRobot Beetle <b class='flag-5'>ESP32-C3</b>開發(fā)板試用體驗(yàn)】開箱和1602A顯示

    DFRobot Beetle ESP32-C3 DIY運(yùn)動(dòng)按鈕 讓你隨時(shí)隨地動(dòng)起來

    DFRobot Beetle ESP32-C3 DIY運(yùn)動(dòng)按鈕是一款基于ESP32-C3 RISC-V 32 位單核處理制作的小型主控。它集成了鋰電池充電管理功能,可以通過USB-
    發(fā)表于 12-15 15:16 ?443次閱讀
    DFRobot Beetle <b class='flag-5'>ESP32-C3</b> DIY運(yùn)動(dòng)按鈕 讓你隨時(shí)隨地動(dòng)起來

    啟明云端分享|盤點(diǎn)Esp32-C3Esp8266 的區(qū)別

    ESP8266&ESP32-C3硬件區(qū)別從上表可以看出ESP32-C3ESP8266在硬件上的
    的頭像 發(fā)表于 10-12 18:31 ?5313次閱讀
    啟明云端分享|盤點(diǎn)<b class='flag-5'>Esp32-C3</b>與<b class='flag-5'>Esp</b>8266 的區(qū)別

    啟明云端測(cè)試分享|ESP32-C3連接阿里云

    啟明云端手把手教程ESP32-C3連接阿里云
    的頭像 發(fā)表于 09-13 15:10 ?2815次閱讀
    啟明云端測(cè)試分享|<b class='flag-5'>ESP32-C3</b>連接阿里云

    ESP32-C3在智能充電樁上的應(yīng)用,性價(jià)比爆棚!

    ESP32-C3在智能充電樁上的應(yīng)用,性價(jià)比爆棚!
    的頭像 發(fā)表于 01-20 08:03 ?961次閱讀
    <b class='flag-5'>ESP32-C3</b>在智能充電樁上的應(yīng)用,性價(jià)比爆棚!