STM32:クロックセキュリティシステム

画像

良い一日!

この記事では、STM32マイクロコントローラーの自己診断システム、特にSTM32-Discoveryデバッグキットに含まれるSTM32F100RBに焦点を当てます。 しかし、STM32マイクロコントローラは多くの点で非常に類似しており、主に周辺機器が異なるため、他のコントローラについても同様です(おそらくわずかな変更が必要です)。 この記事は、すでにSTM32に少し精通している人を対象としていますが、できる限りお話しするようにします。



クロックセキュリティシステム(CSS)



それでは始めましょう。

そして、システム周波数のソースを検討することから始め、データシートに進みます。



システムの周波数が高性能AHBバスから周辺に到達する場所と場所を把握しましょう。 バス自体に、システム周波数を1..512で除算できる分周器があります。 そして実際には、システムの周波数自体はマルチプレクサーによって決定され、ダイアグラム上でSWとして示されます。 3つのソースからの周波数がマルチプレクサに供給されます: HSIPLLHSE 、それらのそれぞれを簡単に調べます:



HSI(高速内部発振器)
内部8MHz RC回路。システム周波数のソースとして、または2で割った値をPLL(PLL)の入力信号として使用できます。 これは、外部水晶なしで実行できるため、システム周波数の精度と安定性に特別な要件がない低コストのデバイスで使用できます。 発生頻度は、温度、電圧、台湾の天気、一般的に太陽の磁気嵐に依存します-浮動は非常に大きくなりますが、製造業者は25°Cの温度で1%の精度でそれらを校正します-温度が変化すると-周波数は浮動します。測定精度または遅延時間は異なります。 CSSのバックアップシステム周波数ソースとしても使用できます。



HSE(高速外部発振器)
外部クロックジェネレーターは、共振器または外部クロック信号のいずれかです。 クォーツの場合、高温安定性、周波数精度、耐久性が特徴です。 したがって、クロックパルス-マルチプレクサに直接送られるか、分周器1..16を介して入力PLLに送られます



PLL(高速外部発振器)
または、 PLLを使用すると、入力信号を2..16倍にすることができますが、エラーも増加します。したがって、入力信号が泳ぐ+ -1MHz-16倍すると、泳ぐ+ -16MHzになり、さらに、出力周波数は最大許容周波数を超えてはなりませんああ



それで-周波数源を見つけました-記事のトピックに移りましょう。 多くの場合、信頼性の高いシステムでは、システムの周波数源として水晶振動子が使用されますが、何らかの理由で故障する場合があります。 このような障害の悪影響を最小限に抑えるために、STM32にはCSSもあります。 その本質は次のとおりです: HSEが起動すると、周波数検出器がオンになり、故障すると( HSEがシステム周波数のソースでない場合でも)すぐにHSEをオフにし、 HSIをオンにし、システム周波数のソースとして設定し、システム周波数のエラー信号を拡張タイマーに送信し、割り込みを生成しますHSE失敗プログラムの通知



CoIDEのコード例:


コード
#include "stm32f10x_rcc.h" #include "stm32f10x_gpio.h" #include "stm32f10x.h" #define LED_PORT GPIOC void LED_GPIO_Configuration(void); void Delay(__IO uint32_t nCount); void NMI_Handler(); int delay_time = 300; int main() { static unsigned long ticks; unsigned char Clock1s; //==================System Clock Init================== //  RCC_DeInit(); // HSE RCC_HSEConfig(RCC_HSE_ON); //    while(RCC_WaitForHSEStartUp() != SUCCESS); // Clock Security System RCC->CR |= RCC_CR_CSSON; //    HSE RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE); // HSI    RCC_HSICmd(DISABLE); //======================GPIO Init====================== LED_GPIO_Configuration(); //    while(1) { if (ticks++ >= 9999) { ticks = 0; Clock1s = 1; } if (Clock1s) { Clock1s = 0; Delay(delay_time); GPIO_WriteBit(LED_PORT, GPIO_Pin_9, Bit_SET); Delay(delay_time); GPIO_WriteBit(LED_PORT, GPIO_Pin_9, Bit_RESET); } } } //  GPIOC void LED_GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; //  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); } void NMI_Handler() { //   CSS RCC->CIR |= RCC_CIR_CSSC; //    ,    //   Delay(100); //  HSE RCC_HSEConfig(RCC_HSE_ON); //    Delay(1); if (RCC_WaitForHSEStartUp() == SUCCESS) { //  -  HSE    RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE); // HSI RCC_HSICmd(DISABLE); //     delay_time = 100; } else GPIO_SetBits(GPIOC,GPIO_Pin_8); //     -   HSI //   } //   void Delay(__IO uint32_t nCount) { uint32_t i = 0; for (; nCount != 0; i++) { if (i == 1000) { i = 0; nCount--; } } }
      
      







仕事のビデオ:






データシート 、CoIDEのコード例、および尊敬されるDI Haltaの記事を使用した記事を準備するとき、割り込みハンドラーは例としてのみ提供され、超信頼できるソリューションのふりをすることはありません-可能性を示すだけです



All Articles