日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32F10x之RCC

發布時間:2024/10/14 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32F10x之RCC 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1 綜述

1.1 時鐘源

在STM32中,一共有5個時鐘源,分別是HSI、HSE、LSI、LSE、PLL。

  • HSI:高速內部時鐘源,RC振蕩器,頻率為8MHz。
  • HSE:高速外部時鐘源,可接石英/陶瓷諧振器或外部時鐘,頻率范圍為4~16MHz。
  • LSI:低速內部時鐘源,RC振蕩器,頻率為40KHz。
  • LSE:低速外部時鐘源,接頻率為32.768KHz的石英晶體。
  • PLL:鎖相環倍頻輸出,嚴格來說它不是獨立時鐘源,需要外接時鐘源,輸入可接HSI/2,HSE或是HSE/2。PLL倍頻范圍為x2~x16,但最大輸出頻率不能超過72MHz。

其中,LSI供獨立看門狗IWDG使用,也可以被選為實時時鐘源,不過,實時時鐘源還可以選擇LSE或者是HSE的128分配。在STM32中,全速功能的USB模塊,其串行接口引擎需要一個48MHz的時鐘源,該時鐘源只能從PLL端獲取,可選擇分頻1分頻或1.5分頻,若使用USB模塊則必須先使能PLL并且時鐘配置為72MHz或48MHz。

此外,在STM32中,可以選擇一個時鐘信號從MCO(PA8)腳輸出,可以選擇時鐘源為PLL輸出的2分頻、HSI、HSE或系統時鐘。

系統時鐘SYSCLK,他提供STM32中絕大部分不見的工作時鐘,系統時鐘可以選擇PLL輸出、HSE和HSI、系統時鐘最大頻率為72MHz,通過AHB分配器分頻后送給各個模塊使用,AHB分配器可選1、2、4、8、·6、64、128、256、512分頻,AHB分配器輸出時鐘可以供5大模塊使用:

  • 送給AHB總線、內核、內存和DMA使用的HCLK時鐘。
  • 通過8分頻后送個Cortex的系統定時器時鐘STCLK。
  • 直接送給Cortex的空閑運行時鐘FCLK。
  • 送個低速外設總線APB1分配器,APB1分配器可以選擇1、2、4、8和16分頻,其輸出一路供APB1外設使用(PCLK1,最大頻率36MHz);另一路送個定時器(TIM2~TIM7)倍頻器使用,該定時器倍頻器根據APB1分頻值自動選擇x1或x2倍頻(APB1分頻值為1時,定時器倍頻器為1倍頻,APB1分頻值為其它值時,定時器倍頻器采用2倍頻)。
  • 送給高速外設總線APB2分頻器,APB2分配器可選擇1、2、4、8和16分頻,其輸出一路供APB2外設使用(PLCK2,最大頻率為72MHz);一路送給定時器(TIM1&TIM8)使用,該定時器倍頻器根據APB2分頻值自動選擇x1或x2倍頻(APB2分頻值為1時,定時器倍頻器為1倍頻,APB2分頻值為其它值時,定時器倍頻器采用2倍頻);此外,APB2分配器輸出還有一路供給ADC分配器使用,ADC分配器分頻后供ADC模塊使用,ADC分頻可選2、4、6和8分頻,不過ADC模塊最大輸入時鐘不錯過14MHz。

1.2 時鐘樹

2. 時鐘源

2.1 HSE時鐘

高速外部時鐘信號(HSE)可以有以下兩種時鐘源產生:

  • HSE外部晶體/陶瓷諧振器
  • HSE用戶外部時鐘

為了減少時鐘輸出的失真和縮短啟動穩定時間,晶體/陶瓷諧振器和負載電容器必須盡可能地靠近振蕩器引腳,負載電容值必須根據所選擇的振蕩器來調整。

外部時鐘源(HSE旁路)

在這個模式里,必須提供外部時鐘,它的頻率最高可達25MHz,用戶可通過設置在時鐘控制寄存器中的HSEBYP和HSEON位來選擇這一模式。外部時鐘信號(50%占空比的方波、正弦波或三角波)必須連到SOC_IN引腳,同時保證OSC_OUT引腳懸空,見圖2)。

