手撸延时函数

void delay_us(uint32_t nus)
{
    uint8_t temp;
    //①确定要数多少个数  
    SysTick->LOAD = 72 * nus;  // HCLK为1s 72M 而1s=1000ms=1M us   所以1us要数72个数
    //②清空当前计数
    SysTick->VAL=0x00;
    //③配置分频系数
    SysTick->CTRL |= 1 << 2;  // |=的含义是按位或(|)运算,对两个操作数的每一位进行逻辑“或”运算。如果对应的任意一位为 1,则结果为 1;否则,结果为 0。
                              //  结果会赋值回变量 SysTick中。   1<< 2的含义为 1 这个数向左平移2位    这样的话最终只会改变第二位的值
                               // CTRL第二位为CLKSOURCE  置1选择外部时钟源 8分频
    //④开启定时器
    SysTick->CTRL |= 1 << 0;  //使能位置1  开启定时器
    //⑤判断是否定时截止
    do{
    temp=SysTick->CTRL;    
    
    }while( (temp & 0x01) && (!(temp & 1<<16) ) );  //只用&是因为 如果用&=那么temp的值会发生改变   而这样就不会
    SysTick->CTRL &=  ~(1<<0);  //使能位置0 关闭 
    // &=的含义是按位与(&)运算:对两个操作数的每一位进行逻辑“与”运算。如果对应的两位都为 1,则结果为 1;否则,结果为 0。
                                                       //结果会赋值回变量 temp  只要使能位置1且CRRL寄存器的第16位为0(说明计数未到0)则循环等待
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值