2017-02-16 14 views
1

私はSTM32F0xxマイクロで動作しています。ブロッキング遅延を使用してピンを単にトグルするコードを持っています。割り込みと一致しないSTM32ブロッキング遅延

uint32_t ticks = 0; 
// Disable interrupts 
__disable_irq(); 
for (int bit = 0; bit < 10; bit++) { 
    // Toggle pin high 
    WritePin(GPIO_PIN_SET); 
    ticks = 500; 
    while (ticks--) { 
    __NOP(); 
    } 
    // Toggle pin low 
    WritePin(GPIO_PIN_RESET); 
    ticks = 500; 
    while (ticks--) { 
    __NOP(); 
    } 
    // Repeat 
    WritePin(GPIO_PIN_SET); 
    ticks = 500; 
    while (ticks--) { 
    __NOP(); 
    } 
    WritePin(GPIO_PIN_RESET); 
    ticks = 500; 
    while (ticks--) { 
    __NOP(); 
    } 
} 
__enable_irq(); 

割り込みを無効にして、この時点で何も起こっていないことを確認します。これらの波形の範囲を設定すると、10クロック周期が表示されます。ただし、これらの波形の周期がすべて一致するわけではありません。すべての偶数波形(0,2,4,6,8)は同じ周期を持ち、すべての奇数波形(1,3,5,7,9)は同じ周期を持ちますが、偶数および奇数波形はかなりの量だけ異なります(%12)。偶数波形は最初の遅延トグルと相関し、奇数波形はforループの2番目の遅延に相関します。なぜ私はこれらの期間が異なるのか分からない。誰もがここに何か洞察力を持っていますか?

+0

私は逆アセンブリもチェックしており、アセンブリはすべてのwhileループ実装で同じに見えます。 – ryeager

答えて

3

ARMのCortex-M0コア上でおよそNOPこのドキュメントを参照してください:

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0497a/CHDJJGFB.html

操作

NOPは、何も操作を行わず、は時間がかかることが保証されていません。 実行ステージに達する前にプロセッサがパイプラインからコードを削除する可能性があります。

たとえば、次の命令 を64ビット境界に配置するために、パディングにNOPを使用します。それに

、あなたは(原因の分岐に)パイプラインのリフィルのような他の様々な要因を追加する必要がありますし、フラッシュ待ち状態(異なるループ内の命令ブロックは、フラッシュアクセラレータのために完全に整列されない場合がありますので、様々な)。

正確な遅延を実行する唯一の信頼できる方法は、タイマーを使用することです。