OpenEdv-开源电子网

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

【我来发帖】我学单片机的一些心得经验分享

[复制链接]

8

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2015-5-3
在线时间
18 小时
发表于 2017-2-8 15:50:41 | 显示全部楼层 |阅读模式
本帖最后由 墨染青衫 于 2017-2-8 16:03 编辑

很久没来原子哥的论坛发帖了,之前一段时间偶尔也在csdn上写写博客。本人呢,也算是靠的原子哥的资料入的门,所以原子哥也算是咱老师啦。今天先水一贴,以后再在csdn写博客的时候,原子论坛也一并发布。(ps:我博客是写在Word里的,容易复制粘贴。一般人我不告诉他 hiahia),附件啥的在csdn上,不用积分,就能下载。有csdn连接,原子哥不会屏蔽吧

代码目前还不规范,开学后我所分享的代码争取将统一为MISRA编程规范。

下面本人抛砖引玉,写写我学stm32单片机的一点心得体会。

我的单片机方法..论之二

STM32单片机特别篇

Write by zzw

由于这段时间确实挺忙,当然也由于自己的拖延症,我的这篇STM32单片机学习心得迟迟没有动笔。年初三下午,有点无聊开始写起吧由于一直没网,就没发。2016.12.30书,2017.1.7发

第一篇文章是一篇概论,写的比较概括笼统的。文章总结到学单片机的八重心法,六大秘籍。建议大家先看一下,详情见链接:

http://blog.csdn.net/zzw5945/article/details/53868643

今天我们就STM32单片机几大秘籍说起,本文结构如下:

1、STM32单片机的简介(各种系列简介)

2、STM32单片机的几大秘籍简介(3.5固件库手册、中英文参考手册等)

3、STM32单片机空白模板工程

4、STM32秘籍使用范例之串口DMA(秘籍使用)

5、STM32芯片选型神器简介以及HAL库使用简介(STM32CUBE软件)

6、一些心得经验总结

声明:本人大三能力有限,若有不正确的地方请大家留言指正,谢谢!

在正式写之前,先废一段话:之前了解过不少师弟,是如何学单片机的,自我感觉他们路子不对。很多人写程序,竟然是简单的复制、粘贴别人的代码。复制粘贴也就算了,有的竟然把排版、注释等还搞的参差不齐乱七八糟。这样看起来不费劲吗?网上没有的代码,是不是基本上就没法写了?本人也从小白一路走来,感觉也踩过不少坑。这里给大家几点学单片机的建议:

a) 学习单片机要能吃苦

b) 别人的代码,不要直接复制粘贴!自己读懂,然后自己写,整理一份自己的代码库,以后直接抄自己的。切忌复制粘贴别人的

c) 代码最起码,搞得整齐点吧,不要乱七八糟的。

d) 很多库函数使用方式是相似的,要拨开云雾见本质,抓住相似点。

e) 有一定代码量以及项目经验后,一定要去多看看书去继续学习。因为仅仅是单片机的话,门槛太低了。

f) 不要满足于搬砖的活,没有技术含量的活。

一、STM32单片机简介

STM32单片机有多个系列如F1、F4、F7、L1等系列。其中我常用的是STM32F103系列,F103又分多种不同资源的芯片,这个是基于Contex-M3内核的。F101是标准型速度是36MHZ F103是增强型,速度为72MHZ,还有互联型的应该是F105,和联网有关的,没具体使用过。F4用过F407芯片,和F1区别不是特别大,速度为168MHZ是F103的两倍多,然后又比F1多了几个功能。L系列应该是低功耗的,也没使用过。

本人比较懒,这部分大家自己百度,找资料吧。。。。。。。

二、STM32单片机的几个武功秘籍

l 《STM32固件库使用手册》基于3.5固件库

l 《STM32中文参考手册》以及《STM32英文参考手册》

l 《Cortex-M3权威指南(中文)》

l 3.5.0固件库源码

l 学会keil中鼠标右键Go to definition看底层代码(配合手册)

这几个是常用的,好用的,然后 可以再参考着原子的资料。《3.5固件库参考手册》中有3.5库函数的相关解释以及使用说明,遇到不懂的函数,直接去手册中查找,很是方便。《STM32中文参考手册》和英文参考手册互补着看,中文有时候翻译的有错误,我就发现过一两次错误呢。这个资料书是介绍STM32单片机硬件资源的书。而《Contex-M3权威指南》是介绍Context-M3内核相关知识的书,比如滴答定时器和NVIC等都是这本书中介绍的。3.5固件库源码,这个里面有官方提供的各种硬件资源的samples,可以作为你写程序的参考。

三、STM32单片机空白模板

其实自己直接建工程,挺复杂、麻烦的。同时这又是搬砖的活,没必要记住,我就从头开始建过几次32工程,之后就直接复制粘贴之前自己建好的配置好的工程模板。

