14.1 初學者重要提示
電源管理部分涉及到的各種低功耗方式會在后面章節中為大家講解,當前階段僅需了解低功耗屬于電源管理部分即可。
14.2 電源
電源是系統穩定運行的根本,主要分為以下幾個知識點,電源供電、供電監控、電源管理和低功耗。當前階段主要了解電源供電和硬件上電時序。
14.2.1 電源供電
學習STM32F429的電源供電,往往被一堆電源標識Vdd,Vdda,Vcap,Vss等搞迷糊,這些標識整明白了,電源供電部分也就理解了,首先看下面的框圖:
這些常用標識的解釋如下:
對于電源供電部分了解了這些知識點就夠用。
14.2.2 電源去耦電容的選擇
每個電源對 (VDD/VSS, VDDA/VSSA ...)必須使用下述的濾波陶瓷電容去耦。這些電容必須盡量靠近芯片引腳,以確保器件正常工作。不建議去掉濾波電容來降低PCB 尺寸或成本,這可能導致器件工作不正常。?
14.3 硬件復位
所有數字計算機系統都是由某種形式的震蕩時鐘電路驅動的。這種電路被稱為系統的“脈搏”,是系統正確運行的關鍵。如果振蕩器失靈,系統將完全無法運行,如果振蕩器運行不規律,系統執行的所有與時間有關的計算都會有誤差。
所有微控制器的啟動流程都不通用。由于硬件的復雜性,必須運行一段由廠家定義的短小的“復位程序”來使硬件處于一種正確的狀態,然后再開始執行用戶程序。運行這個復位程序需要時間并且要求微控制器的振蕩器已經運行。
當系統由可靠的電源供電時,一旦通電,電源迅速地達到額定輸出電壓,一旦斷電,電源迅速地下降到0V,并且在接通的時候,電壓不會降低。這時能夠可靠地使用基于一個電容和一個電阻的低成本硬件復位。這種形式的復位電路稱為阻容復位。
如果電源不夠可靠,而涉及安全性,這種簡單的阻容解決方案就不合適了。
14.3.1 上電復位和手動復位
STM32F429開發板的硬件復位原理圖如下:
STM32這款CPU的復位引腳是低電平有效,即NRST為低電平時,CPU處于復位狀態。
R173和C114組成簡單的RC復位電路。當系統上電瞬間,C114電容兩端電壓可以認為是0,CPU處于復位狀態。3.3V電源通過R173給C114充電,當C114的電壓升到CPU的高電平門檻電壓時,CPU退出復位狀態轉入運行狀態。
在設計電路時,需要選擇適當的R值和C值,以保證NRST低電平持續時間滿足CPU復位最小脈寬的要求。
當按下S4輕觸開關時,C114兩端被短路接地,可實現手動復位CPU。
注,根據需要,大家也可以使用STM32F429 NRST引腳的內部上拉:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=93144
14.3.2 復位序列
前面第11章的13.3.1小節講解了復位系列的相關知識,再結合本章節的上電復位和下電復位,大家會對其有一個較全面的認識,更多復位序列的知識直接看13.3.1小節即可。
14.4 軟件復位
除了上電和手動復位,程序設計設置中還經常要用到軟件復位,即調用一條函數就可以實現復位功能。此函數已經由CMSIS軟件包中的core_cm4.h文件提供,函數如下:
/** \brief System Reset \details Initiates a system reset request to reset the MCU. */ __STATIC_INLINE void __NVIC_SystemReset(void) { __DSB(); /* Ensure all outstanding memory accesses included buffered write are completed before reset */ SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ __DSB(); /* Ensure completion of memory access */ for(;;) /* wait until reset */ { __NOP(); } }
軟件復位反映到實際硬件上,就是給硬件復位部分發一個復位信號:
14.5 RCC時鐘控制
STM3F429有如下六種時鐘可供使用:
HSI (High-speed internal oscillator) :
HSI是內部的高速RC振蕩器,頻率16MHz,可被用于系統時鐘。優勢是低成本,無需外部時鐘,快速啟動(僅需幾個微秒),缺點是精度差,即使經過校準。
HSE (High-speed external oscillator):
HSE是外部的高速振蕩器,通過外接時鐘源,有源或者無源晶振驅動,時鐘范圍4-26MHz。優勢是精度高,缺點是增加成本。
LSE (Low-speed external oscillator)
LSE是外部的低速振蕩器,通過外接時鐘源,有源或者無源晶振驅動,一般接32.768KHz,主要用于RTC實時時鐘。
LSI (Low-speed internal oscillator)
LSI是內部的低速RC振蕩器,頻率約是32KHz,主要用于獨立看門狗和自動喚醒,也可以用于RTC實時時鐘。
通過下面的時鐘樹再進一步的認識這幾個時鐘:
14.5.1 HSE和LSE硬件設計
HSE時鐘
當前V6開發板是用的8MHz晶振為HSE提供時鐘,硬件設計如下:
晶振和負載電容需要盡可能近地靠近F4的晶振引腳,以減小輸出失真和啟動穩定時間。負載電容值必須根據選定的晶振進行調節。
對于C109和C111,我們推薦使用高質量陶瓷電容,這種電容是設計用于需要高頻率的場合,并且可以滿足晶體或諧振器的需求。C109和C111通常具有相同的值。
這里再額外補充一個知識點,HSE旁路時鐘和外置晶振區別:當前V6板子是采用的外置晶振模式,高速外部 (HSE) 時鐘可以使用一個4到26MHz 的晶振 / 陶瓷諧振振蕩器產生:
而bypass 旁路的意思就是不使用它,繞過它。具體到HSE旁路的話,用戶直接提供4-26MHz的時鐘源即可,可以使用有源晶振或者FPGA提供時鐘等方式:
LSE時鐘
當前V6開發板是用的32768Hz晶振為LSE提供時鐘,硬件設計如下:
STM32的LSE晶振起振難(又稱RTC起振)是老毛病了,選取晶振和配套電容比較講究,最好按照ST提供的廠家和配套電容選取:http://www.armbbs.cn/forum.php?mod=viewthread&tid=87673?。
14.5.2 時鐘配置
STM32F4開發板使用的外部晶振頻率是8MHz,下面分步說明如何讓其通過這個頻率工作到168MHz的主頻。
第1步:在stm32f4xx_hal_conf.h文件配置HSE_VALUE
配置的大小要跟板子的實際晶振大小匹配。
#if !defined (HSE_VALUE) #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */ #endif /* HSE_VALUE */
第2步:系統上電后,在啟動文件startup_stm32f429xx.s的復位中斷服務程序里面會調用函數SystemInit。
Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT SystemInit IMPORT __main LDR R0, =SystemInit BLX R0 LDR R0, =__main BX R0 ENDP
以往STM32F1和STM32F4系列都會在函數SystemInit里面配置PLL鎖相環,使用了HAL后,需要在main函數里面配置。當前SystemInit函數實現的功能如下:
1. /** 2. * @brief Setup the microcontroller system 3. * Initialize the FPU setting, vector table location and External memory 4. * configuration. 5. * @param None 6. * @retval None 7. */ 8. void SystemInit(void) 9. { 10. /* FPU settings ------------------------------------------------------------*/ 11. #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) 12. SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ 13. #endif 14. /* Reset the RCC clock configuration to the default reset state ------------*/ 15. /* Set HSION bit */ 16. RCC->CR |= (uint32_t)0x00000001; 17. 18. /* Reset CFGR register */ 19. RCC->CFGR = 0x00000000; 20. 21. /* Reset HSEON, CSSON and PLLON bits */ 22. RCC->CR &= (uint32_t)0xFEF6FFFF; 23. 24. /* Reset PLLCFGR register */ 25. RCC->PLLCFGR = 0x24003010; 26. 27. /* Reset HSEBYP bit */ 28. RCC->CR &= (uint32_t)0xFFFBFFFF; 29. 30. /* Disable all interrupts */ 31. RCC->CIR = 0x00000000; 32. 33. #if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) 34. SystemInit_ExtMemCtl(); 35. #endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */ 36. 37. /* Configure the Vector Table location add offset address ------------------*/ 38. #ifdef VECT_TAB_SRAM 39. SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ 40. #else 41. SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ 42. #endif 43. }
第12行:使能FPU單元。
第16 – 31行:復位RCC相關寄存器。
第69 – 73行:設置中斷向量表的位置。
第3步:在main函數的外設驅動初始化函數里面完成時鐘初始化,主要是PLL鎖相環,讓芯片最終工作到168MHz。
評論
查看更多