1.下面A处的SysTick->VAL =0x00; 是否可以不要的?不是启动倒数后,VAL的值就变了的吗?至于写VAL时会清COUNTFLAG标志,但这个标志上电时就是0,每次用完delay_ms函数后也给清0了的啊。 2.下面B处的 while(temp&0x01&&!(temp&(1<<16))); 可否改为 while (!(temp&(1<<16))); 好像是一样的啊。
SysTick->VAL=0X00;//清空计数器 SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源 do { temp=SysTick->CTRL;//读取当前倒计数值 }while((temp&0x01)&&(!(temp&(1<<16)));//等待时间到达 SysTick->CTRL=0x00; //关闭计数器 SysTick->VAL =0X00; //清空计数器 } void delay_ms(...
(temp&(1<<16))); // 判断 CTRL 第16位 SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; // 清空计时器 SysTick->VAL = 0x00; }/** * 毫秒延时*/void delay_ms(u32 ms){ delay_us(ms*1000);}/** * 秒延时*/void delay_second(u32 second){ for(int i=0;i<second;...
(temp&(1<<16)));SysTick->CTRL=0x00; SysTick->VAL =0X00; }void TickDelayMs(u16 nms){ u32 temp; SysTick->LOAD=nms*fac_ms -1;SysTick->VAL =0x00;SysTick->CTRL=0x01 ;do{temp=SysTick->CTRL;}while((temp&0x01)&&!(temp&(1<<16)));SysTick->CTRL=0x00;SysTick->...
HCLK_Frequency/1000/8*nms; SysTick->VAL=0X00;//清空计数器 SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源 do { temp=SysTick->CTRL;//读取当前倒计数值 }while((temp&0x01)&&(!(temp&(1<<16)));//等待时间到达 SysTick->CTRL=0x00; //关闭计数器 SysTick->VAL =0X00; //...
}while((temp&0x01)&&!(temp&(1<<16))); SysTick->CTRL=0x00; SysTick->VAL =0X00; } 中断方式延时使用步骤 1)配置SysTick定时器时钟源 2)调用系统函数SysTick_Config(),开启中断,配置中断间隔 3)延时函数赋值延时变量,并等待延时变量递减到0,达到精确延时效果 ...
voiddelay_us(u32 nus)// nus 不要大于798915,因为LOAD寄存器是24位的{u32 temp;SysTick->LOAD=nus*fac_us;// 需要延时的时间SysTick->VAL=0x00;//清空计数器SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;// 开始倒数do{temp=SysTick->CTRL;}while((temp&0x01)&&!(temp&(1<<16)));//等待时间到达...
//关闭定时器 SysTick -> VAL |= 0x00; //将定时器归零 }
}while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达 SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器 SysTick->VAL =0X00; //清空计数器 } //延时nms //注意nms的范围 //SysTick->LOAD为24位寄存器,所以,最大延时为:
SysTick->VAL =0X00; //清空计数器 } 2中断延时 同样使用SysTick定时器实现延时,还可以通过中断的方式去实现,通过库函数SysTick_Config()配置SysTick定时器,同时开中断,由于设置的nms会在中断中递减,所以delay_ms函数中只要不断查询time_delay的值是否为0即可, ...