完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
螺栓螺母,
空ISR不需要像nop那样多的时钟周期。 STM8 CPU编程手册显示了服务ISR时会发生什么: 在获取ISR中断向量之前,STM8内核将PCL,PCH,PCE,Y,X,A和CC寄存器压入堆栈。这需要9个时钟周期。 如果您的ISR为空,即它仅包含在IRET中,则需要另外9个时钟周期来恢复这些寄存器。 EtaPhi 以上来自于谷歌翻译 以下为原文 Boltnut, an empty ISR doesn't takes as much clock cycles as a nop. The STM8 CPU Programming Manual shows what happens when an ISR is serviced: the STM8 core pushes PCL, PCH, PCE, Y, X, A and CC registers onto the stack before fetching the ISR interrupt vector. This takes 9 clock cycles. If your ISR is empty, i.e. it consists only in an IRET, another 9 clock cycles are needed to restore those registers. EtaPhi |
|
|
|
EtaPhi,
你的意思是NOP指令需要1 / 16MHz = 62.5 ns 如果fMASTER = 16MHz? 以上来自于谷歌翻译 以下为原文 EtaPhi, Do you mean that a NOP instruction takes 1/16MHz = 62.5 ns if fMASTER = 16MHz ? |
|
|
|
螺栓螺母,
STM8核心有一个三级管道。 如果指令流不包含跳转指令,则每个NOP指令需要一个时钟周期,即1 / 16MHz = 62.5ns。 您的结论是正确的,但前提是指令管道已满。 问候 以上来自于谷歌翻译 以下为原文 Boltnut, the STM8 core has got a three stage pipeline. If an instruction stream contains no jump instructions, each NOP instruction takes one clock cycle, i.e. 1/16MHz = 62.5 ns. Your conclusion is true, but only if the instruction pipeline is full. Regards |
|
|
|
你好Boltnut。
如果您的意思是''较小的延迟粒度'',您可以使用: 而( - bTime) ; 你的编译器应该翻译成: ld a,(OFST + 1,sp) L13: dec a jrne L13 此代码应执行3 x bTime + 1个时钟周期(如果不允许中断) 有一种简单的方法可以测量延迟程序需要多长时间:添加一条指令,在延迟程序之前和之后切换输出引脚。 然后使用示波器查看和测量波形。 问候 EtaPhi 以上来自于谷歌翻译 以下为原文 Hello Boltnut. If you mean ''smaller delay granularity'' in your request, you can use: while ( --bTime ) ; which your compiler should translate in: ld a,(OFST+1,sp) L13: dec a jrne L13 This code should take 3 x bTime + 1 clock cycles to execute (if interrupts aren't allowed) There is a simple way to measure how long a delay routine takes: add an instruction which toggles an output pin before and after the delay routine. Then use an oscilloscope to see and measure the waveform. Regards EtaPhi |
|
|
|
嗨EtaPhi,
谢谢你的建议。 我试着修改它如下: void I2C_Delay(UB8 bTime) { // 59 0000 88推a // 75; 106而( - bTime) // 77 000d 0a01 dec(OFST + 1,sp); 1.0周期 // 78 000f 26fc jrne L13; 0.5周期而( - bTime) ; // 71 0005 84 pop a // 72 0006 81 ret } / * I2C_Delay * / 这对我的申请很有帮助。 以上来自于谷歌翻译 以下为原文 Hi EtaPhi, Thanks for your advice. I tried to revise it as below: void I2C_Delay (UB8 bTime) { // 59 0000 88 push a // 75 ; 106 while (--bTime) // 77 000d 0a01 dec (OFST+1,sp) ; 1.0 cycle // 78 000f 26fc jrne L13 ; 0.5 cycle while (--bTime) ; // 71 0005 84 pop a // 72 0006 81 ret } /* I2C_Delay */ It is good enogh to my application. |
|
|
|
只有小组成员才能发言,加入小组>>
请教:在使用UDE STK时,单片机使用SPC560D30L1,在配置文件怎么设置或选择?里面只有SPC560D40的选项
2738 浏览 1 评论
3241 浏览 1 评论
请问是否有通过UART连接的两个微处理器之间实现双向值交换的方法?
1810 浏览 1 评论
3650 浏览 6 评论
6039 浏览 21 评论
1339浏览 4评论
201浏览 3评论
对H747I-DISCO写程序时将CN2的st-link复用为usart1,再次烧录时无法检测到stlink怎么解决?
353浏览 2评论
STM32G474RE芯片只是串口发个数据就发烫严重是怎么回事?
444浏览 2评论
STM32处理增量式编码器Z信号如何判断中断是正转的还是反向转的?
275浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 13:33 , Processed in 1.261724 second(s), Total 54, Slave 48 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号