void delayus(u32 x)
{
u32 i,j;
for(i=0;i<x;i++)
for(j=0;j<10;j++);
}
印象里这样大约是1us(没中断的情况下)。你可以采用定时器来测量函数大致的延时时间。
设置并,清计数器
开启定时器
进入函数
出函数后关闭定时器,读取计数器。观察用时。
__ASM("NOP");为1个机器周期,1/72M
//如图,允许多键同时按下,
//在KEY2或KEY3的中断服务期间,key1的中断请求仍能被服务;
//当KEY2与KEY3同时按下时,key2优先被服务,key3在key2服务结束后才能被服务;
//在key3的中断服务期间,key2的中断请求不能被服务。
//编程实现上述功能,设8051的主频为12MHZ,
//每个中断的服务用调用软件延时程序DELAY来模拟。
//k1 ---------> X0
//k2 or k3 ---> X1
#include<reg51h>
sbit P10 = P1^0; //CLR k1
sbit P11 = P1^1; //CLR k2
sbit P12 = P1^2; //CLR k3
sbit P13 = P1^3;
sbit P14 = P1^4;
sbit P15 = P1^5;
sbit P16 = P1^6; //k2
sbit P17 = P1^7; //k3
//------------------------------------------------------
void delay_ms(unsigned int num)
{
unsigned int i, j;
for(i = num; i > 0; i--) for(j = 124; j > 0; j--);
}
//------------------------------------------------------
void main(void) using 0
{
EX0 = 1;
EX1 = 1;
PX0 = 1;
EA = 1;
while(1) {;}
}
//------------------------------------------------------
void X0_INT(void) interrupt 0 using 1
{
unsigned char i;
P10 = 0; P10 = 1; //撤消外部中断申请
for (i = 0; i < 20; i++) {
P13 = 0; delay_ms(100); //快速闪烁
P13 = 1; delay_ms(100);
}
}
//------------------------------------------------------
void X1_INT(void) interrupt 2 using 2
{
unsigned char i;
if(P16) {
P11 = 0; P11 = 1; //撤消外部中断申请
for (i = 0; i < 10; i++) {
P14 = 0; delay_ms(200);//慢速闪烁
P14 = 1; delay_ms(200);
}
}
if(P17) {
P12 = 0; P12 = 1; //撤消外部中断申请
P15 = 0; delay_ms(5000); P15 = 1;//常亮
}
}
//------------------------------------------------------
已经通过实验验证。
电路和说明可见:
>
如果用32M的频率,这个函数耗时(1002403(1/32))us,但是调用delay()的时候因为调用的函数和delay()函数不在同一个code bank,所以实际的时间还要加上切换code bank的时间,最准确的方法就是用示波器去观察。
以上就是关于STM32延时问题全部的内容,包括:STM32延时问题、任选asm51或c51编程语言实现以下功能,并绘制程序流程图、CC2530中,asm,nop延时时间的计算等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)