RCC : RCC 與CRM 總閘開關(guān)
距離上一章更新已經(jīng)月余,期間一方面陽康,一方面春節(jié),斷更時間確實有點長,今日繼續(xù)更。?
上一章我們聊到時鐘樹的分頻參數(shù)配置屬于整體系統(tǒng)初始化準(zhǔn)備工作,配置完畢之后MCU 的cpu內(nèi)核工作頻率、總線工作頻率等相關(guān)參數(shù)就配置好了,但是要正式啟用設(shè)備,還要有幾個步驟需要走。
簡單來說一個外設(shè)能夠正常工作,一般要經(jīng)過三步:
Enable 對應(yīng)外設(shè)的時鐘,既本章節(jié)內(nèi)容
初始化配置對應(yīng)外設(shè)參數(shù),如GPIO 的模式、spi的相位、時鐘、LSB/MSB等,如果用到DMA還需要提前配置DMA 的信息等
如果存在功能復(fù)用的情況還需要配置功能復(fù)用(STM32 叫 AF, alternative function ,AT叫 Mux )根據(jù)具體的使用模式,配置中斷處理、DMA處理等響應(yīng)函數(shù),最后使能外設(shè),進入到工作狀態(tài)
可見使能外設(shè)時鐘是保證芯片外設(shè)功能啟用的第一步,外設(shè)時鐘的管理,在MCU里一般都在“復(fù)位和時鐘控制”章節(jié),具體詳情可以參考具體的芯片手冊,一般都包括芯片復(fù)位的條件及時序、時鐘選擇(內(nèi)部時鐘源與外部時鐘源、PLL、總線分頻等,上一章節(jié)已經(jīng)鋪墊)、時鐘控制寄存器等信息。
本篇我們繼續(xù)說時鐘控制寄存器,時鐘控制寄存器 包括時鐘源配置(含PLL參數(shù)、時鐘輸出MCO)與外設(shè)時鐘源開關(guān)兩部分 , 時鐘源的配置我們已經(jīng)在上個章節(jié)聊過,我們繼續(xù)聊bf的MCO 和外設(shè)時鐘開關(guān)兩部分
MCO:
MCO的主要功能有兩部分用途,一、引出時鐘源,作為其他芯片的時鐘源輸入,實現(xiàn)芯片之間主-從頻率同步, 避免使用不同的時鐘源導(dǎo)致芯片之間的不同步。? 二、引出時鐘源做診斷,判斷當(dāng)前芯片的頻率是否準(zhǔn)確,是否存在溫飄等。?
bf 的mco 配置包括三部分:
USE_MCO 宏,在 src/main/target/common_pre.h 中不同芯片是否定義此宏,決定是否啟用mco特性,bf 的各種編譯配置信息也基本都在 common_pre.h common_post.h 以及對應(yīng)target.h、target.c中通過宏定義進行配置。?
src/main/pg/mco.h mco 的開關(guān) 、時鐘源、分頻系數(shù)進行配置,在 init.c 中配置mco
src/main/drivers/mco.h mco.c? 的mco 配置函數(shù)?
void mcoConfigure(MCODevice_e device, const mcoConfig_t *config);
函數(shù)主要流程:?
初始化 GPIO?
配置? GPIO? AF?
配置 MCO輸出時鐘源 、分頻系數(shù)
配置MCO 輸出使能?
能夠輸出MCO 的GPIO針腳,需要查詢用戶手冊、數(shù)據(jù)手冊的GPIO mux 表,stm32 與at32 支持PA8 作為默認(rèn)mco輸出, 另外部分STM32芯片支持第二路mco 輸出等。
時鐘源開關(guān)配置
bf 的時鐘源開關(guān)配置代碼,在src/main/drivers/rcc.h rcc.c ,默認(rèn)使用了 HAL 的RCC宏,主要是 RCC_ClockCmd函數(shù)?RCC_ResetCmd 兩個宏,
比如開啟GPIOA 的時鐘? 使用 RCC_ClockCmd(GPIOA,ENABLE)?
移植的重點與難點:?
STM32 的HAL庫是通過RCC 宏定義直接操作 時鐘外設(shè)使能控制寄存器如 RCC->AHBxENR 以及 時鐘外設(shè)復(fù)位控制器如 RCC->AHBxRST ,對對應(yīng)外設(shè)進行時鐘使能和復(fù)位控制,但是在AT32 的bsp庫里,寄存器設(shè)置類似,但是未采用響應(yīng)的庫函數(shù)設(shè)計, at32采用了
void crm_periph_clock_enable(crm_periph_clock_type value, confirm_state new_state);
void crm_periph_reset(crm_periph_reset_type value, confirm_state new_state);
在代碼使用上如果大面積修改為通過函數(shù)調(diào)用方式來移植,勢必代碼修改量很大而且兼容性也不是特別好。 因此在遷移到AT32 的時候,采用了一個取巧的方式,
1、新增 rcc_at32_periph.h ,根據(jù)AT32 具體外設(shè)的寄存器偏移量,構(gòu)建每個外設(shè)的操作掩碼
配置,兼容HAL庫的寄存器操作方式
2、修改 rcc.c 中3個宏定義為直接操作 AT32 的CRM寄存器,通過掩碼來操作寄存器位,實現(xiàn)與HAL庫RCC 宏操作移植
通過上述移植,實現(xiàn)了bf 內(nèi)全量RCC_ClockCmd 函數(shù)在At32 MCU上的兼容。?