其他分享
首页 > 其他分享> > 20210108 用T12的通道0 的比较事件触发 T13的单次设计模式 并使能T13的周期中断

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_setSingleShotModeEnableccu6SFR ,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的单次射击模式 程序部分已经编写

完成了  。

 

 

源文档以及程序上传到百度网盘  文件名字 是 : 

20210108 用T12的通道0 的比较事件触发 T13的单次设计模式 并使能T13的周期中断

标签:定时器,设计模式,周期,T13,T12,寄存器,IfxCcu6
来源: https://www.cnblogs.com/bailongwei654321/p/15780717.html