你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
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, 下载次数: 4)
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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表
评分
查看全部评分
评分
查看全部评分
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;
}
评分
查看全部评分
评分
查看全部评分
评分
查看全部评分