kevicki 发表于 2021-2-5 16:55

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

本帖最后由 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可以修改,但是通过实践验证在计时器开启的情况下是写入无效的。要把计时器停止了之后,才能写入。

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的事件触发,需要使能输出触发模块的中断,并且在触发之后清零中断标志
可以参考这个高级定时器输入有关的应用笔记



HuangHongLun 发表于 2021-2-20 11:50

支持一下,楼主测试的这些都是大大的坑。

kevicki 发表于 2021-2-20 15:41

martinhu 发表于 2021-2-19 18:21
楼主观察的很仔细,ADT的stop命令之后,并不一定会立即生效,会过n个pclk时钟之后才生效(n为ADT时钟分频的 ...

感谢这位兄弟。

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

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

感谢

kcfoo1 发表于 2021-3-19 20:07

要用缓存功能,不然别人怎么调pwm,频率就是调a缓存,占空比就是调c,华大的是a通道为主的,要改变占空比就必须设置a通道,b通道是跟着a通道变化的,b通道是不能单独独立工作的,华大的单片机你不好好研究个几天真得很难玩得转,

martinhu 发表于 2021-3-22 13:55

kcfoo1 发表于 2021-3-19 20:07
要用缓存功能,不然别人怎么调pwm,频率就是调a缓存,占空比就是调c,华大的是a通道为主的,要改变占空比就 ...

有应用笔记
页: [1]
查看完整版本: HC32F005的高级定时器修改CNT的值的问题