如果你要深入學習STM32,那么你就應該深入研究STM32從啟動開始到結束的各個過程,清楚認識整個過程,才會避免在今后的開發中遇到各種玄學問題(雖然博主也經常遇到各種玄學問題),很多情況下玄學問題都是因為自身對問題沒有足夠深入的認識。
啟動過程???許多剛入門STM32的小白可能會一臉懵逼,我可以正常的寫流水燈程序呀,我從來就沒設置過啟動過程。那么說明你對STM32的固件庫還沒有足夠清晰的認識,我們雖然沒有足夠的能力去寫啟動程序,但是我們應該學會去閱讀、認識這個過程。此處借助原子的Template工程沒有資料的從此處下載:啟動程序是./CORE/startup_stm32f40_41xxx.s
這是一段匯編代碼,主要是一些內存、中斷向量、時鐘的初始化。本博的匯編基礎為零(留下不學無術的眼淚),有興趣的參考如下博文介紹:
STM32啟動過程--啟動文件--分析
STM32時鐘樹
1.為什么要有時鐘樹:
學過其他的MCU(AVR、51)的同學都知道,哪有什么時鐘樹,時鐘全都是梭哈的統一時鐘,但是為什么STM32要煞費心機構造這樣一個復雜時鐘樹呢,當然是為了低功耗,對于時鐘頻率要求高的掛載在頻率高的時鐘線。
2.時鐘樹結構簡介
STM32具有多個時鐘源,同時可編程配置時鐘選擇。首先我們先官方手冊分析四種為什么分析STM32時鐘樹結構:
首先我們記住幾個關鍵的名詞:
HSE( High Speed External ):高速外部時鐘、LSE(Low Speed External):低速內部時鐘、HSI(High Speed Internal):高速內部時鐘以及 LSI(Low Speed Internal):低速內部時鐘。(建議借助英文理解,方便記憶)
看到看到上面的時鐘樹構造圖各位估計懵了,沒關系,我帶大家一步一步分析(分析SYSCLK產生過程)
大多數配置方式是選擇HSE作為時鐘源,過程路徑:
HSE --> 倍頻器 --> PLLCLK --> SYSCLK
但是,我們就產生一個以為了,我板載 8M外部晶振,在代碼中怎么配置選擇門和倍頻器得到官方標準的 168M SYSCLK呢
下面我們走進代碼看看是怎么一回事:
我們來到啟動文件的182行:
在keil平臺下我們跳進函數看看(編譯后才能跳轉):
void SystemInit(void)
{
/* FPU settings ------------------------------------------------------------*/
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */
#endif
/* Reset the RCC clock configuration to the default reset state ------------*/
/* Set HSION bit */
RCC->CR |= (uint32_t)0x00000001;
/* Reset CFGR register */
RCC->CFGR = 0x00000000;
/* Reset HSEON, CSSON and PLLON bits */
RCC->CR &= (uint32_t)0xFEF6FFFF;
/* Reset PLLCFGR register */
RCC->PLLCFGR = 0x24003010;
/* Reset HSEBYP bit */
RCC->CR &= (uint32_t)0xFFFBFFFF;
/* Disable all interrupts */
RCC->CIR = 0x00000000;
#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)
SystemInit_ExtMemCtl();
#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */
/* Configure the System clock source, PLL Multiplier and Divider factors,
AHB/APBx prescalers and Flash settings ----------------------------------*/
SetSysClock(); /*注意*/
/* Configure the Vector Table location add offset address ------------------*/
#ifdef VECT_TAB_SRAM
SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
#else
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
#endif
}
根據官方注釋,我們可以知道這是在開啟各個時鐘源。
跳進setSysClock();
跳入PLL_M的宏定義代碼段
通過這里我們就可以計算出我們的PLLCLK的數值了
PLLCLK = (HSE / PLL_M ) * PLL_N / PLL_P;
PLLCLK = (8M / 8 ) * 336 / 2 = 168M
但是別忘了,我們還有個選擇門沒有配置,同樣在 SetSysClock 中
但是這樣就ok了嗎,注意,我們一直沒定義HSE的值,并且HSE是可以變化的,當然會留接口給我們設置,在stm32f4xx.h中:
這樣就可以獲得我們需要的168M SYSCLK了
補充,AHB 和 APB1、APB2的相關配置也在 SetSysClock 中,你可以閱讀相應的源代碼何修改配置去得到想要的時鐘參數
通過 jlink 調試可以獲得我們的時鐘數值(源代碼)
上一篇:STM32-串口通訊工作原理
下一篇:用stm32Cube生成103c8t6的usb驅動
推薦閱讀
史海拾趣
近年來,全球半導體行業面臨了諸多挑戰,包括供應鏈緊張、技術迭代加速等。面對這些挑戰,Globaltech積極調整戰略,加強與上游供應商和下游客戶的溝通與合作,確保供應鏈的穩定。同時,公司還加大了對新技術和新產品的研發投入,以應對行業變化帶來的挑戰。通過這些努力,Globaltech不僅成功應對了行業挑戰,還實現了業務的持續增長。
進入21世紀,ASM公司開始關注中國市場的潛力。隨著中國經濟的快速增長和半導體產業的蓬勃發展,ASM公司看到了巨大的商機。公司加大了對中國市場的投入,與中國半導體代工廠建立了緊密的合作關系,為中國市場提供了高質量的產品和服務。這一舉措不僅促進了ASM公司在中國市場的快速發展,也為中國半導體產業的進步做出了貢獻。
Digitron公司非常重視產品的品質和售后服務。公司建立了嚴格的質量控制體系,確保每一臺出廠的設備都符合高標準的質量要求。同時,Digitron公司還提供全方位的售后服務,包括技術支持、維修保養等,確保客戶在使用過程中得到及時、有效的幫助。這種對品質的堅持和對客戶的關懷使Digitron公司在客戶中樹立了良好的口碑。
近年來,隨著智能手機和移動互聯網技術的快速發展,傳統的GPS導航設備市場受到了巨大沖擊。面對這一行業變革,DeLorme公司及時調整戰略方向,將重心轉向智能導航應用軟件的開發和推廣。他們通過與智能手機廠商的合作,將自己的導航軟件集成到手機系統中,為用戶提供更加便捷、高效的導航服務。同時,他們還積極探索新的商業模式和市場機會,為公司的未來發展奠定了堅實基礎。
請教各位,現在需要做個USB接口的鍵盤程序,先是通過遙控器按鍵向紅外線接收頭發送信號并解碼 這些部分現已完成 問題: 由于對USB協議不熟,現在正在學習中 1.請教各位,我解碼后的數據怎么 ...… 查看全部問答∨ |
在運行TOPWIN2005的時候出現了EAcess violation的錯誤,我點了確定后顯示 Acess violation at address 740b0cc2,read of address 740b0cc2,是怎么回事? 我是第一次用TOPWIN2005,不好意思! 請哪位大俠幫個忙,小妹我不勝感激!… 查看全部問答∨ |
DeviceIoControl()如何向U盤發送SCSI命令??!! 主要是DeviceIoControl() 的第2個參數如何設置 請大家多多指教!! 那個參數是在哪個頭文件中定義的呢??… 查看全部問答∨ |
|
問一下哪位朋友用過STM32F103RC 的片子的 我用TIM5做定時器時出錯 老是跳進 void HardFaultException(void) { /* Go to infinite loop when Hard Fault exception occurs*/ while (1) { ...… 查看全部問答∨ |