目次
注:このブログ投稿は、時間厳守のアトミックコースを繰り返したものであり、時間厳守のチュートリアルを要約し、独創性の名の下に盗用ではなく、いくつかの洞察を書いています。
51と比較すると、STM32F4のクロックツリーは複雑です。このブログ投稿は、各クロック間の関係を記録し、STM32F4のクロックツリーを明確にすることを目的としています。
1.時計の紹介
1.時計とは何ですか?
**クロックはシングルチップマイクロコンピュータの動作の基礎です。クロック信号はシングルチップマイクロコンピュータの各部分を押して、対応する命令を実行します。**クロックシステムはCPUのパルスであり、CPUレートを決定します。人間の心拍と同様に、人は心拍でのみ他のことを実行でき、シングルチップマイクロコンピューターは他の処理を実行する前に命令を実行および実行できます。 (点灯)、シリアルポート、ADC)、クロックの重要性は自明です。
参照:CSDNブロガー[Z Xiaoxuan]のブログ[STM32]詳細なシステムクロックRCC(超詳細、超包括的)
2. STM32に複数のクロックソースがあるのはなぜですか?
STM32自体は非常に複雑で、多くの周辺機器がありますが、実際に使用する場合は限られた数の周辺機器しか使用しません。どの周辺機器も起動にクロックが必要ですが、すべての周辺機器がシステムクロックを必要とするわけではありません。異なる速度のデバイスと互換性があり、高速のものと低速のものがあります。高速クロックを使用すると、必然的に無駄が発生します。また、同じ回路、クロックが速いほど、消費電力も速くなります。 、および反電磁干渉能力が弱くなります。複雑なMCUは、これらの問題を解決するために複数のクロックソースを使用します。つまり、STM32のクロックシステムとクロックツリーがあります。
2.クロックツリー図の簡単な紹介
まず、クロックツリーの概略図は次のとおりです。
巨大なクロックツリーのように見え、ブロック(クロック+フェーズロックループ+ペリフェラル)に分割すると、状況は単純になります。
上の図では、クロック①②③④ +フェーズロックループこれらはすべてクロックを生成できる部分であり、ETH_MI_TX_CLK_MIIなど、左下隅にフレームされていないクロックを生成できるデバイスが多数ありますが、これらは重要ではなく、考慮されません。当面。
クロック+フェーズロックループを除いて、他は基本的に周辺機器、つまりクロックを受信して使用する外部デバイスです。クロックが供給されていない場合、シングルチップマイクロコンピュータのすべてのデバイスが機能しません。
クロック、フェーズロックループ、および周辺機器に加えて、さらに2つの重要なデバイスがあります。
①分周器:
** / 2から31 **のこのボックスのような形をした分周器です。つまり、周波数fのクロック信号をf / 2からf / 31Aの間隔に変換できます。内の任意の周波数のクロック信号。
②セレクター:
上図の台形のような形をした選択肢で、右から4つの選択入力a、左から出力します。
3.クロック①②③④+フェーズロックループの導入
1.時計の紹介①②③④
クロック①: LSI、低速(速度)内部(インター)クロック、RC発振器によって生成、周波数は約32kHZ、周波数は不安定、独立したウォッチドッグと自動ウェイクアップユニットによって使用されます。
クロック②: LSE、低速(Speed)外部(Extern)クロック、32.768kHZ水晶振動子によって生成され、周波数は比較的安定しており、主にRTC(Real_Time_Clock)クロックソースです。
クロック③: HSE、高速外部クロック、水晶発振器または外部クロックソースで生成可能、周波数範囲は4MHz〜26MHz、システムクロック(図のSYSCLK)またはPLL(フェーズロックループ)入力として直接使用可能。
クロック④: HSI、RC発振器によって生成される、周波数16MHZの高速内部クロックで、システムクロックまたはPLL(フェーズロックループ)入力として直接使用できます。
2.フェーズロックループ(PLL)の概要
2.1で述べたように、HSEとHSIの両方をフェーズロックループの入力として使用できますが、このクロック入力を受信した後、フェーズロックループは何をしますか?
一般的に、フェーズロックループは、クロック入力を受け入れ、周波数分割、周波数逓倍などの操作を介して、新しい周波数のクロック信号を生成し、それを出力することです。
フェーズロックループを分析してみましょう。
上の図に示すように、右端のセレクターがクロック信号fを選択し、次にfが左の分周器を通過して、位相の入力であるf / Mを取得します。 -ロックされたループ、ここではC = f / Mと表記されます。
PLL電圧制御発振器(VCO)または周波数逓倍器(xN)のCの後に、新しい周波数を持つクロック信号を取得します。例として、ここでは周波数逓倍器を使用してC X Nを取得し、次に右側の任意の1つを使用します。3つの分周器(/ P、/ Q、/ R)(実際、このフェーズロックループは出力を/ Rに設定しないため、有効な分周器は/ Pと/ Qのみです)を通過します。ここ/ Pは、たとえば、出力①CX N / Pを取得します。
要約すると、周波数fのクロック信号が分周器とフェーズロックループを通過した後に得られる出力クロック信号の周波数計算式は次のとおりです。
outF = (f / M) x N / P
3. STM32F4に2つのフェーズロックループがあるのはなぜですか?
上部のフェーズロックループ①はメインPLLと呼ばれ、出力クロック信号はさまざまな周辺機器に使用できます。
下部のフェーズロックループ②は専用PLLと呼ばれ、I2Sに安定した正確なクロック信号を提供するように設計されています(I2Sはクロック信号に対してより高い要件があります)。
第四に、プログラムで時計を設定する方法
1.RCCレジスタ
RCC(リセットおよびクロック制御)レジスタ、中国名リセットおよびクロック制御レジスタ、名前が意味するように、それはエネルギーのクロック源を制御するだけでなく、ペリフェラルリセット中にペリフェラルクロックイネーブルを制御します。
プログラムでクロックを構成することは、実際にはRCCレジスタを構成することです。
2.RCCレジスタの設定方法
STM32F4標準ファームウェアライブラリでは、RCC関連関数がクロックソースの選択やクロックイネーブルなどを制御し、これらの関数はRCC関連ファームウェアライブラリファイルstm32f4xx_rcc.hおよびstm32f4xx_rcc.cで宣言および定義されています。
これらの機能は大きく3つのカテゴリに分類できます(以下に4つ目のカテゴリがありますが、一般的には使用されません)
。①1つはペリフェラルクロックイネーブル機能、
②もう1つはクロックソースと周波数分割係数の設定機能、つまり設定セレクタです。および分周器;
③別のタイプの周辺リセット機能があります;
④最後に、クロックソース構成を取得するためのいくつかの機能があります。
説明:
-
周辺機器を使用する場合は、上記①に対応する周辺機器クロックを有効にする必要があります。
-
周辺クロックが有効になっている場合は、クロックソースを有効にするクロック信号を与える必要があります。また、上記の②に対応するセレクタと分周器を有効にする必要がある場合があります。
-
周辺機器に問題がある場合は、上記③に対応するリセットを行ってください。
-
特定のクロックソースの現在の周波数を知りたい場合は、その現在の構成を知る必要があります。これは、上記の④に対応します。
2.1ペリフェラルクロックを有効にする方法は?
STM32F4には合計5つのバス(AHB1、AHB2、AHB3、APB1、APB2)があり、各バスには特定の数の周辺機器が装備されています。
周辺機器クロックを有効にするには、まず周辺機器が接続されているバスを知る必要があります。たとえば、GPIOAのすべてのピンがAHB1の下にぶら下がっています。次に、GPIOAに接続されている周辺機器クロックを有効にする必要があります。次の関数を呼び出します。
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//使能 GPIOA 时钟
STM32F4のRCCファームウェアライブラリは、以下に示すように、5つのバスに対応する合計5つのペリフェラルクロックイネーブル機能を提供します。
void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState);
void RCC_AHB2PeriphClockCmd(uint32_t RCC_AHB2Periph, FunctionalState NewState);
void RCC_AHB3PeriphClockCmd(uint32_t RCC_AHB3Periph, FunctionalState NewState);
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
周辺機器がどのバスの下にあるかを見つけたら、対応する関数を呼び出します。
2.3クロックソースを有効にする方法は?
6つのクロックソースイネーブル機能があります。
void RCC_HSICmd(FunctionalState NewState);
void RCC_LSICmd(FunctionalState NewState);
void RCC_PLLCmd(FunctionalState NewState);
void RCC_PLLI2SCmd(FunctionalState NewState);
void RCC_PLLSAICmd(FunctionalState NewState);
void RCC_RTCCLKCmd(FunctionalState NewState);
たとえば、PLLを有効にする場合は、次のように呼び出す必要があります。
RCC_PLLCmd(ENABLE);