14.1 初學(xué)者重要提示
電源管理部分涉及到的各種低功耗方式會在后面章節(jié)中為大家講解,當(dāng)前階段僅需了解低功耗屬于電源管理部分即可。
14.2 電源
電源是系統(tǒng)穩(wěn)定運行的根本,主要分為以下幾個知識點,電源供電、供電監(jiān)控、電源管理和低功耗。當(dāng)前階段主要了解電源供電和硬件上電時序。
14.2.1 電源供電
學(xué)習(xí)STM32F429的電源供電,往往被一堆電源標(biāo)識Vdd,Vdda,Vcap,Vss等搞迷糊,這些標(biāo)識整明白了,電源供電部分也就理解了,首先看下面的框圖:
這些常用標(biāo)識的解釋如下:
對于電源供電部分了解了這些知識點就夠用。
14.2.2 電源去耦電容的選擇
每個電源對 (VDD/VSS, VDDA/VSSA ...)必須使用下述的濾波陶瓷電容去耦。這些電容必須盡量靠近芯片引腳,以確保器件正常工作。不建議去掉濾波電容來降低PCB 尺寸或成本,這可能導(dǎo)致器件工作不正常。?
14.3 硬件復(fù)位
所有數(shù)字計算機(jī)系統(tǒng)都是由某種形式的震蕩時鐘電路驅(qū)動的。這種電路被稱為系統(tǒng)的“脈搏”,是系統(tǒng)正確運行的關(guān)鍵。如果振蕩器失靈,系統(tǒng)將完全無法運行,如果振蕩器運行不規(guī)律,系統(tǒng)執(zhí)行的所有與時間有關(guān)的計算都會有誤差。
所有微控制器的啟動流程都不通用。由于硬件的復(fù)雜性,必須運行一段由廠家定義的短小的“復(fù)位程序”來使硬件處于一種正確的狀態(tài),然后再開始執(zhí)行用戶程序。運行這個復(fù)位程序需要時間并且要求微控制器的振蕩器已經(jīng)運行。
當(dāng)系統(tǒng)由可靠的電源供電時,一旦通電,電源迅速地達(dá)到額定輸出電壓,一旦斷電,電源迅速地下降到0V,并且在接通的時候,電壓不會降低。這時能夠可靠地使用基于一個電容和一個電阻的低成本硬件復(fù)位。這種形式的復(fù)位電路稱為阻容復(fù)位。
如果電源不夠可靠,而涉及安全性,這種簡單的阻容解決方案就不合適了。
14.3.1 上電復(fù)位和手動復(fù)位
STM32F429開發(fā)板的硬件復(fù)位原理圖如下:
STM32這款CPU的復(fù)位引腳是低電平有效,即NRST為低電平時,CPU處于復(fù)位狀態(tài)。
R173和C114組成簡單的RC復(fù)位電路。當(dāng)系統(tǒng)上電瞬間,C114電容兩端電壓可以認(rèn)為是0,CPU處于復(fù)位狀態(tài)。3.3V電源通過R173給C114充電,當(dāng)C114的電壓升到CPU的高電平門檻電壓時,CPU退出復(fù)位狀態(tài)轉(zhuǎn)入運行狀態(tài)。
在設(shè)計電路時,需要選擇適當(dāng)?shù)腞值和C值,以保證NRST低電平持續(xù)時間滿足CPU復(fù)位最小脈寬的要求。
當(dāng)按下S4輕觸開關(guān)時,C114兩端被短路接地,可實現(xiàn)手動復(fù)位CPU。
注,根據(jù)需要,大家也可以使用STM32F429 NRST引腳的內(nèi)部上拉:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=93144
14.3.2 復(fù)位序列
前面第11章的13.3.1小節(jié)講解了復(fù)位系列的相關(guān)知識,再結(jié)合本章節(jié)的上電復(fù)位和下電復(fù)位,大家會對其有一個較全面的認(rèn)識,更多復(fù)位序列的知識直接看13.3.1小節(jié)即可。
14.4 軟件復(fù)位
除了上電和手動復(fù)位,程序設(shè)計設(shè)置中還經(jīng)常要用到軟件復(fù)位,即調(diào)用一條函數(shù)就可以實現(xiàn)復(fù)位功能。此函數(shù)已經(jīng)由CMSIS軟件包中的core_cm4.h文件提供,函數(shù)如下:
/** \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(); } }
軟件復(fù)位反映到實際硬件上,就是給硬件復(fù)位部分發(fā)一個復(fù)位信號:
14.5 RCC時鐘控制
STM3F429有如下六種時鐘可供使用:
HSI (High-speed internal oscillator) :
HSI是內(nèi)部的高速RC振蕩器,頻率16MHz,可被用于系統(tǒng)時鐘。優(yōu)勢是低成本,無需外部時鐘,快速啟動(僅需幾個微秒),缺點是精度差,即使經(jīng)過校準(zhǔn)。
HSE (High-speed external oscillator):
HSE是外部的高速振蕩器,通過外接時鐘源,有源或者無源晶振驅(qū)動,時鐘范圍4-26MHz。優(yōu)勢是精度高,缺點是增加成本。
LSE (Low-speed external oscillator)
LSE是外部的低速振蕩器,通過外接時鐘源,有源或者無源晶振驅(qū)動,一般接32.768KHz,主要用于RTC實時時鐘。
LSI (Low-speed internal oscillator)
LSI是內(nèi)部的低速RC振蕩器,頻率約是32KHz,主要用于獨立看門狗和自動喚醒,也可以用于RTC實時時鐘。
通過下面的時鐘樹再進(jìn)一步的認(rèn)識這幾個時鐘:
14.5.1 HSE和LSE硬件設(shè)計
HSE時鐘
當(dāng)前V6開發(fā)板是用的8MHz晶振為HSE提供時鐘,硬件設(shè)計如下:
晶振和負(fù)載電容需要盡可能近地靠近F4的晶振引腳,以減小輸出失真和啟動穩(wěn)定時間。負(fù)載電容值必須根據(jù)選定的晶振進(jìn)行調(diào)節(jié)。
對于C109和C111,我們推薦使用高質(zhì)量陶瓷電容,這種電容是設(shè)計用于需要高頻率的場合,并且可以滿足晶體或諧振器的需求。C109和C111通常具有相同的值。
這里再額外補(bǔ)充一個知識點,HSE旁路時鐘和外置晶振區(qū)別:當(dāng)前V6板子是采用的外置晶振模式,高速外部 (HSE) 時鐘可以使用一個4到26MHz 的晶振 / 陶瓷諧振振蕩器產(chǎn)生:
而bypass 旁路的意思就是不使用它,繞過它。具體到HSE旁路的話,用戶直接提供4-26MHz的時鐘源即可,可以使用有源晶振或者FPGA提供時鐘等方式:
LSE時鐘
當(dāng)前V6開發(fā)板是用的32768Hz晶振為LSE提供時鐘,硬件設(shè)計如下:
STM32的LSE晶振起振難(又稱RTC起振)是老毛病了,選取晶振和配套電容比較講究,最好按照ST提供的廠家和配套電容選?。篽ttp://www.armbbs.cn/forum.php?mod=viewthread&tid=87673?。
14.5.2 時鐘配置
STM32F4開發(fā)板使用的外部晶振頻率是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步:系統(tǒng)上電后,在啟動文件startup_stm32f429xx.s的復(fù)位中斷服務(wù)程序里面會調(diào)用函數(shù)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系列都會在函數(shù)SystemInit里面配置PLL鎖相環(huán),使用了HAL后,需要在main函數(shù)里面配置。當(dāng)前SystemInit函數(shù)實現(xiàn)的功能如下:
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行:復(fù)位RCC相關(guān)寄存器。
第69 – 73行:設(shè)置中斷向量表的位置。
第3步:在main函數(shù)的外設(shè)驅(qū)動初始化函數(shù)里面完成時鐘初始化,主要是PLL鎖相環(huán),讓芯片最終工作到168MHz。
評論
查看更多