STC 51モノリシック遅延関数

966 ワード

#define STC_Y1  97560UL  // 89C/LEXX、90C/LEXX
#define STC_Y3  14050UL  // 10F/Lxx、11F/Lxx 、12C/LExx、15F104E/L104E(A )、15F204E/L204EA(A )
#define STC_Y5  13043UL  // 15F/L/Wxx(Y3        )

#define Fosc 12000000UL  //     
#define Core STC_Y5      //     

/**
 *    :  t  
 *    :0~65535
 */
void delay_ms(unsigned int t)
{
    unsigned int i;
    do{
        i = (unsigned int)(Fosc / Core);
        while(--i);
    }while(--t);
}

最大値を取って遅延誤差を見ればいいのに、t=65000、誤差は数十usで、一般的な遅延精度より高い.
最初のマクロ定義については、magic numberのように見えますが、実はdebugがアセンブリコードを得て、関数を呼び出して関数に戻って実行するすべての命令を得て、各カーネルの命令速度に応じて少し修正すればいいのです.これらの数は一定の範囲で修正することができます.
Fosc/Coreは浮動小数点数で、最後に整理をしましたが、この操作はコンパイルの時期に解決され、性能に影響を与えませんでした.
投稿時にSTCからY 6コアが出ていました.しかし、STCの新しい映画を手にしていないので、これからもないと思います.手元のSTC 15シリーズはまだあまり游んでいません.それにmega 8/16がたくさんあります.また、msp 430、stm 8/32がいくつかあります.次はこれらを遊ぶつもりです.