谁有delay函数是基于SYSTICK
STM32F030F4 P6芯片用内部时钟。 想用滴答延时函数做。2.5kHz pwm波形。现在滴答延时函数搞不定,希望高手提供个例子。要不去看看“STM32滴答时钟也就是SYSTICK做精确的延时函数”这个文章,有代码 st官方的例程很多呀
官方有相关的例程的, 官方HAL_Delay 论坛里有相关链接,楼主可搜
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 直接贴代码,基于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 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延时。
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;
} 官方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