configSYS ティック_CLOCK_HZ
ARM Cortex-M ポートのみのオプションのパラメータ。
ARM Cortex-M ポートは、デフォルトで Cortex-M Sys ティック タイマーから RTOS ティック割り込みを生成します。ほとんどの Cortex-M MCU は、MCU 自体と同じ周波数で SysTick タイマーを実行します。その場合、configSYSTICK_CLOCK_HZ は必要なく、未定義のままにする必要があります。SysTick タイマーの周波数が MCU コアと異なる場合は、configCPU_CLOCK_HZ を通常の MCU クロック周波数に設定し、configSYSTICK_CLOCK_HZ を SysTick クロック周波数に設定する必要があります。
このパラメータは、 STM32f103 ソース コードのFreeRTOSConfig.hで設定されます。
このパラメータは SysTick クロック周波数を表します。これは、時間厳守アトムの STM32F103 と STM32F407 のソース コードで異なる設定があります。
システムクロック設定プロセスを見てみましょう
STM32F407 には、異なるクロック信号を生成する 2 つの PLL があります。ここでは主にメイン PLL クロックについて説明します。メイン PLL クロックのクロックソースには、前述の HIS 信号と HSE 信号の 2 つの信号があります。PLL は、これら 2 つの信号の周波数を逓倍および分周することで、より高い周波数のクロック信号を実現します。一般に、HIS および HSE のクロック周波数が低いため、SYSCLK はシステム クロックとして HIS クロックおよび HSE クロックを選択せず、メイン PLL によって生成されたクロックがシステム クロックとして使用されるのが一般的です。メインPLLの内部構成ブロック図を見てみましょう。
この図から、PLL には 2 つの主なクロック ソース (HSE クロック信号と HIS クロック信号) があることがわかります。このうち、PLL_M、PLL_N、PLL_P、PLL_Qは分周器であり、PLL_Mは周波数逓倍器である。図の PLL_N 以降のクロック信号が PLL_VCO であり、PLL が外部クロック信号 HSE をクロック ソースとして使用すると仮定します。すると以下のような関係が成り立ちます。
PLL_VCO = (HSE / PLL_M)* PLL_N
SYSCLK = PLL_VCO/PLL_P
したがって、外部水晶発振器の周波数が決まっている場合は、対応する周波数のシステム クロック SYSCLK を取得するために PLL_M、PLL_N、および PLL_P の係数を決定します。ここで、PLL_M、PLL_N、および PLL_P は複数の組み合わせを持つことができます。対応する条件が満たされている場合。たとえば、STM32F407 の外部水晶発振器が 8M であると仮定すると、システム クロックの最大周波数は 168M であるため、長期間にわたって PLL_M = 8、PLL_N = 336、および PLL_P = 2 を設定できます。168Mクロックを生成します。つまり、SYSCLK = ( 8 /8 ) * 336 / 2 = 168M です。
メイン PLL を設定すると、システムのメイン クロック SYSCLK が得られ、次のステップでは、このクロックを使用して周波数を分周し、各ペリフェラルのクロックを取得できます。
時計の基本概念
1.リアルタイム クロックは、日付と時刻のカウンターによって蓄積されたクロックを指します。通常は 32768Hz、
2. システム クロックは、マイクロコントローラー内のメイン クロックを指し、各モジュールの動作クロックの基礎を提供します。
3. CPU クロックとは、システムクロックを CPU の PLL を通過した後の CPU のクロックに変更することを指します。
HSI は、周波数 8MHz の高速内部クロック、RC 発振器です。
時間厳守アトム STM32F407-freertos のソース コード内。FreeRTOSConfig.h
ここで SystemCoreClock を右クリックして CPU 周波数を確認します。ここでは 16Mhz です。
ただし、デモビデオのメイン機能には、システムクロック周波数を変更する機能があります
punctual atom STM32F103-freertos.FreeRTOSConfig.h のソースコードでは、 main 関数では設定されていない CPU クロック周波数が確認できるため、103CPU のクロック周波数はこれです
SysTick のクロック ソース
まずはSTM32のクロックツリーを見てみましょう
RCC は、8 で分周した AHB クロック (HCLK) を Cortex System Timer (SysTick) 外部クロックに供給します。
SysTick は、このクロックまたは SysTick コントロールおよびステータス レジスタで設定可能な Cortex クロック (HCLK) のいずれかで動作できます。
上記の段落は、SysTick のクロック ソースを HCLK または HCLK の 8 で分周できることを意味します。
特定のものは、「コントロールおよびステータス レジスタ (CTRL)」を設定することで選択できます。
遅延中。c
右クリックして定義にジャンプします。パラメータ SysTick_CLKSource_HCLK が渡されます。
HCLK: AHB バス クロック。システム クロック SYSCLK を分周して得られます。通常は分周はなく、システム クロックと同じです。
SysTick->CTRL |= SysTick_CLKSource_HCLK;
BIT2 ビットが 1 に設定されていることを示し、コア クロックがSysTick のクロック ソースとして分周されていないことを示します。
SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;
BIT2 の位置が 0 に設定されていることを示し、外部クロック ソースが SysTick クロック ソースとして 8 分周されていることを示します。
SysTick_CLKSource_HCLK システム コア クロック (値は HCLK に置き換わります)
このとき、CPU クロック周波数はシステムクロック周波数と同じです。
punctual atom STM32F103 と 407 では、最初に freertos を移植していないソースコードでは、delay.c がすべてです
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部时钟 HCLK/8
fac_us=SystemCoreClock/8000000; //为系统时钟的1/8
このとき、システムクロック周波数はCPUクロック周波数の1/8となります。
freertos移植後のstm32f103の設定ではSysTickのクロックソースとして分周なしのコアクロックを使用するようになり、この際SystemCoreClockの周波数を取得するためにSystemCoreClock/8を使用する必要がなくなりました。つまり、 fac_us=SystemCoreClock/8/1000000; から fac_us=SystemCoreClock/1000000; になります。
//初始化延迟函数
//SYSTICK的时钟固定为AHB时钟,基础例程里面SYSTICK时钟频率为AHB/8
//这里为了兼容FreeRTOS,所以将SYSTICK的时钟频率改为AHB的频率!
//SYSCLK:系统时钟频率
void delay_init()
{
u32 reload;
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);//选择外部时钟 HCLK
fac_us=SystemCoreClock/1000000; //不论是否使用OS,fac_us都需要使用
reload=SystemCoreClock/1000000; //每秒钟的计数次数 单位为M
reload*=1000000/configTICK_RATE_HZ; //根据configTICK_RATE_HZ设定溢出时间
//reload为24位寄存器,最大值:16777216,在72M下,约合0.233s左右
fac_ms=1000/configTICK_RATE_HZ; //代表OS可以延时的最少单位
SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk; //开启SYSTICK中断
SysTick->LOAD=reload; //每1/configTICK_RATE_HZ秒中断一次
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开启SYSTICK
}
これで、いつコメントするかを理解できるようになりました
重要な点は、Delay.c ファイル関数のシステム ティック タイマーの周波数がコア クロック周波数と同じかどうかを観察することですが、 Atom は便宜上周波数分割を選択しません。そのため、現時点ではその文をコメントするか削除してください。 。