你的浏览器版本过低,可能导致网站不能正常访问!为了你能正常使用网站功能,请使用这些浏览器。
查看完整内容
举报
查看全部评分
zhjb1 发表于 2018-3-7 09:09 看的好复杂。采用Tick[Timer也可]中断产生脉冲比这个简单多了,并且频率仅由Tick控制。想想是吗? ...
无薪税绵 发表于 2018-3-7 10:31 TIM1_EGR为事件触发寄存器。 UG位是事件更新位,由软件置1,硬件自动清零。 当置1时,重新初始化定时器计 ...
起用了缓存,你的第29行用了,TIM1->CR1 |= TIM_CR1_ARPE;
因此,就像注释38行、43行说的那样,第一次是把数据从buffer加载到preload寄存器,第二次是把preload寄存器中的数据加载到active寄存器寄存器。
评分
查看全部评分
评分
查看全部评分
UG位是事件更新位,由软件置1,硬件自动清零。
当置1时,重新初始化定时器计数器并生成寄存器的更新。
请注意预分频计数器也被清零(但预分频比不受影响)。
我个人理解为:刚上电时,TIM1_EGR的数据全为零,
通过UG位置1来判断系统预加载是否已经完成。
而第二次 TIM1->EGR |= TIM_EGR_UG;
是为了计数器清零的。
评分
查看全部评分
你说的这个频率不能很高,太高的话中断响应不过来,不过高级定时器的话可以达到很高频率,但是频率切换之间的时间间隔会相对较长
按理来说,两次置位UG的效果应该相同,都会重新开始计数吧。有点迷惑。还有一个问题就是定时器刚启动的时候,DMA传输是在定时器启动前还是第一次计数溢出后开始传输的,还是定时器启动前才开始传输的,从现象来看,启动前就已经出发了传输。
所以一般在程序启动时,会加入一定的延时时间,
作为让系统稳定的过程。
而第一次UG置位,正常情况下是相当于清零,
但是也是防止系统未预加载成功时,作为延时用的。
第二次置位,其实就是纯淬的清零动作了。
你可以试试,注释掉第二句,其实也是可以运行的,
只是在特殊的情况下(比如:未预加载成功时),
就会出现问题了。
第二个问题,其实toofree大神已经解释的很清楚了:
DMA启动传输应该是UG被第二次置位的时候。
第一次是把数据从buffer加载到preload寄存器,
第二次是把preload寄存器中的数据加载到active寄存器寄存器。
评分
查看全部评分