计算机中执行程序所需的时钟周期数和执行时间的区别是啥

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算机中执行程序所需的时钟周期数和执行时间的区别是啥相关的知识,希望对你有一定的参考价值。

参考技术A 记得不太清楚了,时钟周期好像是计算机执行一条语句的时间
时钟周期数就应该是所有程序执行完花费的时钟周期,是个理论性的值吧

STC15系列学习

51系列

  • 参考资料为各芯片数据手册,可在STC官网获取

AT89C52基础模块

  • AT89C51只有两个定时器、一个串口、两个外部中断

周期

  • 时钟周期也称为振荡周期由晶振决定 = 1/fsc
  • 状态周期 = 2*时钟周期
  • 机器周期 = 6状态周期 = 12时钟周期
  • 指令周期:执行一条指令所需的全部时间,不同的指令需要的时间不同。
    • 单周期指令:执行指令需要一个机器周期(12MHz   =>  1us)
    • 双周期指令:执行指令需要两个机器周期(12MHz   =>  2us)
    • 四周期指令:执行指令需要四个机器周期(12MHz   =>  4us)

引脚

  • P0(AD0-7):为一个8位漏级开路双向I/O口(需外接上拉电阻)
  • P1、P2(A8-15):标准I/O【P1.0/T2,P1.1/T2EX】
  • P3特殊功能I/O,也可作为普通I/O
    • P3.0/RXD
    • P3.1/TXD
    • P3.2/INT0*
    • P3.3/INT1*
    • P3.4/T0
    • P3.5/T1
    • P3.6/WR*
    • P3.7/RD*
  • RST:复位引脚
  • ALE / PROG ‾ \\overline\\textPROG PROG:访问外部数据存储器/程序存储器
  • PSEN ‾ \\overline\\textPSEN PSEN:程序储存器允许
  • EA/VPP:外部访问允许

存储器结构

RAM:0-1F

  • 工作寄存器组:4组*8个Ri

RAM:20-2F

  • 位寻址区

RAM:30-7F

  • 通用RAM

RAM:80-FF

