这就跟你问声好!
为了验证Timer0的工作机制,我设计了一个DA14580的Timer0 ON计数器的测试。
定时器0的初始化是:
#定义PWM_HIGH 7
set_tmr_enable (CLK_PER_REG_TMR_ENABLED);
set_tmr_div (CLK_PER_REG_TMR_DIV_1);
timer0_init (TIM0_CLK_FAST PWM_MODE_ONE TIM0_CLK_NO_DIV);
time0on = ((PWM_HIGH+1) * 2)*1 -1;//在计数器上使timer0 =高+低
timer0_set (time0on PWM_HIGH PWM_HIGH);
timer0_start ();
我得到一个1Mhz的PWM0和PWM1和一个1Mhz的计数器中断请求。
On计数器测试是:
注册uint16 i, j, k;
i = *(volatile uint16*)(TIMER0_ON_REG);
j = *(volatile uint16*)(TIMER0_ON_REG);
k = *(volatile uint16*)(TIMER0_ON_REG);
i,j,k在获得TIMER0_ON_REG值后通过UART输出。
然后我得到了结果:
我= 0003
j = 0000
k = 000 d
Keil给出了上述代码段的ASM代码:
155: i = *(volatile uint16*)(TIMER0_ON_REG);
0x20000BCC 4826 LDR r0,[pc,#152];@0x20000C68
0x20000BCE 8845 LDRH r5,[r0,#0x02]
j = *(volatile uint16*)(TIMER0_ON_REG);
0x20000BD0 8846 LDRH r6,[r0,#0x02]
57: k = *(volatile uint16*)(TIMER0_ON_REG);
158:
159:
0x20000BD2 8847 LDRH r7,[r0,#0x02]
CPU的运行顺序如下:
1 .load Timer0 ON Counter Register's Address to R0
2.将Timer0 ON计数器值加载到R5 (i);
3.将Timer0 ON计数器值加载到R6 (j);
4.将Timer0 ON计数器值加载到R7 (k);
根据ARM Cortex-M0指令总结,LDRH需要2个时钟周期。
我的问题是,如果R5(i)得到' 0003',在2个时钟周期后,R6(j)应该得到'0001',同样的原因,R7(k)喊得到'000F'。
测试设计有问题吗?或者对Timer0有什么误解吗?
我附上了整个计划。请验证一下。谢谢!
数据表显示定时器0连接到APB总线,并通过APB桥与AHB总线通信。
ARM Cortex M文档显示:
对于HCLK等于PCLK的系统,如果没有APB从站的错误响应,则每个RW的最小周期数为:
当REGISTER_RDATA为1时,三个HCLK周期。
当REGISTER_RDATA为0时,两个HCLK周期。
因此,TIMER0_ON_REG上的LDRH指令需要3个时钟周期。
我说的对吗?
嗨bemoon,
是的,你说得对。根据ARM Cortex M0指令集,当REGISTER_RDATA (Verilog参数)设置为0时,APB访问的延迟会降低。这导致从APB奴隶的读取数据,PRDATA,直接输出到AHB读取数据输出,HRDATA,并减少等待状态,除了门计数。默认情况下,REGISTER_RDATA参数设置为1,以包含注册阶段。因此,当REGISTER_RDATA为1时,你将有3个HCLK周期,当REGISTER_RDATA为0时,你将有2个HCLK周期
谢谢,PM_Dialog
谢谢你的回复。
REGISTER_RDATA是一个Verilog参数,这意味着它影响了该IC的RTL设计,终端用户没有机会更改它。
因此DA14580必须花费至少3 HCLK才能访问APB总线设备。
这是对的吗?
再次感谢!
嗨bemoon,
如果REGISTER_RDATA为1,则需要至少3个HCLK才能访问APB总线设备。
谢谢,PM_Dialog