本帖最后由 myxiaonia 于 2019-3-12 15:39 编辑
使用stm8s103的定时器2toggle模式生成脉冲值,时钟是16M,TIM2是2分频8M,现在我通过在中断里ccr值加600的方式,生成75us脉宽的脉冲
问题是脉冲宽度一直不准,比较神奇的是会很高频率出现43us,107us这两个值,尽管代码量不是仅仅自增600这么一句,但是我认为完全可以应付
我特意是16位访问的方式写入ccr值,保证是原子操作。
脉冲误差大量的情况都是+-32us,换算成ccr值是256,为什么会是这个值?
256这个值的特殊性我首先想到会不会是因为ccr出现非原子操作,外设寄存器是ccrl和ccrh,为了保证原子性我已经重新定义成16访问的ccr,实际最后的赋值语句是 ldw ccr X
而且600的16进制形式是0x258,即使ccrl和ccrh非原子操作的话ccrh增加的也是2,误差也应该是512
真是百思不得其解
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
我看标准库确实都是高低字节访问,刚才用串口输出cnt和ccr值,终于发现问题了,ccr值赋值后并没有起效,第二次写入起效上一次写入值
明天我再试试用高低字节赋值,应该就是问题
但是这个影子寄存器的知识是在哪里有详细介绍,tim章节只有提到没有展开,stm8没用多久不太熟
17.5.1 Write sequence for 16-bit TIM1_CCRi registers
16-bit values are loaded in the TIM1_CCRi registers through preload registers. This must
be performed by two write instructions, one for each byte. The MS byte must be written first.
The shadow register update is blocked as soon as the MS byte has been written, and stays blocked until the LS byte is written. Do not use the LDW instruction, as this writes the LS byte first, and produces incorrect results in this case.
一周热门 更多>