OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6372|回复: 10

关于跑马灯库函数和寄存器版的一点思考

[复制链接]

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2016-5-29
在线时间
12 小时
发表于 2016-5-29 12:16:59 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 壁虎 于 2016-5-29 13:35 编辑

跑马灯实验是我在32平台上的第一个程序。按照老师的视频,库函数版本很轻松的就完成了。在进行 寄存器版本 的实验时,我使用的是 寄存器新建工程模板 而没有按照视频的要求使用库函数新建工程模板。
按照视频将程序编写完后,LED闪烁时间明显加长。随后我与资料提供的标准 寄存器版本 跑马灯程序进行了对比,发现头文件有区别,同时少写了一句“Stm32_Clock_Init(336,8,2,7);”函数。加上后,程序运行正常。

结合以前的单片机开发经验,我对源码文件夹里的库函数和寄存器版的两个跑马灯程序进行了对比。发现,库函数没有设置时钟就可以正常delay,而寄存器需要进行时钟设置才可以正常delay。这里很不理解。


希望老师、同学们能一起讨论下。


附上两张库函数和寄存器版本的源代码程序。寄存器版的时钟被注释掉后,delay的时间明显加长。
ade27805.jpg     96c0e5cc.jpg

最佳答案

查看完整内容[请看2#楼]

库函数版本的时钟初始化在main函数之前隐式调用了,所以无需显式调用时钟初始化函数。教程里都有,自己看仔细点。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

347

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
2078
金钱
2078
注册时间
2014-12-19
在线时间
710 小时
发表于 2016-5-29 12:17:00 来自手机 | 显示全部楼层
库函数版本的时钟初始化在main函数之前隐式调用了,所以无需显式调用时钟初始化函数。教程里都有,自己看仔细点。
回复

使用道具 举报

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2016-5-29
在线时间
12 小时
 楼主| 发表于 2016-5-30 21:42:37 | 显示全部楼层
难道是我表达的不清楚?
原子给的源代码里,库函数的跑马灯比寄存器版的跑马灯少了一行设置时钟的函数,但是都可以正常delay。程序分析没有发现明显区别。请问寄存器为啥一定要设置始终,而函数不需要
回复

使用道具 举报

6

主题

35

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2016-4-2
在线时间
66 小时
发表于 2016-5-30 22:01:15 | 显示全部楼层
你应该是见工程模版的时候没有想一下把,建固件库工程模版的时候,时钟是在System_stm32f4xx.c 文件和stm32f4xx.h 文件里面设置的,在库函数开发指南里面写的很清楚。而寄存器版本的顾名思义操作都是通过操作寄存器实现的,那么Stm32_Clock_Init(336,8,2,7);这个函数就是操作相应的寄存器,改欲分屏系数等操作。你看看函数原型把,在对比一下库函数里面的就清楚了,最终都是通过操作寄存器实现的,只不过库函数里面都是采用宏定义的区别,,,
应该是这样,希望能帮到你
享受学习中的乐子,做合格的程序猿
回复

使用道具 举报

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2016-5-29
在线时间
12 小时
 楼主| 发表于 2016-5-30 22:20:30 | 显示全部楼层
lvehe 发表于 2016-5-30 21:54
库函数版本的时钟初始化在main函数之前隐式调用了,所以无需显式调用时钟初始化函数。教程里都有,自己看仔 ...

隐式调用??不明白,但是谢谢你的提醒
回复

使用道具 举报

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2016-5-29
在线时间
12 小时
 楼主| 发表于 2016-5-30 22:21:56 | 显示全部楼层
Fighting_Tao 发表于 2016-5-30 22:01
你应该是见工程模版的时候没有想一下把,建固件库工程模版的时候,时钟是在System_stm32f4xx.c 文件和stm32 ...

寄存器的我能理解,但是库函数的时钟是如何设置的,或者具体是哪里设置的我不很明白
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2016-5-31 08:33:51 | 显示全部楼层
随便一个库函数例程全局搜索SystemInit
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

6

主题

35

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2016-4-2
在线时间
66 小时
发表于 2016-5-31 15:03:52 | 显示全部楼层
壁虎 发表于 2016-5-30 22:21
寄存器的我能理解,但是库函数的时钟是如何设置的,或者具体是哪里设置的我不很明白

最终也是操作寄存器的,只是库函数用了很多宏定义。原理是一样的,你到函数体里面看看就知道啦
享受学习中的乐子,做合格的程序猿
回复

使用道具 举报

5

主题

158

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
200
金钱
200
注册时间
2016-5-29
在线时间
5 小时
发表于 2016-5-31 15:08:30 | 显示全部楼层
路过帮顶
回复

使用道具 举报

5

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2016-4-13
在线时间
57 小时
发表于 2016-5-31 15:27:34 | 显示全部楼层
看看库函数版本的函数 void SetSysClock(void)
回复

使用道具 举报

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2016-5-29
在线时间
12 小时
 楼主| 发表于 2016-6-1 21:09:47 | 显示全部楼层
看完第20讲 SystemInit时钟系统初始化函数剖析的内容后,我觉得因为头文件的关系,库函数版的程序会在芯片初始化后,自动完成时钟的配置,不知道我认为的对不对。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 11:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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