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