外部晶體/陶瓷諧振器(HSE晶體)
4~16Mz外部振蕩器可為系統提供更為精確的主時鐘,相關的硬件配置可參考圖1,進一步信息可參考數據手冊的電氣特性部分。在時鐘控制寄存器RCC_CR中的HSERDY位用來指示高速外部振蕩器是否穩定,在啟動時,直到這一位被硬件置’1’,時鐘才被釋放出來。如果在時鐘中斷寄存器RCC_CIR中允許產生中斷,將會產生相應中斷,HSE晶體可以通過設置時鐘控制寄存器里RCC_CR中的HSEON位被啟動和關閉。

2.2 HSI時鐘

  HSI時鐘信號由內部8MHz的RC振蕩器產生,可直接作為系統時鐘或在2分頻后作為PLL輸入。HSI RC振蕩器能夠在不需要任何外部器件的條件下提供系統時鐘,它的啟動時間比HSE晶體振蕩器短,然而,即使在校準之后它的時鐘頻率精度仍較差。
校準:制造工藝決定了不同芯片的RC振蕩器頻率會不同,這就是為什么每個芯片的HSI時鐘頻率在出廠前已經被ST校準到1%(25°C)的原因。系統復位時,工廠校準值被裝載到時鐘控制寄存器的HSICAL[7:0]位,如果用戶的應用基于不同的電壓或環境溫度,這將會影響RC振蕩器的精度,這時用戶可以通過時鐘控制寄存器里的HSITRIM[4:0]位來調整HSI頻率,時鐘控制寄存器中的HSIRDY位用來指示HSI RC振蕩器是否穩定,在時鐘啟動過程中,直到這一位被硬件置’1’, HSI RC輸出時鐘才被釋放。 HSI RC可由時鐘控制寄存器中的HSION位來啟動和關閉。如果HSE晶體振蕩器失效, HSI時鐘會被作為備用時鐘源。

2.3 PLL時鐘

內部PLL可以用來倍頻HSI RC的輸出時鐘或HSE晶體輸出時鐘。PLL的設置(選擇HSI振蕩器除2或HSE振蕩器為PLL的輸入時鐘、配置倍頻因子)必須在其被激活前完成,一旦PLL被激活,這些參數就不能被修改。如果PLL中斷在時鐘中斷寄存器里被允許,當PLL準備就緒時,可產生中斷申請。如果需要在應用中使用USB接口, PLL必須被設置為輸出48或72MHZ時鐘,用于提供48MHz的USBCLK時鐘。

2.4 LSE時鐘

LSE晶體是一個32.768kHz的低速外部晶體或陶瓷諧振器,它為實時時鐘或者其他定時功能提供一個低功耗且精確的時鐘源。LSE晶體通過在備份域控制寄存器(RCC_BDCR)里的LSEON位啟動和關閉,在備份域控制寄存器(RCC_BDCR)里的LSERDY指示LSE晶體振蕩是否穩定,在啟動階段,直到這個位被硬件置’1’后, LSE時鐘信號才被釋放出來。如果在時鐘中斷寄存器里被允許,可產生中斷申請。

外部時鐘源(LSE旁路)
在這個模式里必須提供一個32.768kHz頻率的外部時鐘源。你可以通過設置在備份域控制寄存器(RCC_BDCR)里的LSEBYP和LSEON位來選擇這個模式。具有50%占空比的外部時鐘信號(方波、正弦波或三角波)必須連到OSC32_IN引腳,同時保證OSC32_OUT引腳懸空,見圖1。

2.5 LSI時鐘

LSI RC擔當一個低功耗時鐘源的角色,它可以在停機和待機模式下保持運行,為獨立看門狗和自動喚醒單元提供時鐘。 LSI時鐘頻率大約40kHz(在30kHz和60kHz之間)。LSI RC可以通過控制/狀態寄存器(RCC_CSR)里的LSION位來啟動或關閉,在控制/狀態寄存器(RCC_CSR)里的LSIRDY位指示低速內部振蕩器是否穩定,在啟動階段,直到這個位被硬件設置為’1’后,此時鐘才被釋放。如果在時鐘中斷寄存器(RCC_CIR)里被允許,將產生LSI中斷申請。

LSI校準
可以通過校準內部低速振蕩器LSI來補償其頻率偏移,從而獲得精度可接受的RTC時間基數,以及獨立看門狗(IWDG)的超時時間(當這些外設以LSI為時鐘源)。校準可以通過使用TIM5的輸入時鐘(TIM5_CLK)測量LSI時鐘頻率實現,測量以HSE的精度為保證,軟件可以通過調整RTC的20位預分頻器來獲得精確的RTC時鐘基數,以及通過計算得到精確的獨立看門狗(IWDG)的超時時間。