SFR(红色可位寻址)符号字节(物理)地址位名称
D7D6D5D4D3D2D1D0
P0P080HP0.7P0.6P0.5P0.4P0.3P0.2P0.1P0.0
堆栈指针SP81H
数据指针DPTRDPH82H
DPL83H
保留3字节84H-86H
电源和波特率PCON87HSMOD GF1 GF0 PD IDL
定时器计数器控制寄存器TCON88HTF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
定时器计数器方式控制TMOD89HGATE1 C/T*1 M1_1 M1_0 GATE0 C/T*0 M0_1 M0_0
定时器计数器0LTL08AH
定时器计数器1LTL18BH
定时器计数器0HTH08CH
定时器计数器1HTH18DH
保留2Byte8EH-8FH
P1P190HP1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0
保留7Byte91H-97H
串行控制SCON98HSM0 SM1 SM2 REN TB8 RB8 TI RI
串行缓冲区SBUF99H
P2P2A0HP2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.0
中断允许IEA8HEA ET2
(reg52.h //8052 only)
ES ET1 EX1 ET0 EX0
P3P3B0HP3.7 P3.6 P3.5 P3.4 P3.3 P3.2 P3.1 P3.0
中断优先IPB8H PT2
(reg52.h)
PS PT1 PX1 PT0 PX0
定时器/计数器2T2CONC8HTF2 EXF2 RCLK TCLK EXEN2 TR2 C/T*2 CP/RL2
定时器/计数器2模式T2MODC9H T2OE DCEN
捕获RCPA2LCAH
RCPA2HCBH
定时器/计数器2高低位TL2CCH
TH2CDH
程序状态字PSWD0HCY AC F0 RS1 RS0 OV PF
累加器ACCE0H
寄存器BBF0H

定时器

  • 计数周期为:机器周期

定时器/计数器0、1

  • 寄存器
定时器计数器控制寄存器TCON88HTF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
定时器计数器方式控制TMOD89HGATE1 C/T*1 M1_1 M1_0 GATE0 C/T*0 M0_1 M0_0
中断允许IEA8HEA ES ET1 EX1 ET0 EX0
定时器计数器0LTL08AH
定时器计数器1LTL18BH
定时器计数器0HTH08CH
定时器计数器1HTH18DH
  • TCON
    • TF:定时器/计数器中断标志-----【硬件置位清零】
    • TR:定时器/计数器运行标志
  • TMOD
    • GATE:门控开关。0:软件启动。1:TR=1的同时还需要外部 INT0、INT1 为1才能启动。
    • C/T*:定时器/计数器选择,0:应用为定时器。1:应用为计数器。
    • M0、M1:工作模式选择,见下表
M1M0工作方式功能备注
00013位(不可重装)高5位加低8位
01116位不可重装\\
1028位自动重装TH值==>>TL值
113两个8位计数器(只适用于T0)
  • IE 【EA = 1】
    • ET对应置为才能启用中断功能

定时器T2

  • 中断软件清零
  • 寄存器
定时器/计数器2T2CONC8HTF2 EXF2 RCLK TCLK EXEN2 TR2 C/T*2 CP/RL2
定时器/计数器2模式T2MOD C9H T2OE DCEN
定时器/计数器2高低位TL2CCH
TH2CDH
捕获RCPA2LCAH
RCPA2HCBH

##### ·T2CON - 有两个信号源:①内部时钟溢出TF2。②外部T2EX负跳沿。 - 定时器2有三个工作方式 - 捕获方式 - 自动重装(向上/下计数) - 波特率发生器
RCLKTCLKCP/R2EXEN2工作方式
11xx波特率发生器
0011外部T2EX*捕获
0010\\
0001外部T2EX*重装
0000溢出自动重装
  • T2CON
    • TF2:T2溢出标志,硬件置位,软件清零
    • EXF2:定时器2外部标志。当EXEN2=1,且当T2EX引脚上出现负跳变而出现捕获或重装载时,EXF2置位,申请中断.此时如果允许定时器2中断,CPU响应中断,执行定时器2中断服务程序,EXF2必须由软件清除。当定时器2工作在向上或向下计数工作方式时(DCEN=1) , ExF2不能激活中断。
    • 串行通信(工作模式1和3下【注:工作模式0、2为波特率不可变】)设置
      • RCLK:接收时钟允许。1:用T2溢出脉冲作为串行口的接收时钟。0:用Tl的溢出脉冲作为接收时钟。
      • TCLK:发送时钟允许。同上。
    • EXEN2:T2外部允许标志。【定时器2未用于作串行口的波特率发生器】
      • 1:T2 捕获或重装载
      • 0:T2EX端的外部信号无效。
    • TR2:定时器2启动、暂停
    • C/T*:定时器2计数方式。C模式:下跳沿触发
    • CP/RL2:捕获/重装载选择。【与EXEN2关联】
      • l:T2EN双端出现负跳变脉冲时发生捕获操作。
      • 0:若定时器2溢出或EXEN2=l条件下,T2EN双端出现负跳变脉冲,都会出现自动重装载操作。当RCLK=1或TCLK=1时,该位无效,在定时器2溢出时强制其自动重装载。
定时器/计数器2模式T2MOD C9H T2OE DCEN
  • T2OE:T2输出允许位,当T2OE=1的时候,允许时钟输出到P1.0。(仅对80C54/80C58有效)
  • DCEN:向下计数允许位。DCEN=1是允许T2向下计数,否则向上计数。
重装模式
  • 用RCAPH、L值装入T2H、L
捕获模式
  • 当EXEN2=0时,只当作一个16bit定时器/计数器。
  • 当EXEN2=1,出现T2EN时下跳,将T2H、L装入RCAPH、L
波特率模式
  • 用RCAPH、L重装
  • 波 特 率 = 振 荡 频 率 32 × [ 65536 − ( R C P A 2 H , R C P A 2 L ) B ] 波特率=\\frac振荡频率32×[65536-(RCPA2H,RCPA2L)_B] =32×[65536(RCPA2H,RCPA2L)B]

调用方法

定时器0、1
#include <reg52.h>
char timer0 = ;	    //T0计数值
char timer0_1 = ;   //模式3下另一个计数器
void init_T0();

int main()
    Intr_init();
    Timer0_init();
    while(1)
    
        /* idle process */
    ;
    return 0;


/* 中断初始化 */
void Intr_init()

	ET0 = 1;	   	//开T0中断
	ET1 = 1;		//开T1中断
	EA = 1;

/* 定时器初始化 */
void Timer0_init()

	//初始化定时器0初值
    /*******模式0*********/
    TH0 = (8192 - timer0)/255;
    TL0 = (8192 - timer0)%255;
    /*
    *******模式1*********
    TH0 = (65536 - timer0)/255;
	TL0 = (65536 - timer0)%255;

    *******模式2*********
    TH0 = 256 - timer0;
	TL0 = 256 - timer0;

    *******模式3*********
    TH0 = 256 - timer0;
	TL0 = 256 - timer0_1;
    */

    //定时器模式选择
    //参考寄存器表
    TMOD = 0x00;    //模式0:13位
    /*
    TMOD = 0x01;    //模式1:16位
    TMOD = 0x02;    //模式2:8位自动重装
    TMOD = 0x03;    //两个8位

    TMOD = TMOD | 0x04; //计数器模式
    TMOD = TMOD | 0x08; //门控使能
    */

    TR0 = 1;
    //TR1 = 1;

/* T0中断服务程序 */
void intr_T0() interrupt 1

	/* do something */

定时器2
#include <reg52.h>
char timer2 = ;	    //T0计数值
void init_T2();

int main()
    Intr_init();
    Timer2_init();
    while(1)
    
        /* idle process */
    ;
    return 0;


/* 中断初始化 */
void Intr_init()

    /* 波特率模式下不需中断 */
	//ET2 = 1;		//开T2中断
    //修改中断优先级
    PT2 = 1;
    EA = 1;

/* 定时器初始化 */
void Timer2_init()

	//初始化定时器2初值
    /*******波特率模式*********/
    TH0 = (65536 - timer2)/255;
    TL0 = (65536 - timer2)%255;
    RCAP2L = (65536 - timer2)/255;
    RCAP2H = (65536 - timer2)%255;
    /*
    *******捕获模式*********
    TH0 = 0x00;
	TL0 = 0x00;

    *******重装模式*********
    TH0 = 65536 - timer2;
    TL0 = 65536 - timer2;
    RCAP2L = 65536 - timer2;
    RCAP2H = 65536 - timer2;
    */

    //定时器2模式选择
    //参考寄存器表
    RCLK = 1;    //波特率发生器模式
    TCLK = 1;
    /*
    EXEN2 = 1;  //使能外部引脚
    CP_RL2 = 1;    //捕获模式
    C_T2 = 1;   //使用计数器
    */
    TR2 = 1;

/* T0中断服务程序 */
void intr_T2() interrupt 5

    TF2 = 0;    //软件清零
    //EXF2 = 0;
	/* do something */

中断

  • 中断向量表
中断号中断地址中断功能
003HEX0
10BHT0
213HEX1
31BHT1
423HES
52BHET2
  • 优先级
IP^中断功能
0EX0
1T0
2EX1
3T1
4ES
5ET2
### 串口UART1
串行控制SCON98HSM0 SM1 SM2 REN TB8 RB8 TI RI
串行缓冲区SBUF99H

SM0-2

  • SM2:多机通信控制位
  • SM0、SM1:串口工作模式
SM0SM1说明波特率
00同步移位寄存器Fosc/12
0110bit帧、8bitdata定时器T1/T2
1011bit帧、8bit、1bit多机Fosc/32或Fosc/64
1111bit帧、8bit、1bit多机T1/T2
  • REN:接收使能
  • T、RB8:11bit帧作为第九位
  • TI、RI:发送接收中断标志,硬件置位,软件清零

实现方法

非中断方法
#include <reg52.h>
void Intr_init();
void UartInit();
void send_data(unsigned char x);
unsigned char recieve_data();
unsigned char buf = 0;
int main()
	Intr_init();
	UartInit();
	send_data(buf);
	buf = recieve_data();
	while(1);
	return 0;


void Intr_init()

	EA = 1;
	ES = 0;


void send_data(unsigned char x)

	SBUF = x;
	while(TI == 0);
	TI = 0;

unsigned char recieve_data()
	unsigned char x;
	while(RI == 0);
	x = SBUF;
	RI = 0;
	return x;

void UartInit()		//9600bps@12.000MHz

	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;		//8位数据,可变波特率
	TMOD &= 0x0F;		//设置定时器模式
	TMOD |= 0x20;		//设置定时器模式
	TL1 = 0xD9;		//设置定时初始值
	TH1 = 0xD9;		//设置定时重载值
	ET1 = 0;		//禁止定时器%d中断
	TR1 = 1;		//定时器1开始计时

中断方法
#include <reg52.h>
void Intr_init();
void UartInit();
char busy = 0;
unsigned char buf = 0;
int main()
	Intr_init();
	UartInit();
	while(1)
	
		if(busy == 0)
		
			SBUF = 0x25;
			busy = 1;
		
	;
	return 0;


void Intr_init()

	EA = 1;
	ES = 1;
	ET1 = 0;


void UartInit()		//9600bps@12.000MHz

	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;		//8位数据,可变波特率
	TMOD &= 0x0F;		//设置定时器模式
	TMOD |= 0x20;		//设置定时器模式
	TL1 = 0xD9;		//设置定时初始值
	TH1 = 0xD9;		//设置定时重载值
	ET1 = 0;		//禁止定时器%d中断
	TR1 = 1;		//定时器1开始计时


void Uart_Intr()	interrupt 4

	if(RI)
	
		RI = 0;
		/* do something */
	
	else if(TI)
	
		TI = 0;
		busy = 0;
		/* do something */
	

重定向printf
#include <reg52.h>
#include <stdio.h>
void Intr_init();
void UartInit();
char send_busy = 0;
char write_busy = 0;
unsigned char buf = 0;

/* 重定向 */
//UART1 发送串口数据
void UART1_SendData(char dat)

	ES=0;			//关串口中断
	SBUF=dat;			
	while(TI!=1);	//等待发送成功
	TI=0;			//清除发送中断标志
	ES=1;			//开串口中断

//重写putchar函数
char putchar(char c)

	UART1_SendData(c);
	return c;


int main()
	Intr_init();
	UartInit();
	while(1)
	
		printf("字符串");
	;
	return 0;


void Intr_init()

	EA = 1;
	ES = 0;
	ET1 = 0;


void UartInit()		//9600bps@12.000MHz

	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;		//8位数据,可变波特率
	TMOD &= 0x0F;		//设置定时器模式
	TMOD |= 0x20;		//设置定时器模式
	TL1 = 0xD9;		//设置定时初始值
	TH1 = 0xD9;		//设置定时重载值
	ET1 = 0;		//禁止定时器%d中断
	TR1 = 1;		//定时器1开始计时


其他功能寄存器

PCON

电源和波特率PCON87HSMOD GF1 GF0 PD IDL
  • PD:掉电工作位
  • IDL:空闲工作位
  • GF:系统保留通用标志

PSW

  • CY:进位标志
  • AC:辅助进位标志
  • F0、F1:用户定义
  • RS1、0:工作寄存器
  • OV:溢出标志
  • P:奇偶标志:1–>奇

STC15F100系列

  • 在AT89C52基础增加
    • 【看门狗】
    • 【IAP】
    • 【可编程时钟输出】
    • 【P3 I/O控制寄存器】
  • 在AT89C52基础减去
    • 【定时器2(包括捕获功能)】
  • 修改定时器工作模式0为16位重装载

特殊寄存器映射

SFR符号字节(物理)地址位名称
D7D6D5D4D3D2D1D0
电源控制寄存器PCON87H--LVDF-GF1GF0PDIDL
辅助寄存器0AUXR8EHT0*12T1*12------
INT_CLKOINT_CLKO8FH-EX4EX3EX2--T1CLKOT0CLKO
CLK_DIVCLK_DIV97H-----CLKS2CLKS1CLKS0
P3M1P3M1B1H
P3M0P3M0B2H
IRC_CLKOIRC_CLKOBBH------IRCS1IRCS0
WDT_CONRWDT_CONRC1H
ISP/IAP Flash数据寄存器IAP_DATAC2H
ISP/IAP Flash地址高8bitIAP_ADDRHC3H
ISP/IAP Flash地址低8bitIAP_ADDRLC4H
ISP/IAP命令寄存器IAP_CMDC5H------MS1MS0
ISP/IAP命令触发器IAP_TRIGC6H
ISP/IAP控制寄存器IAP_CONTRC7HIAPENSWBSSWRSTCMD_FAIL-WT2WT1WT0

可编程时钟

系统时钟分频

CLK_DIVCLK_DIV97H-----CLKS2CLKS1CLKS0
  • 系统R/C震荡时钟分频如下表格
CLKS2CLKS1CLKS0分频系数
000/1
001/2
010/4
011/8
100/16
101/32
110/64
111/128

可编程时钟输出

  • 有三路可编程时钟输出
    • IRC_CLKO/P3.4
    • CLK_OUT0/P3.5
    • CLK_OUT1/P3.4
  • 寄存器
辅助寄存器0AUXR8EHT0*12T1*12------
INT_CLKOINT_CLKO8FH-EX4EX3EX2--T1CLKOT0CLKO
IRC_CLKOIRC_CLKOBBH------IRCS1IRCS0
  • AUXR
    • T*12:定时器速度是传统51的12倍**【计数时钟为系统(晶振)时钟】**
  • INT_CLKO
    【关闭定时器中断,定时器工作于方式0或者2】
    • T1CLKO:管脚P3.5允许时钟输出【定时器1】
    • T0CLKO:管脚P3.4允许时钟输出【定时器0】
    • 输出时钟频率= T溢出率 / 2
  • IRC_CLKO
    • IRCS:输出IRC时钟(见下表)
IRCS1IRCS0输出频率
00无时钟输出
01内部时钟输出不分频
102分频
114分频

P3口输出模式

  • P3M0、1:设定P3.5-3.0
P3M1[5:0]P3M0[5:0]I/O模式
00标准双向I/O
01推挽
10高阻
11开漏(外加上拉电阻)

IAP

  • 1KB/2KB数据EEPROM
  • 每个扇区512(0.5K)字节数据
ISP/IAP Flash数据寄存器IAP_DATAC2H
ISP/IAP Flash地址高8bitIAP_ADDRHC3H
ISP/IAP Flash地址低8bitIAP_ADDRLC4H
ISP/IAP命令寄存器IAP_CMDC5H------MS1MS0
ISP/IAP命令触发器IAP_TRIGC6H
ISP/IAP控制寄存器IAP_CONTRC7HIAPENSWBSSWRSTCMD_FAIL-WT2WT1WT0

IAP_CMD

  • 命令见下表
MS1MS0命令内容
00待机、无操作
01对数据Flash区读字节
10对数据Flash区进行字节编程
11对数据Flash扇区进行擦除

IAP_TRIG

  • 先写5AH再写A5H,触发命令

IAP_CONTR

ISP/IAP控制寄存器IAP_CONTRC7HIAPENSWBSSWRSTCMD_FAIL-WT2WT1WT0
  • IAPEN:IAP读写擦使能
  • SWBS:0:软件选择从用户应用程序启动;1:从系统ISP监控程序区启动
  • SWRST:1:软件复位
  • CMD_FAIL:触发命令失败标志位,软件清零
  • WT2-0:设置等待时间(见下表)
WT2WT1WT0ReadProgramSector Erase推荐系统时钟
0002个时钟55个时钟21012个时钟<=1MHz
0012个时钟110个时钟42024个时钟<=2MHz
0102个时钟165个时钟63036个时钟<=3MHz
0112个时钟330个时钟126072个时钟<=6MHz
1002个时钟660个时钟252114个时钟<=12MHz
1012个时钟1100个时钟420240个时钟<=20MHz
1102个时钟1320个时钟504288个时钟<=24MHz
1112个时钟1760个时钟672384个时钟<=30MHz
#### 调用方法 - 参考STCF100系列指南 ```c #include

typedef unsigned char Byte;
typedef unsigned int Word;

/* 声明ISP功能寄存器地址 */
sfr IAP_DATA = 0xC2;
sfr IAP_ADDRH = 0xC3;
sfr IAP_ADDRL = 0xC4;
sfr IAP_CMD = 0xC5;
sfr IAP_TRIG = 0xC6;
sfr IAP_CONTR = 0xC7;

/* 定义命令 */
#define CMD_IDLE 0 //Stand-By
#define CMD_READ 1 //Byte-READ
#define CMD_PROGRAM 2 //Byte-Program
#define CMD_ERASE 3 //Sector-Erase

/* 定义IAP等待时间 */
#define ENABLE_IAP 0x82 //if SYSCLK<20KHz

#define IAP_ADDRESS 0x0000

void Delay(Byte n);
void IapIdle();
Byte IapReadByte(Word addr);
void IapProgrameByte(Word addr, Byte dat);
void IapEraseSector(Word addr);

void\\ main()

Word i;
P1 = 0xFE; //System Reset OK!
Delay(10);
IapEraseSector(IAP_ADDRESS); //Erase current sector
for(i=0;i<512;i++)
if(IapReadByte(IAP_ADDRESS+i) != 0xFF)
goto Error;

P1 = 0xFC; //Erase Successful
Delay(10);
for(i=0;i<512;i++)

IapProgrameByte(IAP_ADDRESS+i,byByte(i));

P1 = 0xF0; //Verify Successful
while(1);
Error;
P1 &= 0x7F; //IAP Error
while(1);

/* Software delay function */
void Delay(Byte n)
Word x;
while (n–)
x = 0;
while (++x);

/* Disable ISP/IAP/EEPROM function Make MCU in a safe state*/
void IapIdle()

IAP_CONTR = 0;
IAP_CMD = 0;
IAP_TRIG = 0;
IAP_ADDRH = 0x80;
IAP_ADDRL =0x00;

/* Read one byte form ISP/IAP/EEPROM area
Input: addr
Output: Flash data*/
void IapReadByte(Word addr)
Byte dat;

IAP_CONTR=ENABLE_IAP;
IAP_CMD=CMD_READ;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_TRIG=0x5A;
IAP_TRIG=0xA5;
_nop_();
_nop_();
_nop_();

dat=IAP_DATA;
IapIdle();

return dat;

/* Program one byte to ISP/IAP/EEPROM area
Input: addr dat
Output: -
*/
void IapProgrameByte(Word addr, Byte dat)

IAP_CONTR=ENABLE_IAP;
IAP_CMD=CMD_PROGRAM;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_DATA=dat;
IAP_TRIG=0x5A;
IAP_TRIG=0xA5;
nop();
nop();
nop();
IapIdle();

/* Erase sector
Input: addr
Output; -
*/
void IapEraseSector(Word addr)
IAP_CONTR=ENABLE_IAP;
IAP_CMD=CMD_ERASE;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_TRIG=0x5A;
IAP_TRIG=0xA5;
nop();
nop();
nop();
IapIdle();

### 看门狗
- 本质为一个定时器,定时器溢出时将会产生复位。因此必须在定时器计数溢出前将看门狗计数清零,才能保证不产生看门狗复位【也叫做“<font color="red">喂狗</font>”】。
<table>
    <tr>
        <th colspan="8"> WDT_CTRL</td>
    </tr>
    <tr>
        <td><center>WDT_FLAG</td>
        <td> \\ </td>
        <td><center>EN_WDT</td>
        <td><center>CLR_WDT</td>
        <td><center>IDLE_WDT</td>
        <td><center>PS[2:0]</td>
    </tr>
    <tr>
        <td><center>看门狗定时器<br>溢出标志</center></td>
        <td> \\ </td>
        <td>看门狗使能</td>
        <td><center>看门狗定时器<br>清零</center></td>
        <td><center>空闲模式下<br>看门狗是否工作</center></td>
        <td><center>看门狗定时器<br>分频系数</center></td>
    </tr>
</table>

```c
void  WDT_INIT() 
    WDT_CONTR = 0x3c;


int  main()
    WDT_INIT();
    while(1)
        /* Do Something */
        /* ------------ */
        /* xxxxxxxxxxxx */
        /* ------------ */
        WDT_CONTR = 0x3c;   //喂狗
    


非成模块寄存器总结

PCON

电源控制寄存器PCON87H--LVDFPOFGF1GF0PDIDL
  • POF:Power On Flag
    • 上电复位标志
    • POF=1:冷启动,上电复位
  • LVDF:低电压标志,此时不要进行ISP操作
  • GF1、0:用户调用
  • PD:掉电模式
    • 内部时钟停止,CPU、定时器、看门狗停止
    • 外部中断继续工作,可通过外部中断唤醒
    • 低压检测电路如果被使能,也继续工作
  • IDL:空闲模式
    • 只有CPU停止工作
    • 任何中断都可以唤醒CPU

AUXR

  • 见可编程时钟输出

INT_CLKO

INT_CLKOINT_CLKO8FH-EX4EX3EX2--T1CLKOT0CLKO
- EXn:外部中断INT4-2使能 - TnCLK:定时器输出-见可编程时钟输出部分

STC15F2K60S2系列

  • 在STC15F100系列上新增
    • 【所有I/O模式控制寄存器】
    • 【UART2、3、4】
    • 【ADC】
    • 【SPI】
    • 【CCP/PCA/PWM】
    • 【T2、3、4】

复位与时钟

复位

复位的方式
  1. 上电复位
    • 无ISP操作:电源电压上电到复位门槛电压后,延迟8192个时钟后进入用户程序。
    • 有ISP操作:当MAX810专用复位电路在ISP编程时被允许,则延迟约180ms,复位才解除。
  2. RST引脚复位
    • RST引脚拉高至少24个时钟+20us后才会复位
  3. 内部低电压检测电路复位
    • LVDF
  4. ‘看门狗’复位
  5. 软件复位
    • IAP_CONTR送60H

存储单元

寄存器映射

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5LwO9ZxZ-1643465915402)(/assets/STC15F2K60S2_m5t22vtzh.png)]

模块描述符号地址位功能
D7D6D5D4D3D2D1D0
电源、时钟、外围设备【I/O引脚复用设置】电源控制寄存器PCON85HSMODSMOD0LVDFPOFGF1GF0PDIDL
电源控制寄存器2/时钟分频寄存器PCON2/CLK_DIV97HMCKO_S1MCKO_S0ADRJTx_RxTx2_Rx2CLKS2CLKS1CLKS0
辅助寄存器0AUXR8EHT0*12T1*12UART_M0*6T2RT2_C/T*T2*12EXTRAMSIST2
辅助寄存器1/外围设备功能切换控制寄存器1AUXR1/P_SW1A2HS1_S1S1_S0CCP_S1CCP_S0SPI_S1SPI_S00DPS
辅助寄存器2/外围设备功能切换控制寄存器2AUXR2/P_SW28FH-EX4EX3EX2-T2CLKOT1CLKOT0CLKO
定时器T0~4、掉电唤醒专用定时器
【定时器2控制位在辅助寄存器0 AUXR中】
定时器0控制寄存器TCON88HTF1TR1TF0TR0IE1IT1IE0IT0
定时器工作方式寄存器TMOD89HGATE1C/T*1M1.1M1.0GATE0C/T*0M0.1M0.0
定时器0低8bitTL08AH
定时器1低8bitTL18BH
定时器0高8bitTH08CH
定时器1高8bitTH18DH
定时器3、4控制寄存器T4T3MD1HT4RT4_C/T*T4*12T4CLKOT3RT3_C/T*T3*12T3CLKO
定时器4高8bitTH1D2H
定时器4低8bitTH1D3H
定时器3高8bitTH1D4H
定时器3低8bitTH1D5H
定时器2高8bitTH1D6H
定时器2低8bitTH1D7H
掉电专用定时器控制寄存器低8WKTCL_CNTAAH
掉电专用定时器控制寄存器低8WKTCH_CNTABHWKTEN
中断控制寄存器中断允许寄存器0IEA8HEAELVDEADCESET1EX1ET0EX0
中断允许寄存器1IE2AFH ET4ET3ES4ES3ET2ESPIES2
中断优先级寄存器0IPB8HPPCAPLVDPADCPSPT1PX1PT0PX0
中断优先级寄存器1IP2B5H------PSPIPS2
UART串口4控制寄存器S4CON84HS4SM0S4ST4S4SM2S4RENS4TB8S4RB8S4TIS4RI
串口4数据缓冲器S4BUF85H
串口1控制寄存器SCON98HSM0/FESM1SM2RENTB8RB8TIRI
串口1数据缓冲器SBUF99H
串口2控制寄存器S2CON9AHS2SM0-S2SM2S2RENS2TB8S2RB8S2TIS2RI
串口2数据缓冲器S2BUF9BH
串口3控制寄存器S3CONACHS3SM0S3ST4S3SM2S3RENS3TB8S3RB8S3TIS3RI
串口3数据缓冲器S3BUFADH
从机地址控制寄存器SADDRA9H
从机地址掩码寄存器SADENB9H
ADCP1模拟通道开关P1ASF9DHP17ASFP16ASFP15ASFP14ASFP13ASFP12ASFP11ASFP10ASF
A/D转换控制寄存器ADC_CONTRBCHADC_POWERSPEED1SPEED0ADC_FLAGADC_STARTCHS2CHS1CHS0
A/D转换结果高8位寄存器ADC_RESBDH
A/D转换结果低2位寄存器ADC_RESLBEH
SPISPI状态寄存器SPSTATACDHSIFWCOL------
SPI控制寄存器SPCTLCEHSSIGSPENDORDMSTRCPOLCAPHASPR1SPR0
SPI数据寄存器SPDATCFH
PCA/PWMPCA控制寄存器CCOND8HCFCR--CCF3CCF2CCF1CCF0
PCA模式寄存器CMODD9HCIDL----CPS1CPS0ECF
PCA模块0模式寄存器CCAPM0DAH-ECOM0CAPP0CAPN0MAT0TOG0PWM0ECCF0
PCA模块1模式寄存器CCAPM1DBH-ECOM1CAPP1CAPN1MAT1TOG1PWM1ECCF1
PCA模块0模式寄存器CCAPM0DCH-ECOM2CAPP2CAPN2MAT2TOG2PWM2ECCF2
PCA计数器低8位CLE9H
PCA计数器高8位CHF9H
PCA模块0捕捉寄存器低8位CCAP0LEAH
PCA模块1捕捉寄存器低8位CCAP1LEBH
PCA模块2捕捉寄存器低8位CCAP2LECH
PCA模块0捕捉寄存器高8位CCAP0HFAH
PCA模块1捕捉寄存器高8位CCAP1HFBH
PCA模块2捕捉寄存器高8位CCAP2HFCH
PCA PWM模式辅助寄存器0PCA_PWM0F2HEBS0_1EBS0_0----EPC0HEPC0L
PCA PWM模式辅助寄存器1PCA_PWM1F3HEBS1_1EBS1_0----EPC1HEPC1L
PCA PWM模式辅助寄存器2PCA_PWM0F4HEBS2_1EBS2_0----EPC2HEPC2L
总线控制寄存器BUS_SPEEDA1H------EXRTS1EXRTS0

中断系统

中断源中断向量中断地址
外部中断0003H
定时器010BH
外部中断1213H
定时器131BH
串口1423H
ADC52BH
LVD633H
PCA73BH
串口2843H
SPI94BH
外部中断21053H
外部中断3115BH
定时器21263H
保留13~156BH~7BH
外部中断41683H
串口3178BH
串口41893H
定时器3199BH
定时器420A3H
### 定时器T2、3、4 - 定时器2、3、4为固定的16位重装载模式 - T3、4可以作为可编程时钟输出

串UART2、3、4

多机通信原理

  • 工作在方式2、3,第九位作为地址帧的识别
  • 设置SM2 = 1
  • 通信步骤

以上是关于计算机中执行程序所需的时钟周期数和执行时间的区别是啥的主要内容,如果未能解决你的问题,请参考以下文章

[转]51430stm32周期和执行一条语句需要多长时间的问题

计算机组成原理各个缩写的含义

计算机组成原理各个缩写的含义

体系结构

STC15系列学习

STC15系列学习