1. 程式人生 > 其它 >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的週期中斷