码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • ESP32-arduino,超好玩的定时器!


    前言

    嵌入式系统的主程序基本上是个大循环,如果在循环里要处理各个任务的请求的话,最粗暴的方式就是轮流查询,简称轮询, 轮询可以解决简单系统的问题,但当请求数量和处理复杂度提升的时候,难免捉襟见肘,中断就是为了解决“按需分配”的资源配置问题。

    当然,中断有很几种,外部中断、定时中断等,今天我们要介绍的就是中断里的定时中断!

    定时中断——定时执行的中断

    直奔主题,编写一个定时中断的程序需要几步呢?我们来编写一个简单的定时器程序,每秒打印一次,如下:

    1. 首先声明一个定时器
    /* timerBegin:初始化定时器指针
    		第一个参数:设置定时器0(一共有四个定时器0、1、2、3)
    		第二个参数:80分频(设置APB时钟,ESP32主频80MHz),80则时间单位为1Mhz即1us,1000000us即1s。
    		第三个参数:计数方式,true向上计数 false向下计数
     */
    timer = timerBegin(0, 80, true);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. 编写中断函数并绑定定时器
    /*
    	中断服务函数,为使编译器将代码分配到IRAM内,中断处理程序应该具有 IRAM_ATTR 属性
    */
    void IRAM_ATTR onTimer() {            
      Serial.println('1');
    }
    
    /* timerAttachInterrupt:绑定定时器
    		 第一个参数:指向已初始化定时器的指针
    		 第二个参数:中断服务器函数
    		 第三个参数:true边沿触发,false电平触发
    */
    timerAttachInterrupt(timer, &onTimer, true);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    1. 初始化定时器,指定定时器、分频、计数方式
    /* timerAlarmWrite:配置报警计数器保护值(就是设置时间)
    		 第一个参数:指向已初始化定时器的指针
    		 第二个参数:定时时间,这里为1000000us  意思为1s进入一次中断
    		 第三个参数:是否重载,false定时器中断触发一次  true:死循环
    */
    timerAlarmWrite(timer, 1000000, true); 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. 启用定时器
    	/* timerAlarmEnable:启用定时器
    			 第一个参数:指向已初始化定时器的指针
    	*/         
      timerAlarmEnable(timer);   
    
    • 1
    • 2
    • 3
    • 4
    1. 关闭定时器
    /*timerDetachInterrupt:关闭定时器
    	 	 第一个参数:指向已初始化定时器的指针
    */
    timerDetachInterrupt(timer);
    
    • 1
    • 2
    • 3
    • 4
    hw_timer_t * timer = NULL;                        // 声明一个定时器
    
    void IRAM_ATTR onTimer() {                        // 中断函数
      Serial.println('1');
    }
    
    void setup() {
      Serial.begin(115200);       
    	timer = timerBegin(0, 80, true);                // 初始化定时器指针        
      timerAttachInterrupt(timer, &onTimer, true);    // 绑定定时器
      timerAlarmWrite(timer, 1000000, true);          // 配置报警计数器保护值(就是设置时间)
    	timerAlarmEnable(timer);                        // 启用定时器
                      
    // timerDetachInterrupt(timer);                   // 关闭定时器         
    }
     
    void loop() {
     
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    需要注意的是:

    • 中断服务程序必须是一个返回void(空)且没有输入参数的函数。

    相关参考

    [ESP32系列教程]ESP32 Arduino教程:定时器中断

    ESP-Arduino玩转外设(五)中断基本概念及Timer中断

    ESP32 Timer实现

  • 相关阅读:
    【DTEmpower案例操作教程】智能模型预警
    关于Windows11的优化内容 - 进阶者系列 - 学习者系列文章
    C++思考和一些代码规范(09/28)
    二十七、CANdelaStudio深入-编辑技巧(一致性检查)
    基于哈希表对unordered_map和unordered_set的封装
    干货分享丨第五届“大数据安全与隐私计算”学术会议
    TypeScript学习笔记
    数字人ai直播软件突破AI大模型技术,改变未来科技格局!
    Ubuntu 18.04 配置 github ssh 连接
    python--短路运算,把0、空字符串和None看成 False,其他数值和非空字符串都看成 True
  • 原文地址:https://blog.csdn.net/qq_45430571/article/details/126651254
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号