中级会员 
   
	- 积分
 - 472
 
        - 金钱
 - 472 
 
       - 注册时间
 - 2016-7-15
 
      - 在线时间
 - 175 小时
 
 
 
 | 
 
 
发表于 2017-8-17 10:31:22
|
显示全部楼层
 
 
 
 
那个原子哥的代码是在ucos下用的,太久了,没看清。 
是这样的:原子哥代码中普通延时并没有开systick中断,[mw_shl_code=applescript,true]#else //不用OS时 
//延时nus 
//nus为要延时的us数.                                                                                        
void delay_us(uint32_t nus) 
{                 
        uint32_t 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->CTRL&=~SysTick_CTRL_ENABLE_Msk;        //关闭计数器 
        SysTick->VAL =0X00;                                               //清空计数器          
} 
//延时nms 
//注意nms的范围 
//SysTick->LOAD为24位寄存器,所以,最大延时为: 
//nms<=0xffffff*8*1000/SYSCLK 
//SYSCLK单位为Hz,nms单位为ms 
//对72M条件下,nms<=1864  
void delay_ms(uint16_t nms) 
{                                      
        uint32_t temp;                    
        SysTick->LOAD=(uint32_t)nms*fac_ms;                                //时间加载(SysTick->LOAD为24bit) 
        SysTick->VAL =0x00;                                                        //清空计数器 
        SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;        //开始倒数   
        do 
        { 
                temp=SysTick->CTRL; 
        }while((temp&0x01)&&!(temp&(1<<16)));                //等待时间到达    
        SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;        //关闭计数器 
        SysTick->VAL =0X00;                                               //清空计数器                       
} [/mw_shl_code] 
 
每次调用延时函数时都重新配置systick寄存器哦。 
 |   
 
 
 
 |