1 机器周期和晶振周期
机器周期是用来规范指令执行时间的,执行不同的指令需要的机器周期不同;是理论值;
晶振周期是晶体震荡一次所需要的时间,作为单片机的时钟生成器而存在;是实际量;
那么机器周期和晶振周期有什么联系呢?
1.1 对于某些教科书上的51单片机而言,他们的晶振周期和机器周期不相等;
教科书上的单片机由于性能和工艺的限制没有办法在一个晶振周期内完成一次基本指令操作,所以1个机器周期需要12个晶振周期;
1.2 对于现在能够遇到的51和32位机而言,一个晶振周期就等于一个机器周期;
2 下面以stm32仿真举个例;
/*----------------------------------------------------------------------------
以下定义位于system_ARMCM3.c中,为什么定义成25MHz呢?因为这是keil默认仿真的晶振周期;
大概率这个数值是要和仿真周期相同;keil中是多少,这里改成多少;
*----------------------------------------------------------------------------*/
#define XTAL ( 5000000UL) /* Oscillator frequency */
#define SYSTEM_CLOCK (5U * XTAL) //仿真晶振周期是这个
/***以下为用户代码举例***/
uint32_t SystemCoreClock = SYSTEM_CLOCK; //配置系统时钟25MHz,那么1个机器周期为1/(25MHz) s,即40ns;
SysTick_Config( SystemCoreClock / 100); //systick装载计数250000次,即250000*40ns = 10ms;
//对于stm32而言1个晶振周期等于1个机器周期
//所以systick加载1次需要1个机器周期,等于1个晶振周期40ns;
void delay (uint32_t count){
for(; count!=0; count--)
;
}
//问题来了,如果delay函数如上,那么delay(100)是延时多少呢?
//是不是想当然觉得delay(100),那不就是100*40ns=4us?嘿嘿,那你就上当了;
//这个函数不是自减减函数,这个函数跑出来的仿真延时是20us;这个for循环用了5个机器周期,一个判断指令4周期,一个自减指令1周期;