下面给大家简单介绍下本人的工程模板。

APP-是我的算法纯软件文件所在目录

CORE-是我的内核文件和启动文件所在目录

DOC-是我的readme.txt文件所在目录

HARDWARE-是我的与硬件相关的文件所在目录

OBJ-是编译生成的中间文件

PROJECT-是工程文件所在目录

FWLIB-是我的库文件所在目录

SYSTEM-是我的常用的几个文件(滴答定时器、软件延时、系统全局文件)

USER-是我的main.c所在文件以及其他相关头文件。

如下图:system中有sys.c systick.c和delay.c文件,sys.c对应的.h文件有一系列全局用到的资源。而滴答定时器文件则是参考Context-M3权威指南中的滴答定时器写的。

本人建议大家,自己建立一份自己习惯的空工程模板,以后都直接复制粘贴自己的。(把里面别人写的 非官方的 都copy成自己的)

本人的空工程模板见下面链接:
http://download.csdn.net/detail/zzw5945/9748751

四、STM32范例之串口DMA.(秘籍使用)

接下来实例带大家看看推荐的那几本秘籍怎么用,下面这些可能有点难度了,对于小白新手可能不能理解,下面所述过程仅仅是想带大家一起看看那几本工具书如何使用。授之以鱼不如授之以渔,只要大家学会使用工具书,那么整个单片机应该是不难啃下来的。这里默认大家已经有点点单片机基础了。

大家一定要跟着我的节奏自己去翻手册!

大家一定要跟着我的节奏自己去翻手册!

大家一定要跟着我的节奏自己去翻手册!废话不多说,下面进入正题

4.1.1、首先复制一份自己的空工程模板,到固定文件夹

4.1.2、接着打开《STM32中文参考手册》和《3.5固件库参考手册》,找到《STM32中文参考手册》的第十章也就是DMA控制器章节。

首先看看主要特性:

1、说的是有2个DMA,每个DMA都有各自的通道,每个通道对应相应外设

2、DMA请求可以设置优先级(多个DMA请求同时发生时,进行仲裁),特性上简单说了4级优先级。

3、可以循环传输,可以单次传输

4、有3个事件能产生中断请求。图上有自己看

5、存储方向可以是存储器到存储器,存储器到外设,外设到存储器方式。

6、一次可传输的最大数据数目为65536字节

以上即为特性所获得的基本信息。咱们继续往下看:

看到上面这个框图,在手册的第143页,框图实际是反映了使用DMA和不使用DMA时数据的存取流程的。具体请参见我以前分析的一篇文章:(个人理解的)

另外看一下APB1和APB2这两个外设总线上挂载的外设。这里大家就能明白了,到底什么时候使能什么外设的时钟,都是在手册中能查到的。当前范例我们使用的是USART1串口1.如下:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

使能的是USART1同步异步串口,它是挂载在APB2上面的,所以就调用相应的库函数参数使能APB2下面的这个外设。这些东西是死的,可以直接复制粘贴,但是前提是你得明白这是啥意思,为啥这么做。

继续看上面的图:

最下面那些东西是啥?那是官方给你的注意事项,有时候是一些很重要的提示说明。所以很重要的。咱们继续看手册,let’s go

10.3.1和10.3.2讲的是DMA请求同时发生的仲裁,也就是优先级问题。自己看吧,在P144页。

DMA通道,这个讲的是相关寄存器的配置,我们一般情况下使用的是库函数,寄存器偶尔会用,所以了解即可,稍微看看,便于理解后面的代码。

手册的第146页说到了DMA的中断。后面用的时候再说

继续往下看,第147页。看到下面图片内容,各个通道上的外设的DMA请求是通过或门链接的,也就是说同时只能有一个DMA请求。这也是一个重要的信息,也就是如果多个外设公用一个通道,那么只能进行分时复用!

继续往下看,第148页下表

重点来了,也就是我们使用的同步异步串口1是在DMA1的通道4和通道5上。所以这也是我们写程序配置的根据。DMA2不带大家看了,自己翻吧以及后面的寄存器的相关说明,比较烦了,这个我在用的时候,会来查查。

4.1.3串口知识简介

好的DMA的相关知识,我们就看到这里,下面大家和我一起找到手册的串口章节,我的手册是第25章516页。

还是首先看看串口的相关特性,图不发了,自己看吧。

接着简单看看串口的功能简介。

其他的自己简单看看,这里我嫌麻烦了。。。

下面分析代码:

这个是串口1发送DMA中断的NVIC配置。NVIC呢是中断向量分组的意思,可以分配主优先级和和副优先级,具体大家看sys.c中

