本帖最后由 墨染青衫 于 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种情况。相关情况注释上写的比较明白: /* 如果选择分组为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:云盘搜索引擎,非常好用。找资料,非常非常方便。 |