使用高分辨率计时器实现方波计时器

时间:2015-11-05 03:33:11

标签: linux linux-kernel embedded-linux

我正在使用hrtimer来实现带有GPIO的方波输出。

系统是AR9331 + openwrt,它不支持PWM输出。

摘录如下,

初始化并开始

hrtimer_init(&(s_WS2812_control.send_timer), CLOCK_MONOTONIC, HRTIMER_MODE_REL);
s_WS2812_control.send_timer.function = send_timer_handler;
hrtimer_start(&(s_WS2812_control.send_timer), ktime_set(0, 1000), HRTIMER_MODE_REL); //timeout now

我的超时处理程序是

send_period = ktime_set(0, 1000); //next timeout period is 1us
gpio_level = ~gpio_level;
gpio_set_value(out_pin, gpio_level);
hrtimer_forward(&send_timer,
    send_timer.base->get_time(),
    send_period);

我的结果不符合逻辑,因为它的超时时间(状态切换时间)不固定。 (在示波器中观察)

有时它是3.6us,有时是15us。

我认为即使处理程序的执行时间大于1us,波形也应该是1us的移位,但不是这样,因为定时器中断对于系统是高优先级的,就像我想象中的其他硬件中断一样。

我的波形是这样的,短/长期如上所述。我真的不明白为什么GPIO输出是这样的。

my waveform link

如果有人知道有关此问题的一些线索,请提供帮助,或欢迎任何有关计时器教程/学习材料的建议。

感谢。

0 个答案:

没有答案