fjlmnb456 发表于 2018-3-21 23:30:40

谁有delay函数是基于SYSTICK

   STM32F030F4 P6芯片用内部时钟。    想用滴答延时函数做。2.5kHz pwm波形。现在滴答延时函数搞不定,希望高手提供个例子。

feixiang20 发表于 2018-3-21 23:58:00

要不去看看“STM32滴答时钟也就是SYSTICK做精确的延时函数”这个文章,有代码

wenyangzeng 发表于 2018-3-22 07:29:17

st官方的例程很多呀


wudianjun2001 发表于 2018-3-22 08:15:28

官方有相关的例程的,

黑皮男 发表于 2018-3-22 08:44:05

官方HAL_Delay

Inc_brza 发表于 2018-3-22 09:31:40

论坛里有相关链接,楼主可搜
https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=614985&highlight=systick
https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=606106&highlight=systick

stm1024 发表于 2018-3-22 09:51:18

直接贴代码,基于F103
void Delay_ms(uint32_t ms)
{
    uint32_t temp;
        SysTick->LOAD=9000*ms;
        SysTick->CTRL=0x01;//CLKSOUTCE=0, so 9 MHz
        SysTick->VAL=0;
        do
        {
                temp=SysTick->CTRL;
        }while((temp&0x01)&&(!(temp&(1<<16))));
        SysTick->CTRL=0;
        SysTick->VAL=0;
}

toofree 发表于 2018-3-22 09:59:20

本帖最后由 toofree 于 2018-3-22 10:00 编辑

默认的HAL_Delay()是1ms级延时。
对应的系统时钟初始化中有一条指令,HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
HAL_RCC_GetHCLKFreq()/1000的值越小,频率越高。当HAL_RCC_GetHCLKFreq()/1时,为1Hz;你要分个5KHz,那么就是HAL_RCC_GetHCLKFreq()/200。
在函数中用一条HAL_Delay(1),就相当于200us延时。



Tcreat 发表于 2018-3-22 10:05:43

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;
}

dsjsjf 发表于 2018-3-22 10:37:37

官方HAL库中使用的,你可以参考。
__weak void HAL_IncTick(void)
{
uwTick++;
}
__weak void HAL_Delay(__IO uint32_t Delay)
{
uint32_t tickstart = HAL_GetTick();
uint32_t wait = Delay;

/* Add a period to guarantee minimum wait */
if (wait < HAL_MAX_DELAY)
{
   wait++;
}

while((HAL_GetTick() - tickstart) < wait)
{
}
}
页: [1] 2
查看完整版本: 谁有delay函数是基于SYSTICK