3.STM32F429时钟系统配置方法
目錄
- 1.時鐘系統
- 1.1.時鐘源
- 1.2.系統時鐘SYSCLK計算
- 1.3.AHB和APB總線時鐘
- 1.4.其它時鐘
- 2.時鐘配置函數
- 2.1.SystemInit函數
- 2.2.Stm32_Clock_Init函數
- 2.3.一些匯編指令
在前幾篇文章中我想把一些基礎的部分簡單總結一下:首先是前兩篇文章,學習一個mcu就要先對它的外設有初步的理解,還有要使用的HAL庫,它相當于我們的代碼與硬件之間連接的橋梁;這篇博客會總結一下429時鐘樹的一些知識,還有時鐘配置函數;再之后可能還會總結基于SysTick的延時函數、程序執行流程、中斷、DMA等。
1.時鐘系統
1.1.時鐘源
F429有5個時鐘源:HSI,HSE,LSI,LSE,PLL(PLL,PLLI2S,PLLSAI)。HSI,HSE,PLL是高速時鐘,LSI,LSE是低速時鐘。HSE,LSE是外部時鐘源。
a) 主PLL由HSE或者HSI提供時鐘信號,有兩個不同的輸出時鐘。第一個PLLCLK用于生成高速的系統時鐘(最高180MHz)。第二個PLLQ為48M,用于USB OTG FS,隨機數發生器和SDIO時鐘。
b) PLLI2S在I2S和SAI1上實現高品質音頻
c) PLLSAI用于SAI輸入時鐘,LCD_TFT接口時鐘。
1.2.系統時鐘SYSCLK計算
主PLL時鐘來若自HSE,也就是25MHz的外部晶振,先經過分頻系數為M的分頻器,再經過倍頻系數為N的倍頻器,還需要經過分頻系數為 P(第一個輸出 PLLP)或者 Q(第二個輸出 PLLQ)的分頻器分頻之后,最后生成最終的主PLL時鐘。我們設置M=25,N=360,P=2,則生成的高速時鐘 PLLP(也就是PLLCLK)為180MHz。下圖為在CubeMX中配置主時鐘,HSE可以由有源或無源晶振或提供。當使用有源晶振時,時鐘從OSC_IN進入,OSC_OUT 懸空;選用無源晶振時,時鐘從OSC_IN 和 OSC_OUT進入,并且要配諧振電容。
但是 USB OTG FS的情況比較特殊,必須使用 48M,Q=VCO輸出時鐘360/48=7.5,出現了小數這明顯是錯誤。野火教程中將N設為336,PLLCLK=VCOCLK/2=168M,USBCLK=336/7=48M,也就是PLLCLK降頻了。正點原子教程中選擇超頻的方法,設N=432,USBCLK=432/9=48M,此時PLLCLK=216MHz。
1.3.AHB和APB總線時鐘
AHB總線時鐘HCLk由SYSCLK經AHB預分頻器分頻后得到,分頻系數由RCC_CFGR的HPRE 位設置,設為1分頻,即HCLK=SYSCLK=180M。AHB上的外設有FSMC,RNG,DCMI,USB OTG FS,USB OTG HS,以太網MAC,DMA,SRAM,Flash,RCC,CRC,GPIO。
APB1總線時鐘PCLK1由HCLK經低速APB預分頻器得到,分頻系數由RCC_CFGR 的PPRE1位設置,配置PCLK1=HCLK/4=45M。總線上的外設有UART2/3/4/5/7/8,DAC,PWR,CAN1/2,I2C1/2/3,I2S2/3,SPI2/3,RTC,TIM2/3/4/5/6/7/12/13/14。
APB2總線時鐘PCLK2由HCLK經高速APB2預分頻器得到,由RCC_CFGR的PPRE2位設置。PCLK2=HCLK/2=90M。總線上的外設有SPI1/4/5/6,TIM1/8/9/10/11,EXTI,SYSCFG,ADC1/2/3,USART1/6。
1.4.其它時鐘
2.時鐘配置函數
2.1.SystemInit函數
該函數在system_stm32f4xx.c中實現,在啟動文件startup_stm32f429xx.s中被調用。SystemInit主要做了如下四個方面工作:
2.2.Stm32_Clock_Init函數
該函數除了配置SYSCLK值外,還配置了AHB,APB1和APB2的分頻系數,也就是確定了HCLK,PCLK1和PCLK2的時鐘值,是正點原子教程里的時鐘初始化函數,在HAL_Init()之后調用。
void Stm32_Clock_Init(u32 plln,u32 pllm,u32 pllp,u32 pllq) {HAL_StatusTypeDef ret = HAL_OK;RCC_OscInitTypeDef RCC_OscInitStructure; RCC_ClkInitTypeDef RCC_ClkInitStructure;__HAL_RCC_PWR_CLK_ENABLE(); //使能PWR時鐘//下面這個設置用來設置調壓器輸出電壓級別,以便在器件未以最大頻率工作//時使性能與功耗實現平衡,此功能只有STM32F42xx和STM32F43xx器件有,__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);//設置調壓器輸出電壓級別1RCC_OscInitStructure.OscillatorType=RCC_OSCILLATORTYPE_HSE; //時鐘源為HSERCC_OscInitStructure.HSEState=RCC_HSE_ON; //打開HSERCC_OscInitStructure.PLL.PLLState=RCC_PLL_ON;//打開PLLRCC_OscInitStructure.PLL.PLLSource=RCC_PLLSOURCE_HSE;//PLL時鐘源選擇HSERCC_OscInitStructure.PLL.PLLM=pllm; //主PLL和音頻PLL分頻系數(PLL之前的分頻),取值范圍:2~63.RCC_OscInitStructure.PLL.PLLN=plln; //主PLL倍頻系數(PLL倍頻),取值范圍:64~432. RCC_OscInitStructure.PLL.PLLP=pllp; //系統時鐘的主PLL分頻系數(PLL之后的分頻),取值范圍:2,4,6,8.(僅限這4個值!)RCC_OscInitStructure.PLL.PLLQ=pllq; //USB/SDIO/隨機數產生器等的主PLL分頻系數(PLL之后的分頻),取值范圍:2~15.ret=HAL_RCC_OscConfig(&RCC_OscInitStructure);//初始化if(ret!=HAL_OK) while(1);ret=HAL_PWREx_EnableOverDrive(); //開啟Over-Driver功能if(ret!=HAL_OK) while(1);//選中PLL作為系統時鐘源并且配置HCLK,PCLK1和PCLK2RCC_ClkInitStructure.ClockType=(RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2);RCC_ClkInitStructure.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK;//設置系統時鐘時鐘源為PLLRCC_ClkInitStructure.AHBCLKDivider=RCC_SYSCLK_DIV1;//AHB分頻系數為1RCC_ClkInitStructure.APB1CLKDivider=RCC_HCLK_DIV4; //APB1分頻系數為4RCC_ClkInitStructure.APB2CLKDivider=RCC_HCLK_DIV2; //APB2分頻系數為2ret=HAL_RCC_ClockConfig(&RCC_ClkInitStructure,FLASH_LATENCY_5);//同時設置FLASH延時周期為5WS,也就是6個CPU周期。if(ret!=HAL_OK) while(1); }該函數步驟如下:
2.3.一些匯編指令
//關閉所有中斷(但是不包括fault和NMI中斷) __asm void INTX_DISABLE(void) {CPSID IBX LR } //開啟所有中斷 __asm void INTX_ENABLE(void) {CPSIE IBX LR } //設置棧頂地址 //addr:棧頂地址 __asm void MSR_MSP(u32 addr) {MSR MSP, r0 //set Main Stack valueBX r14 }總結
以上是生活随笔為你收集整理的3.STM32F429时钟系统配置方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 详解RocketMQ中的Producer
- 下一篇: css未生效,Avada自定义CSS设置