这就跟你问声好!
我设计了一个关于DA14580的Timer0 ON计数器的测试,以验证Timer0的工作机制。
定时器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;// make timer0 on counter = high + low
timer0_set (time0on PWM_HIGH PWM_HIGH);
timer0_start ();
我得到一个1Mhz的PWM0和PWM1和一个1Mhz的ON计数器中断请求。
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代码:
1: i = *(volatile uint16*)(TIMER0_ON_REG);
0x20000BCC 4826 LDR r0,[pc,#152];@0x20000C68
0x20000BCE 8845 LDRH r5,[r0,#0x02]
156: j = *(volatile uint16*)(TIMER0_ON_REG);
0x20000BD0 8846 LDRH r6,[r0,#0x02]
1: k = *(volatile uint16*)(TIMER0_ON_REG);
158:
159:
0x20000BD2 8847 LDRH r7,[r0,#0x02]
CPU的运行顺序如下:
1 .加载定时器0 ON计数器寄存器的地址到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有什么误解?
我附上了整个项目。请验证一下。谢谢!

数据表显示,Timer 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 slave的读数据(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