本帖最后由 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”两个语句连续运行,结果无效。
自行验证的,数据手册及用户手册中均没有提到这些。欢迎大神指点,如果是哪里程序不当导致问题,希望指点一下,多谢了
|