OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
12
返回列表 发新帖
楼主: warship

有不少初学者对delay_init()函数犯晕,其实这个函数可以简单到只有两行

  [复制链接]

32

主题

1938

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4258
金钱
4258
注册时间
2018-5-11
在线时间
885 小时
 楼主| 发表于 2018-12-16 15:11:11 | 显示全部楼层
yzelec 发表于 2018-12-16 15:06
如果需要精确的延时,用定时器做。如果不需要精确的延时,软件延时就够了,for ...  nop...解决问题。反正 ...

好,有个性
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
正点原子逻辑分析仪DL16劲爆上市
回复 支持 反对

使用道具 举报

0

主题

12

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
265
金钱
265
注册时间
2017-1-8
在线时间
118 小时
发表于 2018-12-16 15:23:03 | 显示全部楼层
我做了两个延时程序,delay_ms(),delay_us(); 以1ms\1us为时间单位。把它写到芯片里,延时输出一个脉冲,用示波器检查脉冲间隔时间, for....,nop....,调节nop的数量,差不多是1ms/1us就行了,最终用法:delay_ms(20),就是延时20ms了,简单吧,不占用任何资源
回复 支持 反对

使用道具 举报

32

主题

1938

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4258
金钱
4258
注册时间
2018-5-11
在线时间
885 小时
 楼主| 发表于 2018-12-16 16:31:50 | 显示全部楼层
yzelec 发表于 2018-12-16 15:23
我做了两个延时程序,delay_ms(),delay_us(); 以1ms\1us为时间单位。把它写到芯片里,延时输出一个脉冲,用 ...

https://github.com/ShuifaHe/STM32/blob/delay/delay.c
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

0

主题

12

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
265
金钱
265
注册时间
2017-1-8
在线时间
118 小时
发表于 2018-12-16 19:44:25 | 显示全部楼层
warship 发表于 2018-12-16 16:31
https://github.com/ShuifaHe/STM32/blob/delay/delay.c

支持,没必要把简单的问题搞复杂了
回复 支持 反对

使用道具 举报

32

主题

1938

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4258
金钱
4258
注册时间
2018-5-11
在线时间
885 小时
 楼主| 发表于 2018-12-16 20:24:30 | 显示全部楼层
yzelec 发表于 2018-12-16 19:44
支持,没必要把简单的问题搞复杂了

要区分需求,不能一成不变。
所以我两种延时都有,并且都会用到。
你说的软延时是通常情况下的一种纯等待延时。
这种延时一般适用于串行的、无中断干扰的延时,
被中断插入后延时就会变长不可控。
尤其MS级以上的延时可能会被中断服务多次强插,
延时变长后,对时序要求高的情况下就不可取了。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

0

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2018-6-17
在线时间
57 小时
发表于 2018-12-21 08:14:53 | 显示全部楼层
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2018-12-12
在线时间
1 小时
发表于 2019-3-8 11:46:56 | 显示全部楼层
喜欢看楼主的文章,通俗易懂
回复 支持 反对

使用道具 举报

1

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2010-12-14
在线时间
65 小时
发表于 2019-3-17 11:24:58 | 显示全部楼层
楼主高,精彩!
回复 支持 反对

使用道具 举报

12

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
138
金钱
138
注册时间
2018-1-21
在线时间
46 小时
发表于 2019-4-1 21:27:03 | 显示全部楼层
warship 发表于 2018-7-31 10:27
谢谢指教,硬件是死的,人是活的,我3楼提供的延时函数可轻松达到5分钟以上

你好,楼主,原子不是通过repeat的方式了吗?那为什么还存在1.86秒的最大限制呢?
回复 支持 反对

使用道具 举报

0

主题

14

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2018-11-15
在线时间
14 小时
发表于 2019-4-6 19:23:45 | 显示全部楼层
warship 发表于 2018-7-29 21:30
所谓的delay_init()即延时初始化,就是对系统滴答定时器的初始化,
初始化后就可以利用它来进行延时。
...

你好,我用的你的延时程序,为什么实际效果是1s延时了,可是在keil调试看左侧的sec的变化是7左右呢?
回复 支持 反对

使用道具 举报

0

主题

14

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2018-11-15
在线时间
14 小时
发表于 2019-4-6 19:29:13 | 显示全部楼层
本帖最后由 姜波 于 2019-4-6 19:30 编辑

你好,我用的你的延时程序,为什么实际效果是1s延时了,可是在keil调试看左侧的sec的变化是7左右呢?
1.jpg
回复 支持 反对

使用道具 举报

0

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2019-4-9
在线时间
7 小时
发表于 2019-4-10 18:50:10 | 显示全部楼层
我觉得最简单的解决办法是:
void delay_100ms(__IO u16 nms)
{
        u16 i;
        for(i=0;i<nms;i++)
        {
        delay_ms(100);
        }
}
稍微改改延时100年都行
回复 支持 反对

使用道具 举报

3

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2019-5-8
在线时间
27 小时
发表于 2019-5-16 16:16:57 | 显示全部楼层
兄弟  ,CPU主频16M也可以用吗?
回复 支持 反对

使用道具 举报

32

主题

