你好 !
我在计数器上设计了关于DA14580的Timer0的测试,以验证Timer0的工作机制。
定时器0的启动是:
#define 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_set(time0on,pwm_high,pwm_high);
timer0_start();
在计数器中断请求上,我得到了1MHz PWM0和PWM1和1MHz。
反击测试是:
注册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通过UART进行Timer0_On_reg值后输出。
然后我得到了结果:
我= 0003.
J = 0000.
k = 000d.
Keil为上述代码段提供ASM代码:
155:i = *(volatile uint16 *)(timer0_on_reg);
0x20000BCC 4826 LDR R0,[PC,#152];@ 0x20000C68
0x20000bce 8845 ldr r5,[r0,#0x02]
156:j = *(volatile uint16 *)(timer0_on_reg);
0x20000BD0 8846 LDRH R6,[R0,#0x02]
157:k = *(volatile uint16 *)(timer0_on_reg);
158:
159:
0x20000BD2 8847 LDRH R7,[R0,#0x02]
似乎CPU按照以下顺序运行:
1.计数器寄存器地址的1 .load timer0到r0
2.将计时器0加载到R5(i)的计数器值;
3.将计时器0加载到R6(j)的计数器值;
4.将计时器0加载到R7(k)上的计数器值;
根据ARM Cortex-M0指令摘要,LDRH成本2个时钟周期。
我的问题是如果r5(i)得到'0003',在2个时钟周期R6(j)应该得到'0001'和相同的原因,R7(k)喊叫“000F”。
测试设计中有什么不对的或误解Timer0的东西吗?
我附上了整个项目。PLZ验证。非常感谢!
数据表显示定时器0连接到APB总线并通过APB桥接通信AHB总线。
ARM Cortex M文件显示:
对于具有HCLK等于PCLK的系统,如果APB从站没有错误响应,则每个RW的最小循环次数如下:
当register_rdata为1时,三个HCLK周期。
当register_rdata为0时,两个HCLK周期。
因此,Timer0_On_reg上的LDRH指令花费3个时钟周期。
我对吗?
嗨班莫呼,
是的,你是对的。根据ARM Cortex M0指令集,当寄存器_RDATA(Verilog参数)设置为0时,APB访问的延迟减少了。这导致来自APB从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总线设备。
这样对吗?
再次感谢!
嗨班莫呼,
如果register_rdata为1,则是它成本至少3 HCLK访问APB总线设备。
谢谢,PM_DIALOG.