打印

好久没有发贴了,发个一定有争议的贴子

[复制链接]
1749|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ayb_ice|  楼主 | 2022-11-14 09:48 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
ic, ar, ck, TI, AD, ARM
ARM的TICK定时器重装初值都说要加载减速1后的值,我表示怀疑,首先手册上说了,
RELOAD R/W 0 当倒数至零时,将被重装载的值,理论上1表示计一个数就重装载了,这应该是没有问题的,
实际测试如果RELOAD 为0,实际相当于自由运行,但如果根据减一理论应该是计一个数就中断,但事实并非如此,
对此大家来讨论讨论一下.

使用特权

评论回复

相关帖子

沙发
ayb_ice|  楼主 | 2022-11-14 09:50 | 只看该作者
用其它任何值都不好实际测试,因为中断响应需要时间,

使用特权

评论回复
板凳
chongdongchen| | 2022-11-14 10:32 | 只看该作者
RELOAD的定义:当倒数至零时,将被重装载的值。所以这是一个边沿触发。
没做过试验,可以推测:
如果RELOAD = 0,下次减1计数会导致CURRENT = -1(这次并不会触发重装载),表现出来应该是最大周期。

使用特权

评论回复
地板
henangongda123| | 2022-11-14 13:27 | 只看该作者
jiangjiang6590 发表于 2022-11-14 11:07
STC8H8K64U / STC32G12K128 的 定时器 : T0/T1/T2/T3/T4, PWM1 ~ PWM8, RTC !共 14个定时器,容易上手。  ...

坑多 以后复杂项目禁止使用STC单片机

使用特权

评论回复
5
小明的同学| | 2022-11-14 14:42 | 只看该作者
没看懂楼主在表达什么。

使用特权

评论回复
6
ayb_ice|  楼主 | 2022-11-14 15:01 | 只看该作者
感兴趣的可以自己去测试一下

使用特权

评论回复
7
Diyer123| | 2022-11-14 18:28 | 只看该作者
ayb_ice 发表于 2022-11-14 09:50
用其它任何值都不好实际测试,因为中断响应需要时间,

验证很简单,把系统时钟分频到几十kHz作为定时器时钟,然后在定时器中断里翻转IO,示波器观测IO脉宽

使用特权

评论回复
8
通宵敲代码| | 2022-11-15 08:14 | 只看该作者
定时器递减到0触发重载,
但重载的操作是在递减到0的下一个脉冲才执行的,
此处也会占用一个指令周期,而这个周期内定时器没有递减操作,
所以实际的计数周期应该是“-1~N”的长度,因此N需要减1。

使用特权

评论回复
9
ayb_ice|  楼主 | 2022-11-15 08:34 | 只看该作者
Diyer123 发表于 2022-11-14 18:28
验证很简单,把系统时钟分频到几十kHz作为定时器时钟,然后在定时器中断里翻转IO,示波器观测IO脉宽 ...

中断响应也是要花时间的,而且还不一定是个定值

使用特权

评论回复
10
ayb_ice|  楼主 | 2022-11-15 08:37 | 只看该作者
通宵敲代码 发表于 2022-11-15 08:14
定时器递减到0触发重载,
但重载的操作是在递减到0的下一个脉冲才执行的,
此处也会占用一个指令周期,而这 ...

那如果想1个周期就重载,实际加载的值应该是1-1=0,你试试重载值是0的时候的实际效果

使用特权

评论回复
11
ayb_ice|  楼主 | 2022-11-17 08:26 | 只看该作者
看来没有人关注这些细节

使用特权

评论回复
12
chongdongchen| | 2022-11-17 16:33 | 只看该作者
ayb_ice 发表于 2022-11-17 08:26
看来没有人关注这些细节

的确有些冷清,我来活跃一下。
想了一个绝妙的方法,不用示波器,只需一个指示灯就行(详见关键代码):

    GPIOC->ODR = GPIO_Pin_13;   //指示灯初始状态
    SysTick->CTRL = 3;
    SysTick->LOAD = 0;
        while(1)
    {
    }

void SysTick_Handler(void)
{
    SysTick->LOAD = 4000000;
    GPIOC->ODR ^= GPIO_Pin_13;
}


结果是:SysTick->LOAD = 1时,灯会闪;SysTick->LOAD = 0时,灯不会闪,并保持初始状态(L或H)。
说明SysTick->LOAD = 0时,表现出来是“不运行”、不进中断。
同时也说明了我之前的推测是错误的
继续讨论。。

使用特权

评论回复
13
chongdongchen| | 2022-11-17 16:42 | 只看该作者
同时是不是又说明了“减一理论”是不对的

使用特权

评论回复
14
ayb_ice|  楼主 | 2022-11-17 17:02 | 只看该作者
chongdongchen 发表于 2022-11-17 16:33
的确有些冷清,我来活跃一下。
想了一个绝妙的方法,不用示波器,只需一个指示灯就行(详见关键代码):
...

怎么可能不进中断呢

使用特权

评论回复
15
chongdongchen| | 2022-11-17 20:04 | 只看该作者
ayb_ice 发表于 2022-11-17 17:02
怎么可能不进中断呢

下午的实验结果表明没进中断,因为中断里有对SysTick->LOAD赋值,赋值后就会周期性中断导致LED闪动。
原因有待分析。。你有空也可以做下这个实验

使用特权

评论回复
16
chongdongchen| | 2022-11-17 20:07 | 只看该作者
你看while(1)之前,如果SysTick->LOAD = 1;会进中断,这个好理解,之后就是LED闪动

使用特权

评论回复
17
ayb_ice|  楼主 | 2022-11-18 09:42 | 只看该作者
chongdongchen 发表于 2022-11-17 20:04
下午的实验结果表明没进中断,因为中断里有对SysTick->LOAD赋值,赋值后就会周期性中断导致LED闪动。
原 ...

如果LOAD值为0确实不能进入中断(也可能定时器不工作),我之前测试可能哪里有问题,现在可以得出结论需要减一.
一讨论就清楚了,这样的讨论还是有意义的

使用特权

评论回复
18
ZALIN| | 2022-11-18 13:07 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

222

主题

15450

帖子

34

粉丝