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)则循环等待
}
手撸延时函数
最新推荐文章于 2025-05-05 22:22:17 发布