在大多数裸奔的单片机中,我们总是会在主函数main中,添加一个while(1)无限循环,保证程序一直执行不退出。但今天我们要讲的是在事件驱动的esp8266中,一般不能用while循环,更多的时候我们是添加定时器,在定时器的回调函数中添加要执行的代码,并让定时器重复定时来达到循环执行代码的目的。那么我们首先来看看esp8266里的软件定时器吧。
在esp8266的sdk中,有5个函数来操作软件定时器。请看:
1.os_timer_arm,该函数是使能毫秒级定时器。函数的定义如下图:
![esp8266模块软件定时 esp8266模块软件定时](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzIxNy8xYWE5ZTBiMTI1ZjAyNjc2NWI1OTdiZGRmMmJlMTc1OS5wbmc%3D.png?w=700&webp=1)
2.os_timer_arm_us,该函数是使能微秒级的定时器,最高精度为500us.请看函数的定义如下:
![esp8266模块软件定时 esp8266模块软件定时](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzIxMC8wNmFjYmFmMjYwYmRmY2NhMWRhZmI4NDQxMTU1OGUzMi5wbmc%3D.png?w=700&webp=1)
在使用该函数之前,需要调用system_timer_reinit来初始化软件定时器。
3.os_timer_disarm,此函数为取消定时器定时。在定时器初始化之前和定时器结束定时的时候调用。函数定义如下:
![esp8266模块软件定时 esp8266模块软件定时](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzUzMi9kOWZjMWMyMjhjYTQyOWFiOWY2MzJkMjg3NTg1NTE0Yy5wbmc%3D.png?w=700&webp=1)
![esp8266模块软件定时 esp8266模块软件定时](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzcyNC9iNDA2MTUwOTdlOGM5MGFmMGRkNDY5MDM2NDVmODFlYy5wbmc%3D.png?w=700&webp=1)
5.system_timer_reinit该函数是重新初始化定时器,当需要使用微妙定时器时调用。函数定义如下:
![esp8266模块软件定时 esp8266模块软件定时](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzk1MS9kYjk4N2JlOTQ0MDNhNWRkYzQ1YzJhOTU3MDQ5ZTFkZi5wbmc%3D.png?w=700&webp=1)
首先,定义一个定时器变量用来储存定时器对象。如下图:
![esp8266模块软件定时 esp8266模块软件定时](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzE4MS9lOTYxMjc0ODM0MTE1OTg0OWE4YjgwMTM4MDhlZjg5ZC5wbmc%3D.png?w=700&webp=1)
注意,此timer必须是个全局变量,如果定义一个局部变量。编译器不会报错,但是程序运行时会出现意想不到的的现象。
第二步, 我们定义一个定时器回调函数,当定时器到达时,调用该函数。如下图所示:
![esp8266模块软件定时 esp8266模块软件定时](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgwOS8zOGMwNDBhMmU5ZmM1MjBiYjlhOTkzNTkyYjdhMWM4MS5wbmc%3D.png?w=700&webp=1)
回调函数在每次调用时,简单的打印一下"Hello,are you OK?\n".注意,在回调函数里面,不能消耗太长的时间,更不宜做长时间等待等操作。
第三步,在用户主函数中,初始化定时器和设置定时器定时。本demo设置定时1000ms,并重复定时。代码如下:
![esp8266模块软件定时 esp8266模块软件定时](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzU1NC8xNzc4NmI4ODZiYzk4ZDQxMmI1YThmYzUwYzNkZGFhYS5wbmc%3D.png?w=700&webp=1)
第四步,保存编译。运行结果如下: