新版的安信可NONOS SDK【v3.0】这2天调试发现虽然 os_delay_us还存在 ,但是delay_ms已经被废弃,而且使用之前的函数代码
- while(1){
- system_soft_wdt_feed();
- delay_ms(1000);
-
- }
打印出的内容会一直重启,应该是狗【DOG】没有喂到,我测试了下,虽然使用的延时是1000毫秒,但是超出了狗的3秒还没有反应。
NONOS SDK都3.0的时代了,所以应该改版下了,看了SDK的文档,发现很早的时候时间定时器就已经了,已经不提倡用我们89C51的那个时代的delay的方法了。
新出了个软件定时器 oa_timer_arm();
而且官方还说如果要精确定时,去找硬件定时器吧,软件解决不了 的
硬件定时器在hw_timer.c中可以找到,今天说的是软件定时器。
软件定时器的设置步骤:
1.先定义一个定时器结构体和LED状态标志变量【在3。0中使用的比较多的头文件都已经包含了,不需要再重新引用】
- u8 Led_Flag = 0; //LED的状态标志位
- os_timer_t OS_Timer; //定义软件定时器(os_timer_t型结构体)
2、定义软件定时的回调函数
我们在回调函数中实现LED灯的闪烁,输出LED的状态和进入回调函数的提示。
- void ICACHE_FLASH_ATTR
- OS_Timer_cb(void)
- {
- Led_Flag = !Led_Flag; //LED状态翻转
-
- //设置GPIO4的输出值,即LED的值
- GPIO_OUTPUT_SET(GPIO_ID_PIN(4),Led_Flag);
- system_soft_wdt_feed(); //喂下狗 防止 硬件重置
- os_printf("\r\nLED的状态为:%d\r\n",Led_Flag);
- os_printf("\r\n-----------进入回调函数-----------\r\n");
- }
我写代码的时候喜欢使用的方式
- void ICACHE_FLASH_ATTR
- OS_Timer_cb(void)
- {
- Led_Flag++; //LED状态加一
-
- //设置GPIO4的输出值,即LED的值
- GPIO_OUTPUT_SET(GPIO_ID_PIN(4),Led_Flag %2); //使用求余的方式,如果是多个等或者等有多个状态,和翻转状态相比会容易控制
-
- os_printf("\r\nLED的状态为:%d\r\n",Led_Flag);
- os_printf("\r\n-------------进入回调函数-------------\r\n");
- }
3、封装软件定时器初始化函数(ms毫秒)
我们将函数进行封装,以便在初始化的时候直接调用。
(1)首先要关闭定时器,参数是要关闭的定时器
(2)接着设置定时器:
第一个参数是:需要设置的定时器,
第二个参数是:回调函数(需要要类型转换)
第三个参数是:回调函数的参数
注意:os_timer_setfn必须在软件定时器未使能的情况下调用
(3)使能毫秒定时器:
第一个参数是:要使能的定时器,
第二个参数是:定时时间(单位:ms)
第三个参数是:定时器是否重复。1=重复/0=只一次
- void ICACHE_FLASH_ATTR
- OS_Timer_Init(u32 time_ms,bool repeat_flag)
- {
- //关闭定时器
- os_timer_disarm(&OS_Timer);
-
- //设置定时器回调函数
- os_timer_setfn(&OS_Timer, (os_timer_func_t *)OS_Timer_cb,NULL);
-
-
- os_timer_arm(&OS_Timer, time_ms, repeat_flag);
-
- //设置定时器参数并使能定时器
- //【如未调用system_timer_reinit,可支持范围:[5ms ~ 6,870,947ms]】
- //【如果调用system_timer_reinit,可支持范围:[100ms ~ 428,496 ms]】
- }
- void ICACHE_FLASH_ATTR
- gpio_Init(void)
- {
- //将GPIO4设置为IO口
- PIN_FUNC_SELECT( PERIPHS_IO_MUX_GPIO4_U,FUNC_GPIO4);
-
- //将管脚设为输出模式,并输出高电平
- GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1);
- }
- void ICACHE_FLASH_ATTR user_init(void)
- {
-
- os_delay_us(10000);//等待串口稳定
- gpio_Init();
- os_printf("\r\n----------------------------------------\r\n");
-
- //定时1秒,重复
- OS_Timer_Init(1000,1); //隔一秒进入回调函数
-
-
- os_printf("\t SDK version:\t%s", system_get_sdk_version());
- os_printf("\r\n----------------------------------------\r\n");
- }