你好 !
我在计数器上设计了关于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个时钟周期。
我对吗?