ESP-12S学习(3)--软件定时器和硬件定时器500ms点亮LED

一、软件定时器的使用

ESP8266的软件定时器不是特别的精准,想要精准的定时器,那么最好是使用硬件定时器,这一点在SDK手册上面有说到

软定时有5个函数和一个结构体

结构体:os_timer_t
typedef struct _ETSTIMER_ {
    struct _ETSTIMER_    *timer_next;
    uint32_t              timer_expire;
    uint32_t              timer_period;
    ETSTimerFunc         *timer_func;
    void                 *timer_arg;
} ETSTimer;

结构体是不用用户去配置的,但是需要声明一个结构体


函数一:os_timer_setfn()

定时器设置回调函数的函数,这个函数有三个参数,分别是:

void os_timer_setfn(
	os_timer_t	*ptimer,			// 定时器结构体
	os_timer_func_t	*pfunction,		// 定时器回调函数
	void	*parg					// 回调函数的参数
)

回调函数的类型是os_timer_func_t,回调函数的设置需要在定时器使能之前设置


函数二:os_timer_arm()

定时器使能函数

void os_timer_arm	(
	os_timer_t	*ptimer,		// 定时器结构体
	uint32_t	milliseconds,	// 定时时间ms(定时器时间是有限制的具体看SDK)
	bool	repeat_flag			// 是否重复定时器标志 1-重复,0-不重复
)

函数三:os_timer_disarm()

定时器失能函数,该函数只有一个参数,定时器结构体


函数四:system_timer_reinit()

定时器重新初始化函数,改函数仅仅在使用微秒级定时器的时候调用,调用在程序最初user_init的第一句,函数没有参数


函数五:os_timer_arm_us()

• 需要先定义 USE_US_TIMER,并在 user_init 起始第一句,先调用 system_timer_reinit
• 最高精度为 500μs

void	os_timer_arm_us	(
	os_timer_t	*ptimer,		// 定时器结构体	
	uint32_t	microseconds,	// 定时时间500us起步
	bool	repeat_flag			// 是否重复标志
)

user_mian代码:

/*定时器结构体*/
os_timer_t	ledtimer;
uint8	led_value;

/*回调函数定义*/
void Led_Overturn(void)
{
	os_printf("OLG");
	led_value = ~led_value;
	GPIO_OUTPUT_SET(GPIO_ID_PIN(5),led_value);
}

/*定时器设置*/
os_timer_disarm(&ledtimer);									// 关闭定时器
os_timer_setfn(&ledtimer, (os_timer_func_t *)Led_Overturn, (void*)0);			// 设置定时器的回调函数
os_timer_arm(&ledtimer, 500, 1);					// 打开定时器,500ms,重复

这里还需要注意的一点,不要在后面加上

while(1)
{
	system_soft_wdt_feed();	// 喂狗
}

二、硬件定时器的使用

硬件定时器的api有三个

函数一:hw_timer_init()
void hw_timer_init	(
	FRC1_TIMER_SOURCE_TYPE source_type,		// 中断源的选择,有两个
	u8	req									// 是否自动重装
)
FRC1_SOURCE:	使用 FRC1 中断源,不可以打断其他的中断
NMI_SOURCE:	使用 NMI 中断源,可以打断其他的中断

函数二:hw_timer_arm()

硬件定时器使能,参数为定时时间,单位是us,不同的中断源有不同的取值范围。具体看SDK


函数三:hw_timer_set_func()

设置硬件定时器回调函数,参数是回调函数的指针

void	hw_timer_set_func	(void (* user_hw_timer_cb_set)(void) )

回调函数在定义的时候,不能加上ICACHE_FLASH_ATTR


user_main代码:

/*回调函数定义*/
void Led_Overturn(void)
{
	os_printf("OLG");
	led_value = ~led_value;
	GPIO_OUTPUT_SET(GPIO_ID_PIN(5),led_value);
}

hw_timer_init(NMI_SOURCE, 1);		// 初始化-NMI中断源(可打断),1-自动重装
hw_timer_set_func(Led_Overturn);	// 设置回调函数
hw_timer_arm(1000*1000);			// 1s

当然硬件定时器的使用需要添加源文件hw_timer.c和头文件hw_timer.h

2020.5.27
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值