qianrushian 发表于 2018-3-10 08:37:22

stm32f030f4p6 微妙延时怎么做?

感谢各路大神指点!
感谢各路大神指点!
感谢各路大神指点!

XinLiYF 发表于 2018-3-10 10:09:00

本帖最后由 XinLiYF 于 2018-3-10 10:10 编辑

__nop();指令最精确:victory::victory::victory:

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

Tcreat 发表于 2018-3-10 09:45:17

精确点的 就用定时器做

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

Tcreat 发表于 2018-3-10 10:08:46

用系统滴答也可以

INT16U g_uwDelayTime_ms = 0;
static INT8Ug_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配置比较靠谱,不需要中断

toofree 发表于 2018-3-10 19:51:47

微秒延时,用滴答时钟最省事;
要更精准的话,用定时器查询方式。
页: [1]
查看完整版本: stm32f030f4p6 微妙延时怎么做?