LSI校準步驟如下:
1.打開TIM5,設置通道4為輸入捕獲模式;
2.設置AFIO_MAPR的TIM5_CH4_IREMAP位為’1’,在內部把LSI連接到TIM5的通道4;
3.通過TIM5的捕獲/比較4事件或者中斷來測量LSI時鐘頻率;
4.根據測量結果和期望的RTC時間基數和獨立看門狗的超時時間,設置20位預分頻器。

2.6 系統時鐘

系統復位后, HSI振蕩器被選為系統時鐘,當時鐘源被直接或通過PLL間接作為系統時鐘時,它將不能被停止,只有當目標時鐘源準備就緒了(經過啟動穩定階段的延遲或PLL穩定),從一個時鐘源到另一個時鐘源的切換才會發生,在被選擇時鐘源沒有就緒時,系統時鐘的切換不會發生,直至目標時鐘源就緒,才發生切換。在時鐘控制寄存器(RCC_CR)里的狀態位指示哪個時鐘已經準備好了,哪個時鐘目前被用作系統時鐘。

2.7 RTC時鐘

通 過 設 置 備 份 域 控 制 寄 存 器 (RCC_BDCR) 里 的 RTCSEL[1:0] 位 , RTCCLK 時 鐘 源 可 以 由HSE/128、 LSE或LSI時鐘提供,除非備份域復位,此選擇不能被改變,LSE時鐘在備份域里,但HSE和LSI時鐘不是,因此:

  • 如果LSE被選為RTC時鐘:只要VBAT維持供電,盡管VDD供電被切斷, RTC仍繼續工作。
  • 如果LSI被選為自動喚醒單元(AWU)時鐘:如果VDD供電被切斷, AWU狀態不能被保證。
  • 如果HSE時鐘128分頻后作為RTC時鐘:如果VDD供電被切斷或內部電壓調壓器被關閉(1.8V域的供電被切斷),則RTC狀態不確定。必須設置電源控制寄存器(PWR_CR)的DPB位為’1’(取消后備區域的寫保護)。

2.8 看門狗時鐘

如果獨立看門狗已經由硬件選擇或軟件啟動, LSI振蕩器將被強制在打開狀態,并且不能被關閉,在LSI振蕩器穩定后,時鐘供應給IWDG。

2.9 時鐘輸出

STM32允許輸出時鐘信號到外部MCO引腳,不過相應的GPIO端口寄存器必須被配置為相應功能。以下8個時鐘信號可被選作MCO時鐘:

  • SYSCLK
  • HSI
  • HSE
  • 除2的PLL時鐘
  • PLL2時鐘
  • PLL3時鐘除以2
  • XT1外部3~25MHz振蕩器(用于以太網)
  • PLL3時鐘(用于以太網)在MCO上輸出的時鐘必須小于50MHz(這是I/O端口的最大速度)。

時鐘的選擇由時鐘配置寄存器(RCC_CFGR)中的MCO[3:0]位控制。

3 外設時鐘系統

以下介紹不同總線上掛載各種外設,不同的芯片系列可能缺少某些外設,用戶應根據自己的芯片型號確定。

1.AHB總線外設:DMA1、DMA2、SRAM、FLASH、CRC、FSMC、SDIO、OTG(互聯型設備)、ETH(互聯型設備)。
2.APB1(低速外設總線):TIM2~TIM7、TIM12~TIM14、WWDG、SPI2~SPI3、USART2~USART3、UART4~UART5、I2C1~I2C2、USB、CAN1~CAN2、BKP、DAC、CEC。
3.APB2(高速外設總線):AFIO、GPIOA~GPIOG、ADC1~ADC2、TIM1、TIM8、SPI1、USART1、ADC3、TIM15~TIM17、TIM9~TIM11。

4 RCC庫函數

4.1 時鐘頻率

typedef struct {uint32_t SYSCLK_Frequency; /*!< 系統時鐘頻率,單位:Hz */uint32_t HCLK_Frequency; /*!< AHB總線時鐘頻率,單位:Hz */uint32_t PCLK1_Frequency; /*!< APB1總線時鐘頻率,單位:Hz */uint32_t PCLK2_Frequency; /*!< APB2總線時鐘頻率,單位:Hz */uint32_t ADCCLK_Frequency; /*!< ADC模塊輸入時鐘頻率,單位:Hz */ }RCC_ClocksTypeDef;

4.2 RCC庫函數

RCC庫函數原型及實現請詳見stm32f10x_rcc模塊,以下僅介紹各接口的作用。

