单片机总线中的周期概念及其时钟时间估算及编程应用示例

最近一直在想怎么测单片机的总线时钟,于是想出了一个方法,也不知是否正确,权且估算一下吧。
先说明一下时钟周期,机器周期,总线周期的区别吧:
时钟周期:时钟周期也称为振荡周期,定义为时钟脉冲的倒数(可以这样来理解,时钟周期就是单片机外接晶振的倒数,例如12m的晶振,它的时间周期就是1/12 us),是计算机中最基本的、最小的时间单位。
机器周期: 在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段,每一阶段完成一项工作。例如,取指令、存储器读、存储器写等,这每一项工作称为一个基本操作。完成一个基本操作所需要的时间称为机器周期。一般情况下,一个机器周期由若干个s周期(状态周期)组成。 8051系列单片机的一个机器周期同6个 s周期(状态周期)组成。前面已说过一个时钟周期定义为一个节拍(用p表示),二个节拍定义为一个状态周期(用s表示),8051单片机的机器周期由6个 状态周期组成,也就是说一个机器周期=6个状态周期=12个时钟周期。(例如外接24m晶振的单片机,他的一个机器周期=12/24m 秒)
指令周期: 执行一条指令所需要的时间,一般由若干个机器周期组成。指令不同,所需的机器周期也不同。 对于一些简单的的单字节指令,在取指令周期中,指令取出到指令寄存器后,立即译码执行,不再需要其它的机器周期。对于一些比较复杂的指令,例如转移指令、乘法指令,则需要两个或者两个以上的机器周期。 通常含一个机器周期的指令称为单周期指令,包含两个机器周期的指令称为双周期指令。
总线周期:由于存贮器和i/o端口是挂接在总线上的,cpu对存贮器和i/o接口的访问,是通过总线实现的。通常把cpu通过总线对微处理器外部(存贮器或 i/o接口)进行一次访问所需时间称为一个总线周期。
总结:时钟周期是最小单位,机器周期需要1个或多个时钟周期,指令周期需要1个或多个机器周期;机器周期指的是完成一个基本操作的时间,这个基本操作有时可能包含总线读写,因而包含总线周期,但是有时可能与总线读写无关,所以,并无明确的相互包含的关系。指令周期:是cpu的关键指标,指取出并执行一条指令的时间。一般以机器周期为单位,分单指令执行周期、双指令执行周期等。现在的处理器的大部分指令(arm、dsp)均采用单指令执行周期。机器周期:完成一个基本操作的时间单元,如取指周期、取数周期。时钟周期:cpu的晶振的工作频率的倒数。
一个nop所占的时间为一个机器指令的时间,8051中为1us。
单片机型号为飞思卡尔mc9s12xep100,在main函数里放置时钟初始化函数,同时初始化一个引脚,并设置为输出,然后主函数放置该引脚电平的翻转函数。大致如下;
void main() { mcuinit(); ddrp_ddrp4=1;//ptp4设置为输出 while(1) { ptp_ptp4=~ptp_ptp4; } }然后用示波器测量该引脚翻转电平所用的时间,以下是部分数据:(示波器精度有限)
总线频率—>耗时 ≈ (1/总线频率)*10
16mhz —>620ns≈ 625ns
20mhz —>500ns≈ 500ns
32mhz —>312ns≈ 312ns
40mhz —>252ns≈ 250ns
48mhz —>208ns≈ 208ns
60mhz —>168ns≈ 166ns
通过上面的数据,发现耗时与(1/总线频率)*10基本相等,至于为何乘10,不知何因。权且当做粗略估算吧。
----------------------------------------------------------------单片机9s08dz60------------------------------------------------------------------------------
顺便记录下对dz60的测试
总线频率—>翻转电平耗时 ≈ (1/总线频率)*10 asm(nop)耗时
16mhz —>680ns ≈ 625ns 370ns
8mhz —>1.36us ≈ 1.25us 740ns
4mhz —>2.76us ≈ 2.50us 1.5us
其中asm(nop)耗时的计算方法如下:
void main() { mcuinit(); ddrp_ddrp4=1;//ptp4设置为输出 while(1) { ptp_ptp4=1; asm(nop); ptp_ptp4=0; } }下面附dz60时钟初始化函数(晶振8mhz,总线8mhz) void mcuinit(void) { sopt1 = 0x20; //取消看门狗,使能停止模式 sopt2 = 0x00; //写入一次sopt2 /* 初始化时钟,使用pee模式,晶振为8mhz,总线频率为8mhz(datasheet p151) */ /*----------------------------fei -> fbe----------------------------------*/ mcgc2 = 0x36; //总线分频为1.p133. while (!mcgsc_oscinit); //erefs位选择的晶体是否完成初始化.p134. mcgc1 = 0xb8; //选择使用外部晶振.p131. while (mcgsc_irefst); //等待外部参考成为参考时钟的当前源 while(mcgsc_clkst != 2); //等待外部参考 时钟成为 mcgout /*----------------------------fbe -> blpe---------------------------------*/ mcgc2 = 0x3e; //设置lp位为1(此时已经进入blpe模式) mcgc1 = 0x98;//0x98->rdiv=8;0x90->rdiv=4; //更改rdiv mcgc3 = 0x44;//0x44->vdiv=16;0x48->vdiv=32 //选择pll,vdiv为4 while(!mcgsc_pllst); //plls时钟的当前源是否pll /*----------------------------blpe -> pbe---------------------------------*/ mcgc2 = 0x36; //设置lp位为0(此时已经进入blpe模式) while (!mcgsc_lock); //等待pll获得锁定 /*----------------------------pbe -> pee----------------------------------*/ mcgc1 = 0x18; //选择pll为系统时钟 while(mcgsc_clkst != 3); //等待时钟稳定 }mcgout=(8mhz/8)*16/1=16mhz,总线时钟为8mhz

步进电机是什么?不转怎么办?小编教你解决步进电机不转问题
五分钟看完现代飞思1.6L舒适版 碰撞测试全过程
磷酸铁锂电池在电动汽车市场需求复苏,中期需求将会上升
介绍SystemVerilog几种常用的调试功能
呼吸机系统的基础知识
单片机总线中的周期概念及其时钟时间估算及编程应用示例
英迪芯获无锡高新区种子资金助力
【CES 2017】联想来搞事情了,推出全新的游戏本和一个智能语音助手
苏宁金融区块链+物联网汽车库融平台介绍
特斯拉的内华达州超级工厂日产约1300万个单体电池
4口4口全速高速USB任意混插KVM切换方案
使用千兆赫兹脉冲模式的飞秒激光进行玻璃微钻孔
小米note2上手体验:3D曲面握感极佳 画质细腻颜色绚丽
48伏是什么_48伏关键零部件介绍及系统收益
基于LabVIEW的鼠标位移测量技术研究
NVIDIA的RTX 3090可看Hotspot温度
定制产品如何影响印刷电路板
3D传感技术加速人脸识别技术发展
机房环境动力集中监控系统的功能特点及应用方案设计
Lumileds推出全新LED 可用于各种普通照明设计