淺談 LPC546xx clock, gpio, timer 使用方式
- LPC5460x簡介
- LPC5460x
The LPC546xx MCU family combines the power efficiency of the 220 MHz Arm® Cortex®-M4 core with multiple high-speed connectivity options
圖 1.1 LPC5460x PCBA
- 包含功能
- I2C, SPI, UART, I2S 共十組
- Full speed USB device 一組, High speed USB device 一組
- 12 bit ADC, 12 組輸入
- DMIC. I2S, Ethernet, CAN
- Timer
LPC54605 EVB 電氣規格
參數 |
LPC54605 工作電壓 |
USB 均插入 5V USB 孔 | |
輸入電壓 |
1.8~3.3V (DC) |
二﹑ LPC5460x Clock 說明:
- Clock 來源
內部可直接選擇 12 MHz, 48MHz, 96MHz, WDT, 內部的 FRO 的準確度為 1%, 可以外掛 32.768K Clock in ( 若有 USB 需求, 則需要外掛精度夠的 Xtal )
- 提供 PLL 功能, 主要 Clock 流程如下圖1
- 圖 2.1
- 呼叫 Init_CPU_Clock () ; 啟動 Clock, 並在帶入想要 Core 執行頻率的值, 及 clock 來源,
若是要跑 12MHz 並使用外部振盪器, 則輸入 Init_CPU_Clock (12000000, external_OSC ) ;
若是要跑 48MHz並使用外部振盪器,則輸入 Init_CPU_Clock (48000000, external_OSC ) ;
若是要跑 96MHz並使用外部振盪器,則輸入 Init_CPU_Clock (96000000, external_OSC ) ;
要測試 Clock 跑多少, 則可以呼叫 Drv_Clock_out (CLOCKOUT_SOURCE); 輸出 Clock, 由 CLOCKOUT_SOURCE 代入參數指定要輸出哪個時鐘來源
三﹑ LPC5460x GPIO 說明
- GPIO 可以設定成輸入上拉下拉, 輸出高電位低電位
- 內部等效電路如下圖1
圖 3.1
- 呼叫 Init_GPIO (); 啟動 GPIO 相關電源 Clock 等, 讓 GPIO 的功能可以使用,
- 呼叫 DRV_GPIO_Out (PORT_Number, PIO_Number, HiLo); 控制腳位輸出高低電位
舉例: PIO1_15 要輸出高電壓,
PORT_Number = 1,
PIO_Number = 15,
HiLo = 1,
DRV_GPIO_Out (1, 15, 1);
- 呼叫 DRV_GPIO_Toggle (PORT_Number, PIO_Number) 可以切換目前腳位電位
- 呼叫 Init_GPIO_Interrupt (Channel_0_to_7, PORT_Number, PIO_Number, Interrupt_mode) 可以設定腳位中斷
舉例: 要 PIO07 做 PINT0 的負緣中斷,
Channel_0_to_7 = 0, 指定要 PINT0 中斷,
PORT_Number = 0,
PIO_Number = 7,
Interrupt_mode = EDGE_FALLING,
Init_GPIO_Interrupt(0, 0, 7, EDGE_FALLING ) ;
四﹑ LPC541x Timer 說明
- 這裡說明 NXP 常使用的 MRT, CTimer 與 SCT 三種 Timer,
- 其中 MRT 是很方便的 Timer, 依 system clock 來做計數頻率, 當計數到該 Channel 設定值時, 會觸發中斷
- SCT 是較多功能的 Timer, 依 system clock 來做計數頻率, 可以設定數到設定值觸發事件, 或是外部腳位電位達到設定值觸發事件, 其事件可以使用狀態來區分, 在不同狀態下可以觸發哪幾種事件,單純的事件也可以設定成腳位輸出, 所以可以設定成 SCT 輸出 PWM, 而以上 SCT 的處理流程完全不用程式碼執行, 只需一開始設定完成後, 即自動對應事件與狀態執行
- CTimer 是 NXP 傳統的 timer, 有硬體對應輸出, 可以進入中斷做修改, 十分方便使用,
- MRT 的系統方塊圖如下圖1,
圖 4.1
- SCT 的系統方塊圖如下圖 4.2,
圖 4.2
- Ctimer 的系統方塊圖如下圖 4.3
圖 4.3
- 呼叫 Init_MRT (); 啟動 MRT 的電源及 Clock 並初始化暫存器設定
- 呼叫 Drv_MRT_Ch0to3_Timer_Interrupt (Sel_Channel0to3, Timer_period, Int_Mode, Ena_Dis); 設定計時器中斷發生的頻率與次數,
舉例: 要觸發每 0.1 秒的中斷並持續觸發
Sel_Channel0to3 = 0, 使用 MRT 裡的 Channel0,
Timer_period = 9600000, 假設 system clock 是跑 96MHz,
所以計數設定為 9.6M 以達每 0.1 秒數滿 9.6M 觸發中斷,
Int_Mode = 0, 不斷觸發
Ena_Dis = 1, 啟動
Drv_MRT_Ch0to3_Timer_Interrupt (0, 9600000, 0, 1);
- 呼叫 Init_SCT_PWM (SCT_HZ); 啟動 SCT 並初始化 PWM 的頻率
- 呼叫 Drv_SCT_PWM_OUTPUT_and_DUTY (SCT_OUTPUTn, SCT_DUTY); 開始輸出 PWM 並設定腳位及 PWM 的 Duty,
舉例: 要打出 1000Hz 並且有 60% 的 Duty 的 PWM,
SCT_HZ = 1000, 1000Hz
SCT_OUTPUTn = 0, SCT0 腳位輸出
SCT_DUTY = 60, 60% Duty
Init_SCT_PWM (1000);
Drv_SCT_PWM_OUTPUT_and_DUTY (0, 60);
- 呼叫 Init_CT32B0(PR , Time); 啟動 Ctimer 並初始化 CTimer 的觸發週期,
舉例: 假設 system clock 是跑 96MHz, 要每 0.01 秒觸發一次中斷,
PR = 0, CPU 每 tick 一次, Ctimer 計數一次
Time = 960000, 當計數達 960000 觸發中斷, 並重新計數,
Init_CT32B0(0, 960000);
評論