你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32怎样实现500ns延时

[复制链接]
aicuicui 提问时间:2019-9-4 21:47 /
请问 STM32F407怎样实现500ns的延时呀, 我利用的是systick,修改其时钟源,可是运行结果不正确,代码如下:
void delay_init(u8 SYSCLK)
{
    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
    fac_500ns=SYSCLK/2;   
    fac_us=SYSCLK;                     

    fac_ms=(u16)fac_us*1000;   

}

void delay_x500ns(u32 x500ns)
{        
    u32 temp;            
    SysTick->LOAD=x500ns*fac_500ns;                              
    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;                  
}

我将例程源码进行上面修改之后,delay延时函数不再能够实现精确延时,请问是哪个地方出了问题呢
收藏 评论2 发布时间:2019-9-4 21:47

举报

2个回答
mylovemcu 回答时间:2019-9-9 14:39:19
void delay_init(u8 SYSCLK)  //72
{              
        SysTick->CTRL&=0xfffffffb;//bit2清空,选择外部时钟  STCLK = HCLK/8= 21M/s
        fac_us=SYSCLK/8;// SYSCLK为168,所以fac_us为21                    
        fac_ms=(u16)fac_us*1000;
}

//nus最小是50  时钟是21MHz  所以时钟最小分割是47ns
void delay_us(u32 ns)
{               
        u32 temp;                     
        SysTick->LOAD=ns*fac_us/1000; //时间加载                           
        SysTick->VAL=0x00;        //清空计数器
        SysTick->CTRL=0x01 ;      //开始倒数         
        do
        {
                temp=SysTick->CTRL;
        }
        while(temp&0x01&&!(temp&(1<<16)));//等待时间到达   
        SysTick->CTRL=0x00;       //关闭计数器
        SysTick->VAL =0X00;       //清空计数器         
}
aicuicui 回答时间:2019-9-9 19:49:26
mylovemcu 发表于 2019-9-9 14:39
void delay_init(u8 SYSCLK)  //72
{              
        SysTick->CTRL&=0xfffffffb;//bit2清空,选择外 ...

多谢~学习了

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版