这里是NVIC的向量分组配置,其实这个函数我又写了一层,没意义,但是我比较懒一直就没改。我在main函数中调用了这个函数,分组为NVIC_PriorityGroup_0 具体意义看上面注释或者右键点击goto denifition 去底层看代码,看注释。这个很好用很好用。

大家看一下,下面这个就是进入底层的代码,关于NVIC向量嵌套分组的详细知识就要看《Context-M3权威指南》了。

上面的英文相信大家基本应该能看懂,各个参数注释上都给了,或者你打开《3.5固件库参考手册》查NVIC然后就能看到相关函数

这里简单给大家介绍一下主优先级(抢占优先级)和副优先级,查看《Context-M3权威指南》上可以知道NVIC公共是留了8个位用于中断向量分组,也就是2^8个结果。但是我们的STM32单片机只使用了其中的4个位用于配置中断向量分组。也就是总共是2^4次方16种情况。相关情况注释上写的比较明白:

/*

  • @arg NVIC_PriorityGroup_0: 0 bits for pre-emption priority

    • 4 bits for subpriority
    • 2^0 = 1个主优先级 2^4 = 16个副优先级
    • @arg NVIC_PriorityGroup_1: 1 bits for pre-emption priority
    • 3 bits for subpriority
    • 2^1 = 2个主优先级 2^3 = 8个副优先级
    • @arg NVIC_PriorityGroup_2: 2 bits for pre-emption priority
    • 2 bits for subpriority
    • @arg NVIC_PriorityGroup_3: 3 bits for pre-emption priority
    • 1 bits for subpriority
    • @arg NVIC_PriorityGroup_4: 4 bits for pre-emption priority
    • 0 bits for subpriority

    */

如果选择分组为NVIC_PriorityGroup_1,也就是主优先级为2个(0和1)副优先级为8个(0.1.2.3.4…… 7)数字越小,优先级越高。


也就是这里的参数配置。

主优先级是:抢占优先级,当一个主优先级较低的中断发生正在执行的时候,发生了一个主优先级高的中断,那么优先级高的中断就能中断当前的任务,去执行优先级高的那个中断,从而实现中断嵌套

副优先级是:仲裁优先级,当两个主优先级一样的中断同时发生时,开始比较副优先级,副优先级高的中断先执行。

这个是接收的串口DMA配置,大家自己看注释吧,不废话了,懒。然后再配合上面看手册所学到的知识和鼠标右键goto definition进底层查看源码,然后自己好好分析。

这里注意使用的是单次传输模式,所以每次传输都需要设置一下长度和目标地址。

因为为单次模式,所以每次使用DMA发送数据的时候,需要调用下面函数进行设置

DMA接收数据只能接收定长数据,然后才能产生DMA接收完成中断,这样存在一个问题,当我DMA接收任意长度的数据的时候,该怎么办?还能使用DMA吗?

对于这个问题,我想到一招:

使用串口空闲中断,来判断是否接收数据完成,这样就能接收到任意长度的数据了。这个还得进底层看注释以及结合《STM32中文参考手册》串口章节进行查看。

每篇博客认真写起来,都太长了,懒了,不想写了。工程见下面链接:
http://download.csdn.net/detail/zzw5945/9748775

再啰嗦两句:

1、 鼠标右键goto definition进底层看注释和代码

2、 学会使用《中文参考手册》等资料书(这里比较懒,都没带大家到《3.5固件库手册》中查各个函数得让细节)

3、 自己去3.5固件库中看看源码,有工程实例的,点开看看吧。

五、选型神器之STM32CUBE

这个软件是意法半导体自己出的,使用起来相当方便,直接配置生成的代码是HAL库的,得查看HAL库手册,和固件库手册,HAL库封装的更加高级。

软件的安装需要安装Java环境,我以前写过Android,所以电脑有,安装起来挺简单的,自己百度下吧,jdk和啥忘了。

上图是STM32RBT6芯片相关资源以及引脚。

上图为STM32F103RCT6芯片的资源图和引脚图。

相比之下,RC和RB都是64引脚的,但是RCT6和144引脚的ZET6资源基本差不多,从图上看出片上外设都比RB资源多。芯片选型的时候,就能参考这个软件。

这个是stm32芯片的时钟树,查看起来也特别的方便。

整个软件是可视化编程风格,只要勾选相关资源,就能直接生成相关代码工程。HAL库的。把一些搬砖的活都给省去了,真的很好用。

六、一些心得经验总结

Exp1:Ctrl+F键 里面的搜索功能非常实用,(搜索文件)找函数,找变量,找宏定义等等非常好用方便。

Exp2:《STM32中文参考手册》和《3.5固件库参考手册》很实用

Exp3:鼠标右键goto definition相当实用

Exp4:整洁的代码,简洁有力的注释十分有用,当积累一定的代码量之后,记得找找相关编程规范的东西看看

