关于计数器和指令周期的Timer0问题

⚠️
嗨,...感谢您来论坛。令人兴奋的消息!我们现在正在迁至我们的新论坛平台,将提供更好的功能,并包含在主对话框网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量 - 请发布任何新线程https://www.dialog-seminile.com/support.。我们将在未来几天修复错误/优化搜索和标记。
2个帖子/ 0新
最后一篇
烟鸽
离线
最后一次露面:2年2个月前
加入:2017-07-19 09:37
关于计数器和指令周期的Timer0问题

你好 !
我在计数器上设计了关于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验证。非常感谢!

附件:
设备:
烟鸽
离线
最后一次露面:2年2个月前
加入:2017-07-19 09:37
数据表显示计时器0

数据表显示定时器0连接到APB总线并通过APB桥接通信AHB总线。
ARM Cortex M文件显示:
对于具有HCLK等于PCLK的系统,如果APB从站没有错误响应,则每个RW的最小循环次数如下:
当register_rdata为1时,三个HCLK周期。
当register_rdata为0时,两个HCLK周期。

因此,Timer0_On_reg上的LDRH指令花费3个时钟周期。
我对吗?