打印
[技术问答]

HC32F005的高级定时器修改CNT的值的问题

[复制链接]
878|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 kevicki 于 2021-2-5 16:57 编辑

最近HC32的研究差不多结束了,应该是碰到的最后一个问题(希望是)。。

有一个很简单的功能,就是计算两个事件发生之间的时间。原来用stm8和stm32,就用一个timer(上电就开始启动这个定时器,有做他用),事件1发生时将timer计数值(CNT值)设为0,等到事件2发生时读取计数值即可。

移植到HC32F005之后,发现原来的程序不适用,发现有两个问题:
1、基础定时器(就是库里的bt)是无法修改计数值的,他的CNT寄存器只是用来保存溢出值,计数到溢出值即产生中断。确实相当“基础”
2、于是改为使用高级定时器TIM4,发现在timer启动之后(GCONR->START=1),是不可以修改CNT寄存器值的,debug时直接修改也无效,CNT寄存器值一直不变,如下图:

语句1是无效的,语句2才有效。

然后更纠结的问题来了,我习惯在项目中开启一定的编译优化,发现开启编译优化之后,语句2依然不起作用,于是继续研究。

然后发现,很简单,在timer停止了之后(将GCONR->START=0),还需要至少隔1个指令(比如随便一个变量自加a++之类的),CNT才允许被修改。上图中的程序在编译优化之后,函数调用被优化成直接操作寄存器,导致“GCONR->START=0”与“CNTER->CNT=0”两个语句连续运行,结果无效。

自行验证的,数据手册及用户手册中均没有提到这些。欢迎大神指点,如果是哪里程序不当导致问题,希望指点一下,多谢了

使用特权

评论回复
沙发
kevicki|  楼主 | 2021-2-5 17:13 | 只看该作者
哦,另外还有一个问题,也是写在这吧,希望大家共享。

是HC32F005的库里,有几个延时函数,delay10us,delay100us······

这些延时函数有一个共同的特点,就是都用的是systick定时器,然后。。然后。。延时完了直接把systick关掉了

所以,大家不要贪方便直接用这几个函数了

使用特权

评论回复
板凳
jimton| | 2021-2-9 12:03 | 只看该作者
16位的CNT 寄存器是RW,可以修改。
注:仅在模式0 32位定时器自由计数模式下有效,其他模式禁止写该寄存器

使用特权

评论回复
地板
kevicki|  楼主 | 2021-2-19 17:27 | 只看该作者
jimton 发表于 2021-2-9 12:03
16位的CNT 寄存器是RW,可以修改。
注:仅在模式0 32位定时器自由计数模式下有效,其他模式禁止写该寄存器 ...

你没有看清我描述的问题。

你说的“自由计数模式”,是base timer(TIM0/1/2),CNT寄存器值并不是“当前计数到什么数了”,而是“计数到什么数的时候溢出”。这个功能不满足我的要求,所以我用了Advanced Timer(TIM4/5/6)。

CNT寄存器是R/W可以修改,但是通过实践验证在计时器开启的情况下是写入无效的。要把计时器停止了之后,才能写入。

使用特权

评论回复
评论
linguanghua 2021-4-6 10:38 回复TA
按照用户手册(V2.3版本)的说法去理解,32位自由计数模式,CNT32寄存器应该就是当前计数值,不是溢出值。因为是自由计数,不需要什么“溢出值”类似ARR?。不过实际就不知道,我也觉得手册很难懂。 
5
martinhu| | 2021-2-19 18:21 | 只看该作者
本帖最后由 martinhu 于 2021-2-19 18:25 编辑

楼主观察的很仔细,ADT的stop命令之后,并不一定会立即生效,会过n个pclk时钟之后才生效(n为ADT时钟分频的系数),在1分频的时候这个现象不明显,如果ADT分频多了,这个现象更明显。

关于ADT的cnt的清零,其实ADT里面有硬件启动、停止、清零寄存器,
如果你用的事件刚好是可以作为ADT的触发事件,

那么选择事件之后,
在对应的硬件清零寄存器内使能这个事件,就可以达到自动清零CNT的目的。

如果这个事件也设置为捕获事件,那么当这个事件到来的时候,可以先捕获CNT的值,再清零CNT。


这里仅仅例举的是内部模块对ADT的触发的使用,也有引脚的触发事件
F005的事件触发,需要使能输出触发模块的中断,并且在触发之后清零中断标志
可以参考这个高级定时器输入有关的应用笔记
高级定时器ADT的输入信号处理Rev1.0.pdf (330.55 KB)


使用特权

评论回复
6
HuangHongLun| | 2021-2-20 11:50 | 只看该作者
支持一下,楼主测试的这些都是大大的坑。

使用特权

评论回复
7
kevicki|  楼主 | 2021-2-20 15:41 | 只看该作者
martinhu 发表于 2021-2-19 18:21
楼主观察的很仔细,ADT的stop命令之后,并不一定会立即生效,会过n个pclk时钟之后才生效(n为ADT时钟分频的 ...

感谢这位兄弟。

提到的这些硬件清零、捕获功能我之前也留意到了,不过我这个电路没法改动了,恰好没办法用这些触发源,另外由于软件是从stm8、32上移植过来的,不太想破坏原有的中间层架构,所以就没有使用。

按照手册这些功能描述,配合起来应该是可以实现很多高级功能的,留待以后产品升级的时候再研究吧。

感谢

使用特权

评论回复
8
kcfoo1| | 2021-3-19 20:07 | 只看该作者
要用缓存功能,不然别人怎么调pwm,频率就是调a缓存,占空比就是调c,华大的是a通道为主的,要改变占空比就必须设置a通道,b通道是跟着a通道变化的,b通道是不能单独独立工作的,华大的单片机你不好好研究个几天真得很难玩得转,

使用特权

评论回复
9
martinhu| | 2021-3-22 13:55 | 只看该作者
kcfoo1 发表于 2021-3-19 20:07
要用缓存功能,不然别人怎么调pwm,频率就是调a缓存,占空比就是调c,华大的是a通道为主的,要改变占空比就 ...

有应用笔记

使用特权

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

本版积分规则

37

主题

158

帖子

0

粉丝