我的单片机方法论2之STM32单片机特别篇

我的单片机方法论之二

STM32单片机特别篇

Write by zzw YanJun.tech

由于这段时间确实挺忙,当然也由于自己的拖延症,我的这篇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:野火和战舰等stm32书籍仅仅是作为参考,我现在感觉他们的代码都不是那种很整洁,很舒服的代码,看着可能感觉有点乱,我目前基本只看《中文参考手册》《固件库参考手册》

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

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

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

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

猜你喜欢

转载自blog.csdn.net/zzw5945/article/details/54784039
今日推荐