最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

RCC : RCC 與CRM 總閘開關(guān)

2023-01-25 23:05 作者:二木山人  | 我要投稿

距離上一章更新已經(jīng)月余,期間一方面陽康,一方面春節(jié),斷更時間確實有點長,今日繼續(xù)更。?

上一章我們聊到時鐘樹的分頻參數(shù)配置屬于整體系統(tǒng)初始化準(zhǔn)備工作,配置完畢之后MCU 的cpu內(nèi)核工作頻率、總線工作頻率等相關(guān)參數(shù)就配置好了,但是要正式啟用設(shè)備,還要有幾個步驟需要走。

簡單來說一個外設(shè)能夠正常工作,一般要經(jīng)過三步:

  1. Enable 對應(yīng)外設(shè)的時鐘,既本章節(jié)內(nèi)容

  2. 初始化配置對應(yīng)外設(shè)參數(shù),如GPIO 的模式、spi的相位、時鐘、LSB/MSB等,如果用到DMA還需要提前配置DMA 的信息等

  3. 如果存在功能復(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上的兼容。?





RCC : RCC 與CRM 總閘開關(guān)的評論 (共 條)

分享到微博請遵守國家法律
思南县| 尉氏县| 奉化市| 阿拉善右旗| 衡阳县| 绥芬河市| 景洪市| 于都县| 瑞昌市| 大安市| 漾濞| 肇州县| 泸州市| 保德县| 郴州市| 平山县| 花垣县| 乌鲁木齐市| 云林县| 惠安县| 富顺县| 婺源县| 安阳市| 桑植县| 柳江县| 深圳市| 伊金霍洛旗| 哈尔滨市| 大名县| 榆社县| 宜川县| 四会市| 吴江市| 二连浩特市| 平阴县| 密云县| 靖边县| 扶沟县| 务川| 钟祥市| 南京市|