函數名 描述
RCC_DeInit 將外設RCC寄存器重設為缺省值
RCC_HSEConfig 設置外部高速晶振( HSE)
RCC_WaitForHSEStartUp 等待 HSE 起振
RCC_AdjustHSICalibrationValue 調整內部高速晶振( HSI)校準值
RCC_HSICmd 使能或者失能內部高速晶振( HSI)
RCC_PLLConfig 設置 PLL 時鐘源及倍頻系數
RCC_PLLCmd 使能或者失能
PLLRCC_SYSCLKConfig 設置系統時鐘( SYSCLK)
RCC_GetSYSCLKSource 返回用作系統時鐘的時鐘源
RCC_HCLKConfig 設置 AHB 時鐘( HCLK)
RCC_PCLK1Config 設置低速 AHB 時鐘( PCLK1)
RCC_PCLK2Config 設置高速 AHB 時鐘( PCLK2)
RCC_ITConfig 使能或者失能指定的 RCC 中斷
RCC_USBCLKConfig 設置 USB 時鐘( USBCLK)
RCC_ADCCLKConfig 設置 ADC 時鐘( ADCCLK)
RCC_LSEConfig 設置外部低速晶振( LSE)
RCC_LSICmd 使能或者失能內部低速晶振( LSI)
RCC_RTCCLKConfig 設置 RTC 時鐘( RTCCLK)
RCC_RTCCLKCmd 使能或者失能 RTC 時鐘
RCC_GetClocksFreq 返回不同片上時鐘的頻率
RCC_AHBPeriphClockCmd 使能或者失能 AHB 外設時鐘
RCC_APB2PeriphClockCmd 使能或者失能 APB2 外設時鐘
RCC_APB1PeriphClockCmd 使能或者失能 APB1 外設時鐘
RCC_APB2PeriphResetCmd 強制或者釋放高速 APB( APB2)外設復位
RCC_APB1PeriphResetCmd 強制或者釋放低速 APB( APB1)外設復位
RCC_BackupResetCmd 強制或者釋放后備域復位
RCC_ClockSecuritySystemCmd 使能或者失能時鐘安全系統
RCC_MCOConfig 選擇在 MCO 管腳上輸出的時鐘源
RCC_GetFlagStatus 檢查指定的 RCC 標志位設置與否
RCC_ClearFlag 清除 RCC 的復位標志位
RCC_GetITStatus 檢查指定的 RCC 中斷發生與否
RCC_ClearITPendingBit 清除 RCC 的中斷待處理位

5 時鐘系統初始化

假設采用外部提供晶振(HSE)頻率為8MHz,PLLCLK=SYSCLK=72MHz,PCLK2=72MHz,PCLK1=36MHz,則時鐘系統初始化代碼如下:

void RCC_config() { ErrorStatus HSEStartUpStatus; // 定義錯誤狀態變量/* 時鐘系統初始化 */RCC_DeInit();//將RCC寄存器重新設置為默認值RCC_HSEConfig(RCC_HSE_ON); //打開外部高速時鐘晶振HSEStartUpStatus = RCC_WaitForHSEStartUp();// 等待外部高速時鐘晶振工作if(HSEStartUpStatus == SUCCESS) { RCC_HCLKConfig(RCC_SYSCLK_Div1);//設置AHB不分頻,HCLK=SYSCLKRCC_PCLK2Config(RCC_HCLK_Div1);//設置APB2不分頻,P2CLK=HCLKRCC_PCLK1Config(RCC_HCLK_Div2); //設置APB1 為2分頻,P1CLK=HCLK/2FLASH_SetLatency(FLASH_Latency_2);//設置FLASH代碼延時FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//使能預取指緩存RCC_PLLConfig(RCC_PLLSource_HSE_Div1, //設置PLL時鐘源,RCC_PLLMul_9);//外部時鐘不分頻,為HSE的9倍頻8MHz * 9 = 72MHzRCC_PLLCmd(ENABLE);//使能PLLwhile(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);//等待PLL準備就緒{RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//設置PLL為系統時鐘源while(RCC_GetSYSCLKSource() != 0x08)//判斷PLL是否是系統時鐘{} }}/* 以下示例部分外設時鐘初始化 *//* 使能DMA1時鐘*/RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);/* 使能CAN1時鐘*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);/* 使能GPIOD時鐘*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); } 轉自 http://www.jianshu.com/p/52c12be9e18b

總結

以上是生活随笔為你收集整理的STM32F10x之RCC的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。