私のプロジェクトでは、SysTickレートが通常は高すぎますが、必ずしも速すぎるとは限らないという問題が発生し始めました。私は関連するコードを変更していないし、温度に関連しているようだ。STM32F0システム・クロックPLLのコンフィギュレーションおよび/または温度によるエラー?
私は私の初期化コードは、以下の機能が含まVisual StudioのコミュニティにVisualGDBで、2015年をSTM32F072B-DISCOVERYボードを使用しています
:クロック・ソース場合は、」RCC_SYSCLKConfig()
状態のため
void Setup_Init_Clocks()
{
// Set up 48 MHz Core Clock using HSI (8Mhz) with PLL x 6
RCC_PLLConfig(RCC_PLLSource_HSI, RCC_PLLMul_6);
RCC_PLLCmd(ENABLE);
// Wait for PLLRDY after enabling PLL.
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) != SET)
{ }
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); // Select the PLL as clock source.
SystemCoreClockUpdate();
}
ノートをまだ準備ができていないクロックソースが選択されると、スイッチはクロックソースが準備完了状態になると発生します。 PLLRDY RCCフラグをチェックすると、この状態が識別され、クロックがすぐに変化し、クロックがすぐに設定されるようにする必要があります。
SystemCoreClockUpdate()
は(ファイルsystem_stm32f0xx.cに)標準STM32ライブラリーからであり、それ以降のSysTickを設定するために使用される値は再計算する:、tmp = RCC->CFGR & RCC_CFGR_SWS;
:デバッガで
void SystemCoreClockUpdate (void)
{
uint32_t tmp = 0, pllmull = 0, pllsource = 0, prediv1factor = 0;
/* Get SYSCLK source -------------------------------------------------------*/
tmp = RCC->CFGR & RCC_CFGR_SWS;
switch (tmp)
{
case 0x00: /* HSI used as system clock */
SystemCoreClock = HSI_VALUE;
break;
case 0x04: /* HSE used as system clock */
SystemCoreClock = HSE_VALUE;
break;
case 0x08: /* PLL used as system clock */
/* Get PLL clock source and multiplication factor ----------------------*/
pllmull = RCC->CFGR & RCC_CFGR_PLLMULL;
pllsource = RCC->CFGR & RCC_CFGR_PLLSRC;
pllmull = (pllmull >> 18) + 2;
if (pllsource == 0x00)
{
/* HSI oscillator clock divided by 2 selected as PLL clock entry */
SystemCoreClock = (HSI_VALUE >> 1) * pllmull;
}
else
{
prediv1factor = (RCC->CFGR2 & RCC_CFGR2_PREDIV1) + 1;
/* HSE oscillator clock selected as PREDIV1 clock entry */
SystemCoreClock = (HSE_VALUE/prediv1factor) * pllmull;
}
break;
default: /* HSI used as system clock */
SystemCoreClock = HSI_VALUE;
break;
}
/* Compute HCLK clock frequency ----------------*/
/* Get HCLK prescaler */
tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)];
/* HCLK clock frequency */
SystemCoreClock >>= tmp;
}
を、私はこれが失敗している場所を確認することができ間違ったケースが選択されます。
これは逆アセンブラに相対的な単純明快になります。
237: tmp = RCC->CFGR & RCC_CFGR_SWS;
0x08003262 2A 4B ldr r3, [pc, #168] ; (0x800330c SystemCoreClockUpdate+192>)
0x08003264 5B 68 ldr r3, [r3, #4]
0x08003266 0C 22 movs r2, #12
0x08003268 13 40 ands r3, r2
0x0800326a FB 60 str r3, [r7, #12]
RCC CFGRレジスタは0x0010800aの値を持ちます。 RCC_CFGR_SWS
マスクは0x0000000cです。私はこの文で以前にブレークポイントを設定し、それによってステップが正常に機能している場合SystemCoreClock
)は48000000.
1に設定されていると、このの結果はtmp
はtmp
で、PLLのケースを選択し、0x08にを割り当てる必要があります0x08が割り当てられ、クロックが正しく設定されています。私は直後にswitch
の文にブレークポイントを設定した場合
2)、それは通常*失敗します。 tmp
に0x0010800aが割り当てられ、あたかもands r3, r2
命令がスキップされたようです!これにより、チップが48MHzで動作しているにもかかわらず、default
ケースが実行され、SystemCoreClockが8000000に設定されます。その結果、高速のSysTickが得られます。
3)tmp
が選択されたままで、コールをコメントアウトした場合、チップは0x00に割り当てられ、すべてが期待どおりに動作し、チップは8MHzで動作し、48MHzでは動作しません。
4)私は数分間抜いそれを残す場合は、それは最初の電源投入時にOKに動作しますが、()デバッグを含む温かいリセット、または短時間(〜15秒)
ため抜か場合に失敗します5)私は、PLL初期化が温度の影響を受けていると考えました。私は1ヶ月以上でプロジェクトに取り組んでいないし、私の仕事場は今や季節的に暖かいです。私はチップ上に小さな水道水を入れてチップを少し冷やした。これは、プログラムが毎回正しく実行されたことで成功しました!カップを取り出して指でチップを温めた後、再び失敗しました。
システムクロックの設定に、このような変更は、何らかの形で、計算の整合性に影響を与えることはできますか?クロックが正しく設定されていることを確認するために何か別のものがありますか?
harsware ploblemのように見えます。この初期化コード - パワーオンリセット(POR)を設定して、作業コードを開始する前に約1秒以内に一時停止(単純なループ)することができます。これはHSIが安定していることを確認するためです。 – imbearr
起動する前にフラッシュを遅くしましたか?はい、私はあなたが後になるまで、より速いクロックではないことを理解しているかもしれませんが、おそらくそれは倍増する前に1倍の外部クロックに切り替えることです。フラッシュをオーバークロックすると奇妙な動作になりますが、シングルステッピングはまだ奇妙なことが起こります。 –
@dwelchありがとうございました - リファレンスマニュアルのFLASHセクションを詳しく読んでいないので、これが必要であることはわかりませんでした。クロックセクションには記載されていません。 STM32F072では、24 MHz≦SYSCLK≦48 MHzの場合、レイテンシを1に設定する必要があります。 「FLASH_SetLatency(FLASH_Latency_1);」を追加するクロックを設定する前に問題を解決します。これを答えとして加えて、私はそれを受け入れます。 – mbmcavoy