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

[复制链接]
 楼主| 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单片机
小明的同学 发表于 2022-11-14 14:42 | 显示全部楼层
没看懂楼主在表达什么。
 楼主| ayb_ice 发表于 2022-11-14 15:01 | 显示全部楼层
感兴趣的可以自己去测试一下
Diyer123 发表于 2022-11-14 18:28 | 显示全部楼层
ayb_ice 发表于 2022-11-14 09:50
用其它任何值都不好实际测试,因为中断响应需要时间,

验证很简单,把系统时钟分频到几十kHz作为定时器时钟,然后在定时器中断里翻转IO,示波器观测IO脉宽
通宵敲代码 发表于 2022-11-15 08:14 | 显示全部楼层
定时器递减到0触发重载,
但重载的操作是在递减到0的下一个脉冲才执行的,
此处也会占用一个指令周期,而这个周期内定时器没有递减操作,
所以实际的计数周期应该是“-1~N”的长度,因此N需要减1。
 楼主| ayb_ice 发表于 2022-11-15 08:34 | 显示全部楼层
Diyer123 发表于 2022-11-14 18:28
验证很简单,把系统时钟分频到几十kHz作为定时器时钟,然后在定时器中断里翻转IO,示波器观测IO脉宽 ...

中断响应也是要花时间的,而且还不一定是个定值
 楼主| ayb_ice 发表于 2022-11-15 08:37 | 显示全部楼层
通宵敲代码 发表于 2022-11-15 08:14
定时器递减到0触发重载,
但重载的操作是在递减到0的下一个脉冲才执行的,
此处也会占用一个指令周期,而这 ...

那如果想1个周期就重载,实际加载的值应该是1-1=0,你试试重载值是0的时候的实际效果
 楼主| ayb_ice 发表于 2022-11-17 08:26 | 显示全部楼层
看来没有人关注这些细节
chongdongchen 发表于 2022-11-17 16:33 | 显示全部楼层
ayb_ice 发表于 2022-11-17 08:26
看来没有人关注这些细节

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

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

  1. void SysTick_Handler(void)
  2. {
  3.     SysTick->LOAD = 4000000;
  4.     GPIOC->ODR ^= GPIO_Pin_13;
  5. }


结果是:SysTick->LOAD = 1时,灯会闪;SysTick->LOAD = 0时,灯不会闪,并保持初始状态(L或H)。
说明SysTick->LOAD = 0时,表现出来是“不运行”、不进中断。
同时也说明了我之前的推测是错误的
继续讨论。。
chongdongchen 发表于 2022-11-17 16:42 | 显示全部楼层
同时是不是又说明了“减一理论”是不对的
 楼主| ayb_ice 发表于 2022-11-17 17:02 | 显示全部楼层
chongdongchen 发表于 2022-11-17 16:33
的确有些冷清,我来活跃一下。
想了一个绝妙的方法,不用示波器,只需一个指示灯就行(详见关键代码):
...

怎么可能不进中断呢
chongdongchen 发表于 2022-11-17 20:04 | 显示全部楼层
ayb_ice 发表于 2022-11-17 17:02
怎么可能不进中断呢

下午的实验结果表明没进中断,因为中断里有对SysTick->LOAD赋值,赋值后就会周期性中断导致LED闪动。
原因有待分析。。你有空也可以做下这个实验
chongdongchen 发表于 2022-11-17 20:07 | 显示全部楼层
你看while(1)之前,如果SysTick->LOAD = 1;会进中断,这个好理解,之后就是LED闪动
 楼主| ayb_ice 发表于 2022-11-18 09:42 | 显示全部楼层
chongdongchen 发表于 2022-11-17 20:04
下午的实验结果表明没进中断,因为中断里有对SysTick->LOAD赋值,赋值后就会周期性中断导致LED闪动。
原 ...

如果LOAD值为0确实不能进入中断(也可能定时器不工作),我之前测试可能哪里有问题,现在可以得出结论需要减一.
一讨论就清楚了,这样的讨论还是有意义的
ZALIN 发表于 2022-11-18 13:07 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

222

主题

15489

帖子

34

粉丝
快速回复 返回顶部 返回列表