Exp5:工程中代码,除固件库底层函数以外,其他函数、文件等都应该是你自己的。复制粘贴都是看懂了,明白原理了,然后改成你自己习惯的格式。

Exp6:学会了使用《中文参考手册》《固件库参考手册》等参考书,就相当于学会了捕鱼。

Exp7:项目中,少用Delay等纯延时,或者滴答定时器写的延时函数。因为CPU一直停在延时函数那里,造成资源的浪费。建议使用的是 中断服务程序,进行任务调度。当然注意中断服务程序中运行的代码的时间 不要超过定时器中断产生的时间。

Exp8:每一个函数的参考资料,最好都标注在注释里面。

Exp9:STM32空白工程模板搞好后,放在一个文件夹下面。以后用的时候,直接复制粘贴出一个新的工程就可以了。

Exp10:云盘搜索引擎,非常好用。找资料,非常非常方便。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2015-5-3
在线时间
18 小时
 楼主| 发表于 2017-2-8 17:06:48 | 显示全部楼层
回复 支持 反对

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2017-2-8 17:18:36 | 显示全部楼层
必须得赞一个啊, 写了这么多!
开往春天的手扶拖拉机
回复 支持 反对

使用道具 举报

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4034
金钱
4034
注册时间
2015-11-14
在线时间
545 小时
发表于 2017-2-8 17:19:41 | 显示全部楼层
顶赞
回复 支持 反对

使用道具 举报

8

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2015-5-3
在线时间
18 小时
 楼主| 发表于 2017-2-8 23:04:04 | 显示全部楼层
自己顶上去
回复 支持 反对

使用道具 举报

56

主题

520

帖子

0

精华

高级会员

Rank: 4

积分
964
金钱
964
注册时间
2014-11-18
在线时间
160 小时
发表于 2017-2-9 08:58:40 | 显示全部楼层
点个赞,我顶。
自己选择的路,成家前走完。
回复 支持 反对

使用道具 举报

1

主题

24

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
415
金钱
415
注册时间
2015-1-16
在线时间
82 小时
发表于 2017-2-9 10:17:37 | 显示全部楼层
给这位好心人,怒赞
回复 支持 反对

使用道具 举报

0

主题

63

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3867
金钱
3867
注册时间
2015-8-26
在线时间
285 小时
发表于 2017-2-9 10:31:32 | 显示全部楼层
这个要顶一下,很用心的样子
回复 支持 反对

使用道具 举报

23

主题

323

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1010
金钱
1010
注册时间
2016-11-8
在线时间
233 小时
发表于 2017-2-9 11:24:31 | 显示全部楼层

支持
亦余心之所善,
虽九死其犹未悔。
回复 支持 反对

使用道具 举报

339

主题

418

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1632
金钱
1632
注册时间
2016-9-29
在线时间
114 小时
发表于 2017-2-9 14:00:30 | 显示全部楼层
必须得赞
回复 支持 反对

使用道具 举报

8

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2015-5-3
在线时间
18 小时
 楼主| 发表于 2017-2-9 22:23:42 | 显示全部楼层
顶一次
回复 支持 反对

使用道具 举报

8

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2015-5-3
在线时间
18 小时
 楼主| 发表于 2017-2-9 22:23:54 | 显示全部楼层
顶一次
回复 支持 反对

使用道具 举报

0

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2017-1-16
在线时间
24 小时
发表于 2017-2-10 03:12:11 来自手机 | 显示全部楼层
感谢墨染青杉的无私分享!
回复 支持 反对

使用道具 举报

8

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2015-5-3
在线时间
18 小时
 楼主| 发表于 2017-2-14 10:24:54 | 显示全部楼层
自己顶起来
回复 支持 反对

使用道具 举报

0

主题

416

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1002
金钱
1002
注册时间
2016-11-25
在线时间
181 小时
发表于 2017-2-14 11:54:25 | 显示全部楼层
顶赞              
回复 支持 反对

使用道具 举报

8

主题

145

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2016-12-14
在线时间
75 小时
发表于 2017-2-16 13:48:42 | 显示全部楼层
dingyixia
回复 支持 反对

使用道具 举报

8

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2015-5-3
在线时间
18 小时
 楼主| 发表于 2017-2-19 10:08:17 | 显示全部楼层
自己顶。。。。。。。
回复 支持 反对

使用道具 举报

3

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
431
金钱
431
注册时间
2016-10-20
在线时间
147 小时
发表于 2017-2-19 14:33:33 | 显示全部楼层
多谢分享,学习了
we can't stop
回复 支持 反对

使用道具 举报

8

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2015-5-3
在线时间
18 小时
 楼主| 发表于 2017-2-19 21:46:16 | 显示全部楼层
SeeMe 发表于 2017-2-19 14:33
多谢分享,学习了

不客气啦~
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-7 22:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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