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

谁有delay函数是基于SYSTICK

[复制链接]
fjlmnb456 提问时间:2018-3-21 23:30 /
   STM32F030F4 P6芯片用内部时钟。    想用滴答延时函数做。2.5kHz pwm波形。现在滴答延时函数搞不定,希望高手提供个例子。

收藏 评论12 发布时间:2018-3-21 23:30

举报

12个回答
feixiang20 回答时间:2018-3-21 23:58:00
要不去看看“STM32滴答时钟也就是SYSTICK做精确的延时函数”这个文章,有代码

评分

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

查看全部评分

wenyangzeng 回答时间:2018-3-22 07:29:17
st官方的例程很多呀

systick(库函数).rar (1.15 MB, 下载次数: 3)

评分

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

查看全部评分

wudianjun2001 回答时间:2018-3-22 08:15:28
官方有相关的例程的,
黑皮男 回答时间:2018-3-22 08:44:05
官方HAL_Delay
STM1024 回答时间:2018-3-22 09:51:18
直接贴代码,基于F103
  1. void Delay_ms(uint32_t ms)
  2. {
  3.     uint32_t temp;
  4.         SysTick->LOAD=9000*ms;
  5.         SysTick->CTRL=0x01;//CLKSOUTCE=0, so 9 MHz
  6.         SysTick->VAL=0;
  7.         do
  8.         {
  9.                 temp=SysTick->CTRL;
  10.         }while((temp&0x01)&&(!(temp&(1<<16))));
  11.         SysTick->CTRL=0;
  12.         SysTick->VAL=0;
  13. }
复制代码

评分

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

查看全部评分

七哥 回答时间: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延时。

傲游截图20180322095601.png

评分

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

查看全部评分

Tcreat 回答时间:2018-3-22 10:05:43
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;
}

评分

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

查看全部评分

埃斯提爱慕 回答时间:2018-3-22 10:37:37
提示: 作者被禁止或删除 内容自动屏蔽
butterflyspring 回答时间:2018-3-22 13:57:19
cubeMx生成的代码都有呀..

评分

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

查看全部评分

fjlmnb456 回答时间:2018-3-22 22:51:16
谢谢指教

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版