stm8 输出比较多脉冲宽度不对

2019-12-12 18:20发布

本帖最后由 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

真是百思不得其解
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
jyrpxj
1楼-- · 2019-12-12 21:12
我记得STM8的芯片的定时器的载入不可以16位操作,只能8位操作,有先有后。具体看手册。
MasterPhi
2楼-- · 2019-12-13 02:16
二楼说的是
myxiaonia
3楼-- · 2019-12-13 05:57
jyrpxj 发表于 2019-3-12 15:52
我记得STM8的芯片的定时器的载入不可以16位操作,只能8位操作,有先有后。具体看手册。 ...

不会吧,那这样操作的话怎么保证原子性,要知道外设内部肯定是拿16位的ccr和cnt比较

而且我确实是用16位操作这个寄存器的,你的意思是不支持吗? ldw ccr,X这句汇编其实会被翻译成2次写操作吗?

我看pm0044上说,flash区是32总线,ram区是8位总线,这个寄存器区到底算是flash区还是ram区呢
myxiaonia
4楼-- · 2019-12-13 07:09
 精彩回答 2  元偷偷看……
jyrpxj
5楼-- · 2019-12-13 12:36
myxiaonia 发表于 2019-3-12 16:12
不会吧,那这样操作的话怎么保证原子性,要知道外设内部肯定是拿16位的ccr和cnt比较

而且我确实是用16位 ...

STM8S系列用户手册有详细描述。库里面也有怎样加载寄存器值的函数。认真看一遍吧!这些寄存器都有对应的类似影子寄存器的东西。比如你要读取正在运行的定时器计数值,先读取的8位时,后8位已经锁存进影子里,读后8位就是从影子载进来的。写入寄存器也一样道理。

大概就是这么个意思。多看官方文档和库。
myxiaonia
6楼-- · 2019-12-13 14:23
jyrpxj 发表于 2019-3-12 16:45
STM8S系列用户手册有详细描述。库里面也有怎样加载寄存器值的函数。认真看一遍吧!这些寄存器都有对应的 ...

很多,可否明示除了rm0016和pm0044还有哪些文档,我去官网找找,顺便也看看库函数

一周热门 更多>