#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已经出Y6内核了。不过手上没有STC的新片,估计以后也不会有了,手头这些STC15系列的还没怎么玩。况且还有一堆mega8/16 另外有几片msp430,stm8/32,下一步打算玩玩这些。