最近在做一個便攜式儲能的 BMS 項目,使用的主控晶片是晶豐明源的 LKS32MC45x 系列 MCU。由於要做一個 LED 的呼吸燈控制,涉及到的外設有 GPIO 和通用定時器 UTimer。以下是關於LED 呼吸燈控制的驅動說明。
一、模塊初始化配置
PWM 的配置主要有:GPIO 的初始化配置、UTimer 模塊的初始化配置。
1、GPIO 的初始化配置
以 P2_12(Timer4-CH1) 為例,LKS32MC45x 系列 MCU 要求將 IO 配置為輸出(OUTPUT)。
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStruct.GPIO_PODEna = DISABLE; GPIO_InitStruct.GPIO_PFLT = DISABLE;
GPIO_Init(GPIO2,&GPIO_InitStruct); |
接著要把 P2_12(Timer4-CH1) 管腳配置成復用 TIMER4 模式。
GPIO_PinAFConfig(GPIO2, GPIO_PinSource_12, GPIO_AF_TIMER4); // P2.12復用為Timer4CH1的輸出模式 |
2、UTimer 模塊的初始化配置
UTimer4 模塊的初始化配置如下。這些參數中要注意系統時鐘頻率為 192MHz。參數配置如下:
- 將系統時鐘頻率(CLK_DIV) 8 分頻,得到 UTimer4 的工作頻率為 24MHz。
- 將計數器門限(TH)設為 24000,即每 1ms 計數器清零,也就是 PWM 的頻率是 1kHz。
- 將 Timer4 的通道 1 工作模式(CH1_MODE)設為比較模式,輸出極性(CH1_POL)為 1。
- 開啟 Timer4 的回零中斷(UTIMER_IE_ZERO)。
TIM_InitStruct.EN = ENABLE; // Timer 模塊整體使能,高有效 TIM_InitStruct.ETON = 0; // Timer 計數器計數使能配置 0:自動運行 1:等待外部事件觸發計數 TIM_InitStruct.CLK_DIV = UTIMER_Clk_Div8; // Timer 計數器分頻設置,192000 000/8=24000 000Hz; TIM_InitStruct.CLK_SRC = UTIMER_CLK_SRC_MCLK; // Timer 時鐘源 TIM_InitStruct.CH1_POL = 1; // Timer通道1在比較模式下的輸出極性控制,當計數器計數值回零時的輸出值 TIM_InitStruct.CH1_MODE = UTIMER_MODE_CMP; // Timer通道1的工作模式選擇,默認值為0 TIM_InitStruct.TH = 24000; // Timer 計數器計數門限。 TIM_InitStruct.CMP1 = 24000; // Timer 通道1工作在比較模式時,當計數器計數值等於CMP1時,發生比較事件。 TIM_InitStruct.FLT = 0; // 通道0/1信號濾波寬度選擇。取值範圍0~255 TIM_InitStruct.IE = UTIMER_IE_ZERO; // 開啟Timer模塊回零中斷
UTIMER_Init(UTIMER4, &TIM_InitStruct); |
3、中斷的初始化配置
由於需要用到中斷功能,所以需要開啟 UART 中斷,並設置其中斷優先級,比如:
NVIC_SetPriority(TIMER4_IRQn, 1); // 設置 UTimer4 中斷優先級 NVIC_EnableIRQ(TIMER4_IRQn); // 使能 UTimer4 中斷 |
二、呼吸燈的實現
1、開啟呼吸燈
開啟呼吸燈,需要打開 UTimer4,並把 IO 管腳配置為復用 TIMER 模式。
對 Timer4 的通道 1 來說,在計數器回零時,輸出一個電平到 TIMER4_CH1,當計數到 UTIMER4_CMP1 即比較事件發生時,電平翻轉,輸出另一個電平到 IO 口 TIMER4_CH1。所以在UTimer4 的中斷處理函數中,改變 CMP1 的值,即可改變 PWM 的占空比。
中斷處理函數內容如下:
void TIMER4_IRQHandler(void) { static int Timer_flag = 0; if (UTIMER4_IF & BIT2) // 判斷UTimer4是否發生回零中斷 { UTIMER4_IF = BIT2; // 清除UTimer中斷標誌位 if(LED_PWM_UpDown) { LED_PWM_CMP += LED_PWM_Step; // 占空比增大 if(LED_PWM_CMP>LED_PWM_TH) // 當占空比達到 100%,則開始減小占空比 { LED_PWM_CMP=LED_PWM_TH; LED_PWM_UpDown=0; } } else { if(LED_PWM_CMP>LED_PWM_Low) { LED_PWM_CMP -= LED_PWM_Step; // 占空比減小 } else // 當占空比太小時,則開始增大占空比 { LED_PWM_UpDown=1; } } UTIMER4_CMP1 = LED_PWM_CMP; // 賦值 CMP1 } } |
2、關閉呼吸燈
關閉呼吸燈,需要關閉 UTimer4 的時鐘,並且將 IO 管腳配置為普通 IO。最後將 IO 管腳設置為 LED 熄滅的電平。
UTIMER_Disable(UTIMER4); GPIO_PinAFConfig(GPIO2, GPIO_PinSource_12, GPIO_AF_GPIO); // P2.12設置為 GPIO 的模式 GPIO_ResetBits(GPIO2, GPIO_Pin_12); |
三、總結
以上是關於晶豐明源的 LKS32MC45x 的 UTimer 模塊配置,控制一個呼吸燈的軟體驅動的說明。如果想了解更多,可以在下方評論區留言,或者發郵件給我們:atu.sh@wpi-group.com。
四、參考資料
- LKS32M45x 用戶手冊:LKS32MC45x_UM_v1.52.pdf。
- LKS32M45x 外設示例工程:lks32mc45x_demo_prj_v2.9。
如有更多需求,歡迎聯繫大聯大世平集團 ATU 部門:atu.sh@wpi-group.com 作者:五月小姐姐
更多資訊,請掃碼關注我們!
評論