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

stm32f030f4p6 微妙延时怎么做?

[复制链接]
qianrushian 提问时间:2018-3-10 08:37 /
感谢各路大神指点!
感谢各路大神指点!
感谢各路大神指点!
收藏 评论7 发布时间:2018-3-10 08:37

举报

7个回答
XinLiYF 回答时间:2018-3-10 10:09:00
本帖最后由 XinLiYF 于 2018-3-10 10:10 编辑

__nop();指令最精确

但是做一个可以改变延时的函数就不精确了。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

Tcreat 回答时间:2018-3-10 09:45:17
精确点的 就用定时器做

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

Angel_YY 回答时间:2018-3-10 09:56:17
微妙级别的延时肯定要使用定时器了,F030为48M主频,48分频后频率为1MHz,周期为1微妙,使用定时器记录这个脉冲,假设需要延时10us,这里记录10次后产生中断,即可达到10us延时。
详细文档本论坛有相关文章提供
https://www.stmcu.org.cn/module/forum/thread-606245-1-1.html

评分

参与人数 1蝴蝶豆 +4 收起 理由
zero99 + 4

查看全部评分

Tcreat 回答时间:2018-3-10 10:08:46
用系统滴答也可以  

INT16U g_uwDelayTime_ms = 0;
static INT8U  g_ubMultiple_us = 0;
static INT16U g_uwMultiple_ms = 0;


void Delay(INT16U mTime)
{
        g_uwDelayTime_ms = mTime;
        while(g_uwDelayTime_ms != 0);
}


void Delay_Init(INT8U sysclk)
{
        SysTick->CTRL &= 0xFFFFFFFB;                                     // Ñ¡ÔñTickʱÖÓÔ´¡ª¡ªHCLK/8
        g_ubMultiple_us = sysclk / 8;
        g_uwMultiple_ms = (INT16U)sysclk / 8 * 1000;
        //SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk;                   // Ñ¡ÔñTickʱÖÓÔ´¡ª¡ªÏµÍ³Ê±ÖÓ
        //g_ubMultiple_us = sysclk;
        //g_uwMultiple_ms = (INT16U)sysclk * 1000;
}


// ΢Ã붨ʱ
void Delay_us(INT16U time)
{
        INT32U ulTemp = 0;
       
        ulTemp = (INT32U)time * g_ubMultiple_us;
        SysTick->LOAD = ulTemp - 1;
        SysTick->VAL = 0;                                             // ¸³Öµ¿ÉÇå³þSysTick_CTRL_COUNTFLAG_Msk λ
        SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;                     // Æô¶¯¼ÆʱÆ÷
        do
        {
                ulTemp = SysTick->CTRL;
        }
        while((ulTemp & SysTick_CTRL_COUNTFLAG_Msk) != SysTick_CTRL_COUNTFLAG_Msk);       // µÈµ½¼ÆÊýÍê³É
        SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;                                        // Í£Ö¹¼ÆʱÆ÷
        SysTick->VAL = 0;       
}


// ºÁÃ붨ʱ
void Delay_ms(INT16U time)
{
        INT32U ulTemp = 0;
       
        ulTemp = (INT32U)time * g_uwMultiple_ms;
        SysTick->LOAD = ulTemp - 1;
        SysTick->VAL = 0;                                              // ¸³Öµ¿ÉÇå³þSysTick_CTRL_COUNTFLAG_Msk λ
        SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;                      // Æô¶¯¼ÆʱÆ÷
        do
        {
                ulTemp = SysTick->CTRL;
        }
        while((ulTemp & SysTick_CTRL_COUNTFLAG_Msk) != SysTick_CTRL_COUNTFLAG_Msk);       // µÈµ½¼ÆÊýÍê³É
        SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;                                        // Í£Ö¹¼ÆʱÆ÷
        SysTick->VAL = 0;
}
qianrushian 回答时间:2018-3-10 11:44:08
Tcreat 发表于 2018-3-10 10:08
用系统滴答也可以  

INT16U g_uwDelayTime_ms = 0;

谢了,就是要滴答时钟
stm1024 回答时间:2018-3-10 12:00:16
用SysTick配置比较靠谱,不需要中断

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

toofree 回答时间:2018-3-10 19:51:47
微秒延时,用滴答时钟最省事;
要更精准的话,用定时器查询方式。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

所属标签

相似问题

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