LPC55 使用 SCTimer 做簡單超時定時器

關鍵字 :lpc55sctimersct定時器32bit

      最近有客戶需求使用 LPC55 SCTimer 做一個簡單的定時器,用於判斷程序等待超時,這篇文章就主要介紹下,使用 SCTimer 做定時器的一些配置;LPC55 系列外設大差不差,這裡筆者主要以 LPC5528 來演示,主要基於 LPC5528 HelloWord 工程進行演示;

      首先是 SCTimer 的初始化配置,即配置 SCTimer 的 configuration 寄存器,可以參考 SDK 中 SCTIMER_GetDefaultConfig 結合LPC55 用戶手冊來對照配置,LPC55 SCTimer 可以分為兩個 16bit 的計數器,或者合併為一個 32bit 的計數器,這裡筆者配置的是 32bit 的計數器,因此將 UNIFY 置一;

        LPC55 使用 SCTimer 做簡單超時定時器

      SCTimer 時鐘這裡使用 System clock mode,因此不需要對該位進行特殊設置;

        LPC55 使用 SCTimer 做簡單超時定時器

      同時設置 auto limit,這樣在定時時間到時,會自動清除定時器,或者改變計數方向(SCTimer 有兩種計數方式,Up 和 Up-down),前面提到過 SCTimer 可以分為兩個 16bit 的計數器,因此有很多寄存器位分為 _L 和 _H,用於分別配置兩個 16bit 的計數器,當合併使用為一個 32bit 計數器時,只需要配置 _L 寄存器即可,因此這裡只需配置 AUTOLIMIT_L 置一;

        LPC55 使用 SCTimer 做簡單超時定時器

      接下來可以參考 LPC5528 用戶手冊的 Fig 92. SCT event configuration and selection registers 來做進一步配置;

        LPC55 使用 SCTimer 做簡單超時定時器

      首先是配置 MATCH 寄存器,但 MATCH 寄存器中的值與計數寄存器的值匹配時 ,對應的 MATCH 事件產生,也就是配置定時的時間可以通過這個值設定;以匹配事件 0 為例,這裡可以直接配置 MATCHREL[0] 寄存器,每個定時周期開始前,MATCH 寄存器會從其對應的 MATCHREL 寄存器加載值(前提是 NORELOAD_L 沒有被設置為 1),因為前面配置了 SCTimer 為一個 32bit 的寄存器,所以在配置 MATCHREL [0] 寄存器時,可以將其當成完整的一個 32bit 的寄存器進行配置;

        LPC55 使用 SCTimer 做簡單超時定時器

      配置 EV0_CTRL,MATCHSEL 設置 MATCH 0,可以使用寄存器默認值;

        LPC55 使用 SCTimer 做簡單超時定時器

      這裡應用中不需要 IO 的控制,這裡不需要對 SCT_IN、SCT_OUT、IOSEL 等寄存器,看到 COMBMODE,這裡配置僅匹配,設置為 0x01;


        LPC55 使用 SCTimer 做簡單超時定時器

      EV0_STATE 這裡配置為全1,在所有狀態下均允許匹配事件0 產生;

        LPC55 使用 SCTimer 做簡單超時定時器

      接著使能匹配事件 0 中斷,並使能 SCTimer 中斷;

        LPC55 使用 SCTimer 做簡單超時定時器

      最終的初始化代碼如下:

void SCT_Init(void)
{
CLOCK_EnableClock(kCLOCK_Sct0);
SCT0->CONFIG = (1 << SCT_CONFIG_UNIFY_SHIFT) | (1 << SCT_CONFIG_AUTOLIMIT_L_SHIFT);
SCT0->MATCHREL[0] = SystemCoreClock/2;//500ms
SCT0->EV[0].CTRL= (1 << SCT_EV_CTRL_COMBMODE_SHIFT);
SCT0->EV[0].STATE=0xFFFFFFFF;
SCT0->EVEN = (1 << SCT_EVEN_IEN_SHIFT);
EnableIRQ(SCT0_IRQn);
SCT0->CTRL &= ~(SCT_CTRL_HALT_L_MASK);//Start
}

      SDK 中 SCT0_IRQHandler 為弱定義函數,這裡筆者為了方便測試,直接重寫 SCT0_IRQHandler,這樣在編譯時,會覆蓋原先 SDK 中的 SCT0_IRQHandler;

void SCT0_IRQHandler(void);
void SCT0_IRQHandler(void)
{
//Clears the SCTimer status flags
SCT0->EVFLAG = (1 & 0xFFFFU);
SCT0->CONFLAG = (1 & (SCT_CONFLAG_BUSERRL_MASK | SCT_CONFLAG_BUSERRH_MASK));
PRINTF("SCT0_IRQHandler\r\n");
SDK_ISR_EXIT_BARRIER;
}

      編譯燒錄後運行,可以看到已經可以成功定時 500ms;

        LPC55 使用 SCTimer 做簡單超時定時器

      以上就是文章的全部內容,如果有錯誤或者遺漏歡迎大家留言討論,不吝指教,感謝;

參考資料:
UM11126 LPC55S6x/LPC55S2x/LPC552x User manual
AN11538 SCTimer/PWM Cookbook

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論