10 posts / 0 new
Last post
comprends
Offline
Last seen:2 weeks 6 days ago
Joined:2019-06-21 07:31
DA14531硬件定时器使用问题

请问DA14531的硬件定时器Timer0最小可以定时多久呢,我想定时1us进一次中断,但是实际测试发现进行IO翻转时,高电平1.8-2us,低电平2.2-2.4us.我的设置是这样的:

static tim0_2_clk_div_config_t clk_div_config =
{
.clk_div = TIM0_2_CLK_DIV_1 // 16MHZ/1
};

void timer0_general_user_callback_function(void)
{
if((GetWord16(GPIO_BASE + (GPIO_LED_PORT << 5)) & (1 << GPIO_LED_PIN)))
SetWord16 (GPIO_BASE + (GPIO_LED_PORT < < 5) + 4, 1<< GPIO_LED_PIN); //low
else if((GetWord16(GPIO_BASE + (GPIO_LED_PORT << 5)) & (1 << GPIO_LED_PIN))==0)
SetWord16(GPIO_BASE + (GPIO_LED_PORT << 5) + 2 , 1 << GPIO_LED_PIN); //High
}

void timer0_Interrupt_Init(uint16_t RELOAD_1US)
{
// Stop timer for enter settings
timer0_stop();

// register callback function for SWTIM_IRQn irq
timer0_register_callback(timer0_general_user_callback_function);

// Enable the Timer0/Timer2 input clock
timer0_2_clk_enable();

// Set the Timer0/Timer2 input clock division factor to 8, so 16 MHz / 1 = 16 MHz input clock
timer0_2_clk_div_set(&clk_div_config);

// clear PWM settings register to not generate PWM
timer0_set_pwm_high_counter(NO_PWM); //TIMER0_RELOAD_M_REG = 0
timer0_set_pwm_low_counter(NO_PWM); //TIMER0_RELOAD_N_REG = 0

// Set timer with 2MHz source clock divided by 10 so Fclk = 16MHz/1 = 16MHz
timer0_init(TIM0_CLK_FAST, PWM_MODE_ONE, TIM0_CLK_NO_DIV);

// T = 1/16MHz * (RELOAD_100US+1) =0.0000000625 * 16 = 1us RELOAD_100US = 16
timer0_set_pwm_on_counter(RELOAD_1US); //TIMER0_ON_REG = 1600

// Enable SWTIM_IRQn irq
timer0_enable_irq();

// Start Timer0
timer0_start();
}

是哪里存在问题吗?请问如何才能精准的1us进一次中断呢

期待回复,非常感谢

Device:
CYibin
Offline
Last seen:3 months 2 weeks ago
Staff
Joined:2017-12-14 02:48
你好,

你好,

1us 中断是可以。

请问你最终想实现的功能是什么呢,我帮你评估用什么方式实现比较好。

comprends
Offline
Last seen:2 weeks 6 days ago
Joined:2019-06-21 07:31
你好,我正在调试一个通信协议,尝试过很多方法

你好,我正在调试一个通信协议,尝试过很多方法,目前感觉只能通过多次进入定时器中断来实现。t_clock理论是100us,实际测试80-100us之间,需要具体调试,目前的想法是硬件定时器定1us,多次进入累积判断。但是我设置硬件定时器参数发现并不能精准到1us,请问我的问题出在哪里呢?协议见附件文档,可直接参考最终的时序图

comprends
Offline
Last seen:2 weeks 6 days ago
Joined:2019-06-21 07:31
请问我的这个定时的问题是出在哪呢

请问我的这个定时的问题是出在哪呢

comprends
Offline
Last seen:2 weeks 6 days ago
Joined:2019-06-21 07:31
我按这个设置,3us进中断(3us也并不准)

我按这个设置,3us进中断(3us也并不准),次数多了程序都会崩掉..我如果想精准1us多次呢 最多能进多少次

CYibin
Offline
Last seen:3 months 2 weeks ago
Staff
Joined:2017-12-14 02:48
从协议文档看,一个 Tcycle 最大是 1ms 左右

从协议文档看,一个 Tcycle 最大是 1ms 左右,这种情况建议直接用 IO 操作来实现。

comprends
Offline
Last seen:2 weeks 6 days ago
Joined:2019-06-21 07:31
IO操作实现,可以具体说明一下吗

IO操作实现,可以具体说明一下吗,我之前就是直接控制IO口模拟这个协议电平,用systick做阻塞延时,但是实际效果并不好。建议是不要有阻塞,所以我想用定时器去调用,但是实际 发现定时效果不精准,不知道问题出在哪?一个实际的Tcycle 580us左右,发送的时候会发送很多个,总体最长甚至达到2-3s。

comprends
Offline
Last seen:2 weeks 6 days ago
Joined:2019-06-21 07:31
请问这个定时器不精准的问题原因是什么

请问这个定时器不精准的问题原因是什么

CYibin
Offline
Last seen:3 months 2 weeks ago
Staff
Joined:2017-12-14 02:48
当把定时器的时钟源配置为高频时钟 16MHz 后

当把定时器的时钟源配置为高频时钟 16MHz 后,定时器里的计数器计数是精准的。

而当你想实现 1us 中断一次,并且调用中断服务函数来执行用户功能时,这个就很难保证了。进、出中断的时间,中断服务函数的执行时间等,会有额外的开销。这个开销在 ms 级别的定时精度上可以忽略,1us 级别,就很难忽略了。

并且外设的中断优先级不是最高的,还会受到蓝牙中断的影响。

comprends
Offline
Last seen:2 weeks 6 days ago
Joined:2019-06-21 07:31
好的,那这就无法精准的使用us定时了,我再考虑其他方法

好的,那这就无法精准的使用us定时了,我再考虑其他方法 谢谢

Topic locked