你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
chrome
firefox
safari
ie8及以上
ST
意法半导体官网
STM32
中文官网
ST
全球论坛
登录/注册
首页
技术问答
话题
资源
创客秀
视频
标签
积分商城
每日签到
谁有delay函数是基于SYSTICK
[复制链接]
fjlmnb456
提问时间:2018-3-21 23:30 /
STM32F030F4 P6芯片用内部时钟。 想用滴答延时函数做。2.5kHz pwm波形。现在滴答延时函数搞不定,希望高手提供个例子。
赞
0
收藏
0
评论
12
分享
发布时间:2018-3-21 23:30
举报
请先
登录
后回复
12个回答
feixiang20
回答时间:2018-3-21 23:58:00
a0a.1 32b0c
要不去看看“STM32滴答时钟也就是SYSTICK做精确的延时函数”这个文章,有代码
评分
参与人数
1
蝴蝶豆
+2
收起
理由
zero99
+ 2
查看全部评分
赞
0
评论
回复
支持
反对
wenyangzeng
回答时间:2018-3-22 07:29:17
a0a.1 32b0c
st官方的例程很多呀
systick(åºå½æ°ï¼.rar
(1.15 MB, 下载次数: 3)
2018-3-22 07:28 上传
点击文件名下载附件
评分
参与人数
1
蝴蝶豆
+2
收起
理由
zero99
+ 2
查看全部评分
赞
0
评论
回复
支持
反对
wudianjun2001
回答时间:2018-3-22 08:15:28
a0a.1 32b0c
官方有相关的例程的,
赞
0
评论
回复
支持
反对
黑皮男
回答时间:2018-3-22 08:44:05
a0a.1 32b0c
官方HAL_Delay
赞
0
评论
回复
支持
反对
Inc_brza
回答时间:2018-3-22 09:31:40
a0a.1 32b0c
论坛里有相关链接,楼主可搜
https://www.stmcu.org.cn/module/ ... p;highlight=systick
https://www.stmcu.org.cn/module/ ... p;highlight=systick
评分
参与人数
1
蝴蝶豆
+2
收起
理由
zero99
+ 2
查看全部评分
赞
0
评论
回复
支持
反对
STM1024
回答时间:2018-3-22 09:51:18
a0a.1 32b0c
直接贴代码,基于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;
}
复制代码
评分
参与人数
1
蝴蝶豆
+2
收起
理由
zero99
+ 2
查看全部评分
赞
0
评论
回复
支持
反对
七哥
回答时间:2018-3-22 09:59:20
a0a.1 32b0c
本帖最后由 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延时。
评分
参与人数
1
蝴蝶豆
+3
收起
理由
zero99
+ 3
查看全部评分
赞
0
评论
回复
支持
反对
Tcreat
回答时间:2018-3-22 10:05:43
a0a.1 32b0c
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
查看全部评分
赞
0
评论
回复
支持
反对
埃斯提爱慕
回答时间:2018-3-22 10:37:37
a0a.1 32b0c
提示:
作者被禁止或删除 内容自动屏蔽
赞
0
评论
回复
支持
反对
maxtch
回答时间:2018-3-22 13:36:03
a0a.1 32b0c
http://github.com/SushiBits/DAP4 ... r/system/src/time.c
评分
参与人数
1
蝴蝶豆
+2
收起
理由
zero99
+ 2
查看全部评分
赞
0
评论
回复
支持
反对
butterflyspring
回答时间:2018-3-22 13:57:19
a0a.1 32b0c
cubeMx生成的代码都有呀..
评分
参与人数
1
蝴蝶豆
+2
收起
理由
zero99
+ 2
查看全部评分
赞
0
评论
回复
支持
反对
fjlmnb456
回答时间:2018-3-22 22:51:16
a1024a.1 32b0c
谢谢指教
赞
0
评论
回复
支持
反对
所属标签
相似问题
关于
意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表
评分
查看全部评分
评分
查看全部评分
https://www.stmcu.org.cn/module/ ... p;highlight=systick
https://www.stmcu.org.cn/module/ ... p;highlight=systick
评分
查看全部评分
评分
查看全部评分
默认的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延时。
评分
查看全部评分
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;
}
评分
查看全部评分
评分
查看全部评分
评分
查看全部评分