1938

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4258
金钱
4258
注册时间
2018-5-11
在线时间
885 小时
 楼主| 发表于 2019-5-16 21:45:15 | 显示全部楼层
hope0116 发表于 2019-5-16 16:16
兄弟  ,CPU主频16M也可以用吗?

当然可以,
修改RCC的PLLXTPRE位为1,
即二分频,
其它不用变。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

3

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2019-5-8
在线时间
27 小时
发表于 2019-5-16 22:20:14 | 显示全部楼层
warship 发表于 2019-5-16 21:45
当然可以,
修改RCC的PLLXTPRE位为1,
即二分频,

能把源码发我一份吗?感激不尽,445706233@qq.com
回复 支持 反对

使用道具 举报

32

主题

1938

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4258
金钱
4258
注册时间
2018-5-11
在线时间
885 小时
 楼主| 发表于 2019-5-16 23:08:57 | 显示全部楼层
hope0116 发表于 2019-5-16 22:20
能把源码发我一份吗?感激不尽,

你是用的晶振频率是多少?为什么不用8M的呢?
如果用16兆的晶体,那最后系统主频只有16M,
难道不是太浪费了吗?
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

3

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2019-5-8
在线时间
27 小时
发表于 2019-5-17 09:33:01 | 显示全部楼层
warship 发表于 2019-5-16 23:08
你是用的晶振频率是多少?为什么不用8M的呢?
如果用16兆的晶体,那最后系统主频只有16M,
难道不是太 ...

外部是8M。倍频到16M。主要是要降低功耗,所以不得不在16M上调试
回复 支持 反对

使用道具 举报

32

主题

1938

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4258
金钱
4258
注册时间
2018-5-11
在线时间
885 小时
 楼主| 发表于 2019-5-17 10:07:26 | 显示全部楼层
hope0116 发表于 2019-5-17 09:33
外部是8M。倍频到16M。主要是要降低功耗,所以不得不在16M上调试

把你的代码发给我,我帮你看看。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

32

主题

1938

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4258
金钱
4258
注册时间
2018-5-11
在线时间
885 小时
 楼主| 发表于 2019-5-17 10:23:59 | 显示全部楼层
