logo
当前位置:首 页 > 硬件技术 >ESP8266 > 查看文章

新版的安信可NONOS SDK【v3.0】这2天调试发现虽然 os_delay_us还存在 ,但是delay_ms已经被废弃,而且使用之前的函数代码

  1. while(1){
  2. system_soft_wdt_feed();
  3. delay_ms(1000);
  4.  
  5. }

 

 

打印出的内容会一直重启,应该是狗【DOG】没有喂到,我测试了下,虽然使用的延时是1000毫秒,但是超出了狗的3秒还没有反应。

 

NONOS SDK都3.0的时代了,所以应该改版下了,看了SDK的文档,发现很早的时候时间定时器就已经了,已经不提倡用我们89C51的那个时代的delay的方法了。

新出了个软件定时器 oa_timer_arm();

而且官方还说如果要精确定时,去找硬件定时器吧,软件解决不了 的

 

 

硬件定时器在hw_timer.c中可以找到,今天说的是软件定时器。

 

软件定时器的设置步骤:

1.先定义一个定时器结构体和LED状态标志变量【在3。0中使用的比较多的头文件都已经包含了,不需要再重新引用】

 

  1. u8 Led_Flag = 0; //LED的状态标志位
  2. os_timer_t OS_Timer; //定义软件定时器(os_timer_t型结构体)

 

 

2、定义软件定时的回调函数

我们在回调函数中实现LED灯的闪烁,输出LED的状态和进入回调函数的提示。

  1. void ICACHE_FLASH_ATTR
  2. OS_Timer_cb(void)
  3. {
  4. Led_Flag = !Led_Flag; //LED状态翻转
  5.  
  6. //设置GPIO4的输出值,即LED的值
  7. GPIO_OUTPUT_SET(GPIO_ID_PIN(4),Led_Flag);
  8. system_soft_wdt_feed(); //喂下狗 防止 硬件重置
  9. os_printf("\r\nLED的状态为:%d\r\n",Led_Flag);
  10. os_printf("\r\n-----------进入回调函数-----------\r\n");
  11. }

 

我写代码的时候喜欢使用的方式

 

  1. void ICACHE_FLASH_ATTR
  2. OS_Timer_cb(void)
  3. {
  4. Led_Flag++; //LED状态加一
  5.  
  6. //设置GPIO4的输出值,即LED的值
  7. GPIO_OUTPUT_SET(GPIO_ID_PIN(4),Led_Flag %2); //使用求余的方式,如果是多个等或者等有多个状态,和翻转状态相比会容易控制
  8.  
  9. os_printf("\r\nLED的状态为:%d\r\n",Led_Flag);
  10. os_printf("\r\n-------------进入回调函数-------------\r\n");
  11. }

 

3、封装软件定时器初始化函数(ms毫秒)

我们将函数进行封装,以便在初始化的时候直接调用。

(1)首先要关闭定时器,参数是要关闭的定时器

(2)接着设置定时器:

         第一个参数是:需要设置的定时器,

         第二个参数是:回调函数(需要要类型转换)

         第三个参数是:回调函数的参数

         注意:os_timer_setfn必须在软件定时器未使能的情况下调用

(3)使能毫秒定时器:

         第一个参数是:要使能的定时器,

         第二个参数是:定时时间(单位:ms)

         第三个参数是:定时器是否重复。1=重复/0=只一次

  1. void ICACHE_FLASH_ATTR
  2. OS_Timer_Init(u32 time_ms,bool repeat_flag)
  3. {
  4. //关闭定时器
  5. os_timer_disarm(&OS_Timer);
  6.  
  7. //设置定时器回调函数
  8. os_timer_setfn(&OS_Timer, (os_timer_func_t *)OS_Timer_cb,NULL);
  9.  
  10.  
  11. os_timer_arm(&OS_Timer, time_ms, repeat_flag);
  12.  
  13. //设置定时器参数并使能定时器
  14. //【如未调用system_timer_reinit,可支持范围:[5ms ~ 6,870,947ms]】
  15. //【如果调用system_timer_reinit,可支持范围:[100ms ~ 428,496 ms]】
  16. }

4GPIO初始化函数
  1. void ICACHE_FLASH_ATTR
  2. gpio_Init(void)
  3. {
  4. //将GPIO4设置为IO口
  5. PIN_FUNC_SELECT( PERIPHS_IO_MUX_GPIO4_U,FUNC_GPIO4);
  6.  
  7. //将管脚设为输出模式,并输出高电平
  8. GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1);
  9. }
5、主函数
  1. void ICACHE_FLASH_ATTR user_init(void)
  2. {
  3.  
  4. os_delay_us(10000);//等待串口稳定
  5. gpio_Init();
  6. os_printf("\r\n----------------------------------------\r\n");
  7.  
  8. //定时1秒,重复
  9. OS_Timer_Init(1000,1); //隔一秒进入回调函数
  10.  
  11.  
  12. os_printf("\t SDK version:\t%s", system_get_sdk_version());
  13. os_printf("\r\n----------------------------------------\r\n");
  14. }
说说梦想,谈谈感悟 ,聊聊技术,有啥要说的来github留言吧 https://github.com/cjx2328

—— 陈 建鑫

陈建鑫
footer logo
未经许可请勿自行使用、转载、修改、复制、发行、出售、发表或以其它方式利用本网站之内容。站长联系:cjx2328#126.com(修改#为@)
Copyright ©ziao design Studio All Rights Reserved.沪ICP备14052271号-3