20210108 用T12的通道0 的比较事件触发 T13的单次设计模式 并使能T13的周期中断
T13同步T12的事件都有
如果配置CCU工作在霍尔模式下,则此时的定时器T12的捕捉 比较模式没有用了,
因为T12在正确的霍尔事件后就自动清0了,然后重新计数, 然后在正确的偶尔事件之后
就又清零。
第一步:
我需要重新设计定时器T13 的周期的函数
在IFXCCU6.H中
16位计数器 最大的延时就是 65535*0.01us = 655us
测试 分频系数为0 的时候 周期寄存器5000 对应20kHz 测试ok 波形PM58
分频系数为1 的时候 周期寄存器5000 对应10kHz 测试 波形PM59
函数内容
/******************************************
* 作用:设置f(T13)的分频系数,时钟,T13的周期寄存器
* steven_Bai
* ****************************************/
IFX_INLINE void IfxCcu6_setT13PeriodValueFreqDiv(Ifx_CCU6 *ccu6, uint16 f_DIV, Ifx_TimerValue resolution)
{
uint16 prescaler;
float32 freqT1x = 0, periodT1x;
float32 freqCC6 = (float32)IfxScuCcu_getSpbFrequency(); /*获得SPB的时钟*/
Ifx_TimerValue period;
prescaler=f_DIV; /*分频系数为0*/
freqT1x = freqCC6 / (1U << prescaler); /*设置的T13的频率是100M*/
periodT1x = resolution; /*设置周值,对应的周期是 periodT1x乘freqT1x */
if (prescaler < 16)
{
uint16 periodVal;
boolean additionalPrescaler;
IfxCcu6_TimerInputClock clockInput;
period = ((Ifx_TimerValue)(periodT1x / 2)) * 2;
periodVal = (uint16)(period - 1);
IfxCcu6_setT13PeriodValue(ccu6, periodVal);
IfxCcu6_enableShadowTransfer(ccu6, FALSE, TRUE); /*使能T13周期寄存器的影子寄存器传送*/
clockInput = (IfxCcu6_TimerInputClock)(prescaler & 0x7U);
IfxCcu6_setInputClockFrequency(ccu6, IfxCcu6_TimerId_t13, clockInput); /*设置f(T13)分频系数*/
additionalPrescaler = ((prescaler & 0x8U) != 0);
if (additionalPrescaler)
{
IfxCcu6_enableAdditionalPrescaler(ccu6, IfxCcu6_TimerId_t13);
}
}
else /*分频系数大于16 装不下 不设置*/
{
/** \retval IfxCcu6_Stat_wrongPwmFreq if the T12 prescaler can't fulfill the
* required frequency */
}
}
现在使能定时器13的周期匹配 :
还是用P22.1 看是否响应了 T13的周期中断
现在我发现T13 的中断服务程序 用已经调试好了
示波器的1通道 是T12的输出调制模块 用的是T13 的计数输出 cc60
周期寄存器是5000 比较寄存器区是2500
3通道是周期中断服务程序中进行电平的反转
示波器PM60
现在开始调试 用T12 为比较匹配事件
在这之前 ,需要先能关闭定时器T13
定时器T12 T13 的启动 在TCTR4寄存器的
定时器T12 T13 阴影寄存器的传送使能
如果要停止定时器T13
改正以后 发现定时器T13确实不在计数了。
现在调试 T12的输出比较功能。 CC60的输出用T12 的通道0进行输出
现在首先把T12 的输出频率
先把T12的通道0 的比较输出 可以通过示波器显示出来
同时设置 PSLR寄存器的 PSL0 PSL1均为 0
现在开始改变定时器T12 的频率
的频率是100M 周期寄存器是5000
的频率是100M 周期寄存器是 1000
使能f(T12)的比较事件 启动F(T13)的单次计数模式
首先要选择 F(T13)的同步触发事件 是定时器T12的比较匹配
其次 是 使能 F(T13)同步F(T12)
最后 要使能F(T13)的周期中断
因为禁止了启动定时器T13 所以T13如果启动的话 只能是因为 T12的同步事件启动的。
定时器T13同步定时器T12的 寄存器的操作是在哪里实现的?
即相TCTR2寄存器的T13TEC 位阈写入 1
(最后很重要)
此时 不再需要给T13写入compare_value ,另外还需要设置定时器T13工作模式
是单次设计模式
IfxCcu6_setSingleShotModeEnable(ccu6SFR ,FALSE ,TRUE )
下载程序以后 观察现象
示波器的波形 如下图 : PM61所示
通道1 是T12的调制输出模块 CC60通道 选择的是定时器T12通道0的CC60_O输出
通道2 是T12的调制输出模块 CCOUT60通道选择的是定时器T12通道1 的COUT60_O输出
通道3 是定时器T13的单次射击模式运行 产生的周期中断, 在该中断服务程序下把
P22.1 的电平 进行 翻转 、
定时器T13的单次射击模式的启动 由于T12的比较通道0的比较匹配事件进行触发
即通道3就是 引脚P22.1 的输出电平
因为 的频率是100MHz 的频率也是 100MHz
的周期寄存器是 5000 比较寄存器的值是1000
单次射击模式 周期寄存器的值是1000
所以 三号通道应该是在 在一号通道的上升边沿延时1000个 时钟周期后进入
中断服务程序让那电平 反转 波形如图: 就是延时 10us
PM61 PM62
波形PM64 另外一个点
至此处 用T12的通道0的比较匹配触发定时器 T13的单次射击模式 程序部分已经编写
完成了 。