otto1230 发表于 2019-4-10 18:50
我觉得最简单的解决办法是:
void delay_100ms(__IO u16 nms)
{

这么做当然可以,
不过,这不是还要增加一个函数吗?
本来在delay_ms()函数里能够解决的。

我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

1

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2019-4-12
在线时间
30 小时
发表于 2019-5-17 11:26:53 | 显示全部楼层
那是真的牛逼
回复 支持 反对

使用道具 举报

3

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2019-5-8
在线时间
27 小时
发表于 2019-5-17 13:40:31 | 显示全部楼层
warship 发表于 2019-5-17 10:07
把你的代码发给我,我帮你看看。

我确认问题了 应该是其他的中断导致延时不准,我把其他程序屏蔽,只跑6050的。就可以读到数据,准备用tim2定时器来做延时
回复 支持 反对

使用道具 举报

1

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
175
金钱
175
注册时间
2016-7-24
在线时间
21 小时
发表于 2019-5-26 22:09:26 | 显示全部楼层
除了膜拜,就是学习咯!
回复 支持 反对

使用道具 举报

10

主题

293

帖子

0

精华

高级会员

Rank: 4

积分
623
金钱
623
注册时间
2019-6-3
在线时间
107 小时
发表于 2019-6-5 15:34:07 | 显示全部楼层
太厉害了,这应该把底层函数熟练掌握了。自己编写。厉害厉害
回复 支持 反对

使用道具 举报

18

主题

116

帖子

0

精华

高级会员

Rank: 4

积分
510
金钱
510
注册时间
2018-6-7
在线时间
103 小时
发表于 2019-7-16 10:20:39 | 显示全部楼层
厉害,楼主
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2019-4-29
在线时间
15 小时
发表于 2020-2-22 10:01:01 | 显示全部楼层
能不能教下stm32f103rct6 延时1分钟
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2019-9-9
在线时间
15 小时
发表于 2020-5-26 08:46:23 | 显示全部楼层
大神我好崇拜你
回复 支持 反对

使用道具 举报

9

主题

120

帖子

0

精华

高级会员

Rank: 4

积分
700
金钱
700
注册时间
2020-5-11
在线时间
67 小时
发表于 2020-8-30 08:56:40 | 显示全部楼层
学习了
回复 支持 反对

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
发表于 2020-8-31 17:41:34 | 显示全部楼层
学习了,请教是不是delay_ms()这个函数延时时间和外部晶振以及倍频有关,STM32CUBE里面需要设置晶振和倍频,如果用你的代码,前提是不是外部晶振8M,9倍倍频?
回复 支持 反对

使用道具 举报

4

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2020-8-28
在线时间
37 小时
发表于 2020-9-9 11:47:54 | 显示全部楼层
不知道为啥,我用在我的程序上运行,在线调试在延时5ms里面出不来,直接run的话在command窗口一直显示刷cannot access memory
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2021-3-27
在线时间
1 小时
发表于 2021-3-27 16:07:19 | 显示全部楼层
感谢大佬
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2018-9-27
在线时间
41 小时
发表于 2021-9-16 17:06:35 | 显示全部楼层
mark... ...
回复 支持 反对

使用道具 举报

5

主题

80

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
412
金钱
412
注册时间
2020-8-25
在线时间
76 小时
发表于 2021-9-18 16:05:54 | 显示全部楼层
warship 发表于 2018-8-6 22:11
完全改写自库函数SystemInit的版本(备查)
void delay_init(void)
{

学习,好东西啊
回复 支持 反对

使用道具 举报

32

主题

1938

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4258
金钱
4258
注册时间
2018-5-11
在线时间
885 小时
 楼主| 发表于 2022-4-2 08:16:59 | 显示全部楼层
过来学习一下自己4年前研究的东东。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

16

主题

416

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2380
金钱
2380
注册时间
2018-11-8
在线时间
410 小时
发表于 2022-4-2 13:50:12 | 显示全部楼层
你这个延时函数开了systick的中断 如果不需要延时时 它岂不是也一直在进中断?这里不会有问题吗?
另外原子是先计算好一次延时的时间然后交给systick去计时 你这个是让它一直计时 只不过延时是通过两次计数值的差值来体现的 相当于一个秒表初值是0
原子那个复杂 也是迫不得已 既想自己操作systick 还不能干扰操作系统对于systick的使用 如果扒掉操作系统的部分感觉本质上没什么区别呢
回复 支持 反对

使用道具 举报

1

主题

18

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2017-4-25
在线时间
8 小时
发表于 2022-4-4 21:07:54 | 显示全部楼层
学习了哈哈
回复 支持 反对

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2022-1-11
在线时间
17 小时
发表于 2022-7-29 15:22:32 | 显示全部楼层
楼主我用的你的延时函数为MLX90640中IIC通信的延迟函数,但是我再使用的时候发现在IIC_Start中第一个delay_us(4)结束时程序直接跳转到硬件错误中断,请问这是为什么呢?另附工程文件

MLX90640 v0.1.zip

6.67 MB, 下载次数: 2

回复 支持 反对

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2022-1-11
在线时间
17 小时
发表于 2022-7-29 15:23:00 | 显示全部楼层
遇到困难睡大觉 发表于 2022-7-29 15:22
楼主我用的你的延时函数为MLX90640中IIC通信的延迟函数,但是我再使用的时候发现在IIC_Start中第一个delay_ ...

求楼主解答
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2022-5-2
在线时间
10 小时
发表于 2022-7-29 21:11:44 | 显示全部楼层
有道理
回复 支持 反对

使用道具 举报

32

主题

1938

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4258
金钱
4258
注册时间
2018-5-11
在线时间
885 小时
 楼主| 发表于 2022-7-30 13:09:54 | 显示全部楼层

不大可能是延时函数的问题,
最近不太研究这个,
一时可能进入不了情况,
我长期稳定使用的延时函数是这样的,
你可以参考一下。
////微秒延时函数:
////本函数仅反复读取SYSTICK的当前值,直到给定的延时时间到达, 不影响SYSTICK的自动重装,也不影响其中断
////即使在延时过程中发生中断,只要中断服务耗时不超出1ms, 都不会影响本函数的延时精度
////nus:0~2^32/fac_us=4294967296/9=477,218,588 高达4.7亿微秒                                                                             
void delay_us(u32 nus)
{               
        u32 ticks;
        u32 told,tnow,tcnt=0;
        u32 reload=SysTick->LOAD;   //reload中保存原1ms装载的值                     
        ticks=nus*fac_us;           //需要延时的节拍数
  //        ticks=nus*9;           //需要延时的节拍数       
        tcnt=0;
        told=SysTick->VAL;          //刚进入时的计数器值
        while(1)
        {
                tnow=SysTick->VAL;        //当前计数值
                if(tnow!=told)            //如果计数值有变化, 则(这里注意一下SYSTICK是一个递减的计数器就可以了):
                {            
                        if(tnow<told)    //一般情况, 计数器递减了, 则累计经历的节拍数
                                tcnt+=told-tnow;               
                        else             //有溢出的情况, 计数值变大了, 则累计时要增加满载值  
                                tcnt+=reload-tnow+told;            
                       
                        told=tnow;      //每次累计后, 将当前值变成基础旧值
                        if(tcnt>=ticks)break;   //累计节拍数大于/等于需要延迟的节拍数,即延时时间到达, 则退出本函数.
                }  
        }        
}


//毫秒延时函数:
//将给定的延时毫秒数乘以1000后直接调用微秒延时函数
//nms:0---2^32/1000/fac_us=47万毫秒  
void delay_ms(u32 nms)
{                                    
  delay_us((u32)(nms*1000));                                        //直接调用delay_us函数进行延时  
}
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2022-1-11
在线时间
17 小时
发表于 2022-7-30 22:59:51 | 显示全部楼层
warship 发表于 2022-7-30 13:09
不大可能是延时函数的问题,
最近不太研究这个,
一时可能进入不了情况,

我就是用的楼主你发的这个,那我再排查一下,感谢楼主
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-3-29 02:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表