一、OCP 原則(開閉原則)
對代碼擴展是開放的,允許通過新增代碼來擴展功能;對代碼的修改是關閉的,盡量避免直接修改已有穩定運行的代碼,以此保障代碼的穩定性與可維護性。
二、中斷處理
(一)中斷函數注冊機制
通過?typedef
?定義函數指針類型?irq_handler
,用于統一中斷處理函數的格式(無參數、無返回值)。
定義中斷向量表?interrupt_vector_table
,存儲不同中斷源對應的處理函數。
提供?system_register_irq
?函數,實現中斷源與處理函數的注冊關聯,遵循 OCP 原則,方便新增中斷處理時,僅需注冊而無需修改已有代碼。
system_interrupt_handler
?函數通過中斷號從向量表中調用對應的處理函數,完成中斷響應。
(二)示例:按鍵中斷
注冊按鍵對應的中斷源?GPIO1_Combined_16_31_IRQn
?與處理函數?key_interrupt_handler
。
在?key_interrupt_handler
?中,檢測 GPIO1 的中斷狀態寄存器(ISR
),若對應按鍵中斷標志置位,執行?led_nor
?操作并清除中斷標志。
三、時鐘系統
(一)時鐘生成核心組件
- PLL(鎖相環電路):實現倍頻功能,公式為?Fout?=Fin?×n(Fin??為輸入頻率,n?為倍頻系數)。
- Prescale(預分頻器):實現分頻功能,公式為?Fout?=Fin?/m(m?為分頻系數)。
- PFD(相位分數分頻器):結合倍頻與分頻,公式為?Fout?=(Fin?×n)/m,可分配n,m的大小(即分數小于零或者大于零),實現倍頻或分頻。
(二)IMX6ULL 中的 PLL
IMX6ULL 有多個 PLL 用于不同模塊時鐘供給,如 ARM PLL(PLL1)為 Cortex - A7 內核提供時鐘,528 PLL(PLL2)作為系統 PLL,USB1 PLL(PLL3)用于 USB 模塊等。
(三)時鐘配置步驟
1. PLL 配置(以 PLL1 為例)
修改 PLL1 前先將內核時鐘置為 24MHz,是為避免切換時鐘時因時鐘不穩定導致 ARM 內核停止工作。具體步驟:
2. 時鐘生成樹(CLOCK ROOT GENERATOR)配置
分別配置關鍵時鐘根:
- AHB_CLK_ROOT:例如選擇 PLL2 PFD02 作為時鐘源,通過寄存器?
CCM_CBCMR
?配置時鐘源選擇位;利用?CCM_CBCDR
?的?AHB_PODF
?進行三分頻,將 396MHz 時鐘分頻為 132MHz。 - IPG_CLK_ROOT:對 AHB 時鐘進行二分頻,配置為 66MHz。
- PERCLK_CLK_ROOT:保持一分頻,時鐘頻率為 66MHz,為相關外設提供時鐘。