发布网友 发布时间:2022-04-19 09:53
共2个回答
热心网友 时间:2023-08-06 10:42
我这以2812为例,说一下吧。
大前提:
各个模块的时钟要打开,有一次我就忘开全局时钟,结果查了半天错,郁闷死了。
各级中断保证打开(外设级,PIE级,cup级),这我也吃过亏。
首先要配置你要捕获的定时器值的值,如下:
//T4寄存器配置
EvbRegs.T4CON.bit.TENABLE=0;
EvbRegs.T4CON.bit.TMODE=2;//连续增计数模式
EvbRegs.T4CON.bit.TPS=5;//T4_CLOCK=HSPCLK/32=2.34375MHz
EvbRegs.T4CON.bit.TCLKS10=0;//选择内部时钟
注意几点:
要保证捕获周期时间要小于定时器记到最大值的时间,不然定时器跑一圈了,还没有捕获产生就产生溢出了。这里我要捕获市电的过零点,所以我定时器计一圈的时间大于20ms。
一般让定时器工作在连续增计数模式。
然后就是捕获单元的配置,如下:
//捕获单元配置
EvbRegs.CAPCONB.bit.CAPRES=0;
EvbRegs.CAPCONB.bit.CAPQEPN=0;//禁止捕获4和5
EvbRegs.CAPCONB.bit.CAP45TSEL=0;//选择T4定时器
EvbRegs.CAPCONB.bit.CAP4EDGE=1;//检测上升沿
主要就是上面四句话,先复位,然后为你的捕获单元选择定时器,选择要捕获的边沿。(这里我没有直接开启捕获,是因为还没到时候,具体什么时候开,主程序中有逻辑控制)
最后就是捕获中断函数了,这里就不将函数写出来了,根据自己的需求写就行。别忘了退出中断前要清楚中断标志位,以防重复进入中断。
热心网友 时间:2023-08-06 10:42
买本参考书看看