运用SysTick的一般计数模式对推迟进行办理.
static u8 fac_us=0;//us延时倍乘数
static u16 fac_ms=0;//ms延时倍乘数
//初始化推迟函数
void delay_init(u8 SYSCLK)
{
SysTick->CTRL&=0xfffffffb; //bit2清空,挑选外部时钟*/
fac_us = SYSCLK/8;
fac_ms = (u16)fac_us*1000;
}
//延时nms
//SysTick->LOAD为24位寄存器,所以,最大延时为:
//nms<=0xffffff*8*1000/SYSCLK
//对72M条件下,nms<=1864
void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD=(u32)nms*fac_ms; // 当倒数至零时,将被重装载的值 */
SysTick->VAL =0x00; // VAL寄存器中存放着当时倒计数的值 */
SysTick->CTRL=0x01 ; // Systick守时器的使能位 开端计时 */
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16))); //首要查看守时器使能位是否为1
//Systick守时器倒数至零后 位16被置1 被读取后该方位0
// 等待时刻抵达或守时器封闭 */
SysTick->CTRL=0x00; //封闭计数器
SysTick->VAL =0X00; //清空计数器
}
//延时nus
//nus为要延时的us数.
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=nus*fac_us; //时刻加载
SysTick->VAL=0x00; //清空计数器
SysTick->CTRL=0x01 ; //开端倒数
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待时刻抵达
SysTick->CTRL=0x00; //封闭计数器
SysTick->VAL =0X00; //清空计数器
}
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/263028.html