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

2019-07-20 22:29发布

本帖最后由 warship 于 2018-7-29 22:30 编辑

有不少初学者对delay_init()函数犯晕,但每一个程序都绕不开,由于原子的例程里因为想兼容操作系统,搞了很多的宏条件,也难怪初学者难以读懂,
其实不光是初学者,说实在的,我没有用到OS,看着这个函数也头大(其实也是没有完全搞懂)
这两天看了一下,撇开对OS的支持(我想绝大多数的STM32初学者都不会上来就用OS的),
这个函数可以简单到只有两行。如下即可:

void delay_init(void)
{
  SysTick->LOAD=9000-1;    //装载值设定为9*1000-1=8999  即每ms中断一次
  SysTick->CTRL|=3;           //开启SYSTICK并允许中断
}


怎么样,简单吧?
你用它替换掉原子的函数,我保证能用。
楼下我会详细解释一下.

哦,对了,
忘记提示一句: 使用库函数编程的同学,也是一样可用的。
直接替换掉原函数就可以了。
其实使用库函数编程还是有优势的,看到寄存器编的代码可以直接拿来就用,
而使用寄存器编程的同学,临时想调用库函数就真的不是那么容易了,哈哈。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
49条回答
Sun311
1楼-- · 2019-07-23 06:52
 精彩回答 2  元偷偷看……
dujq
2楼-- · 2019-07-23 09:15
膜拜大神,好多天没来了,看到大神这么多帖子,够我看一阵了。
warship
3楼-- · 2019-07-23 09:22
 精彩回答 2  元偷偷看……
天天mdk
4楼-- · 2019-07-23 14:57
请大神讲讲这个  SysTick->LOAD=9000-1;    //装载值设定为9*1000-1=8999  即每ms中断一次 这里把,如果初始化给1ms中断一次,那我delay_us()函数是不是没法用了啊?麻烦给讲一下,这里不太明白
warship
5楼-- · 2019-07-23 19:57
本帖最后由 warship 于 2018-9-13 21:42 编辑
天天mdk 发表于 2018-9-12 22:33
请大神讲讲这个  SysTick->LOAD=9000-1;    //装载值设定为9*1000-1=8999  即每ms中断一次 这里把,如果初 ...

SysTick的默认时钟为系统时钟8分频,对于72M的系统来说,8分频后就是9MHz
即时间节拍为1/9M(秒)=1/9000(毫秒), 我们要每ms中断一次,当然就要计数9000次了。
所以设定装载值为9000。
中断是不会影响延时时,延时函数的具体实现过程已经考虑到这一点了。最新的delay请关注https://github.com/ShuifaHe/STM32/blob/delay/delay.c
zhaosansan
6楼-- · 2019-07-23 21:24
 精彩回答 2  元偷偷看……

一周热门 更多>