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