请问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进一次中断呢
期待回复,非常感谢
你好,
1us 中断是可以。
请问你最终想实现的功能是什么呢,我帮你评估用什么方式实现比较好。
你好,我正在调试一个通信协议,尝试过很多方法,目前感觉只能通过多次进入定时器中断来实现。t_clock理论是100us,实际测试80-100us之间,需要具体调试,目前的想法是硬件定时器定1us,多次进入累积判断。但是我设置硬件定时器参数发现并不能精准到1us,请问我的问题出在哪里呢?协议见附件文档,可直接参考最终的时序图
请问我的这个定时的问题是出在哪呢
我按这个设置,3us进中断(3us也并不准),次数多了程序都会崩掉..我如果想精准1us多次呢 最多能进多少次
从协议文档看,一个 Tcycle 最大是 1ms 左右,这种情况建议直接用 IO 操作来实现。
IO操作实现,可以具体说明一下吗,我之前就是直接控制IO口模拟这个协议电平,用systick做阻塞延时,但是实际效果并不好。建议是不要有阻塞,所以我想用定时器去调用,但是实际 发现定时效果不精准,不知道问题出在哪?一个实际的Tcycle 580us左右,发送的时候会发送很多个,总体最长甚至达到2-3s。
请问这个定时器不精准的问题原因是什么
当把定时器的时钟源配置为高频时钟 16MHz 后,定时器里的计数器计数是精准的。
而当你想实现 1us 中断一次,并且调用中断服务函数来执行用户功能时,这个就很难保证了。进、出中断的时间,中断服务函数的执行时间等,会有额外的开销。这个开销在 ms 级别的定时精度上可以忽略,1us 级别,就很难忽略了。
并且外设的中断优先级不是最高的,还会受到蓝牙中断的影响。
好的,那这就无法精准的使用us定时了,我再考虑其他方法 谢谢