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

发布者:数字狂想最新更新时间:2018-06-15 来源: eefocus关键字:单片机  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.(秘籍使用)

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

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

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

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

废话不多说,下面进入正题1234

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页。12

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

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

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

下面分析代码:

这里写图片描述

这个是串口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:云盘搜索引擎,非常好用。找资料,非常非常方便。


关键字:单片机  STM32 引用地址:我的单片机方法论2之STM32单片机特别篇

上一篇:软件定时器和分时复用的实现
下一篇:stm32-USART1重映射

推荐阅读最新更新时间:2024-03-16 16:05

STM32时钟体系结构
STM32的时钟体系可以直接以图概括(摘自STM32F10X参考手册) 下面就此图做分析 1. STM32输入时钟源 1.1 时钟源的作用 无论是小型单片机还是像STM32这样高级单片机,它们工作的核心都是大规模的时序逻辑电路,而驱动时序逻辑电路的关键则是准确而又稳定的时钟源。它的作用就像小学在操场上做广播体操时候播放的背景音乐,用于协调和同步各单元运行,为时序电路提供基本的脉冲信号。 1.2 STM32时钟源的设计 在51单片机中,一般都外接一个11.0592MHz的晶振,注意,提供时钟的不是晶振,而是RC时钟电路,而晶振只是时钟电路的元件之一。同理,在STM32中,时钟源也是由RC时钟电路产生,与51单片机的区别是区别在于
[单片机]
STM32的exti中断调试遇到一奇怪问题总结
前两日调试EXTI 中断程序,程序很简单抄了网上的范例,起初调试正常,可以正常运行,但我在程序中加入另外的代码后问题出现,表现为中断莫名其妙的开始响应!检查自己的程序,未发现异常,中断部分的设置也没有为题。逐步屏蔽后加入的代码,依据屏蔽的代码不同,单步运行后从不同的位置跳入中断。怪哉怪哉....反复调试若干遍,花费时间2天有余... 百思不得其解之际,又检查了自己的板子,看到BOOT1悬空,心中一动,当初图省事,空了此脚,难不成问题在此? 找了调帽装上,一切正常,吐血.... .....(心里活动省略200字) 原来 虽然boot0置0了,但是boot1还是不能悬空的呀! ------------------------------
[单片机]
入手STM32单片机的知识点总结
本文将以STM32F10x为例,对标准库开发进行概览。主要分为三块内容: · STM32系统结构 · 寄存器 · 通过点灯案例,详解如何基于标准库构建STM32工程 (文末有STM32、物联网开发相关的网盘资料,包括物联网开发从基础到实战、IoT-ARM结构下的各类智能产品的设计、STM32的开发、全国电赛优秀作品分析等,如有需要请自行领取) STM32系统结构 STM32f10xxx系统结构 内核IP 从结构框图上看,Cortex-M3内部有若干个总线接口,以使CM3能同时取址和访内(访问内存),它们是: 指令存储区总线(两条)、系统总线、私有外设总线。 有两条代码存储区总线负责对代码存储区(即 FLASH 外设)的
[单片机]
Freescale 9S12 系列单片机应用笔记(SCI)3
这次介绍如何在 uC/OS-II 上实现串口驱动。 /*sci_ucos.h*/ p #ifndef _SCI_RTOS_H_ /p p /p p #define _SCI_RTOS_H_ /p p /p p #define SCI_RX_BUF_SIZE 64 /* Number of characters in Rx ring buffer */ #define SCI_TX_BUF_SIZE 64 /* Number of characters in Tx ring buffer */ /p p /* ******************
[单片机]
AVR微控制器在BLDC电机控制中的应用
引言 许多汽车应用,包括从最小的阀门到笨重的座椅,都含有运动部件,而速度可能从每分钟数十转到数千转不等。一直以来,有刷电机在汽车应用中占主导地位,因为它们成本低,而且只需简单的继电器就能加以控制。不过,有刷电机较重,而且电刷会产生噪声和电火花,并会随着使用时间的增加而磨损。 现代汽车中电机的数量在不断增加,因此制造商需要体积更小更轻、转矩和速度更高并受到精确控制的电机。防倾斜(anti-pitch)车窗升降电机就是一个很好的示例,其他还有刹车和转向助力、通风、冷却,以及推拉门等应用。另外,进气和涡轮增压器控制则是比较新颖的领域,这时电机及其控制器可能处于150℃的高温下,远远超过125℃的标准温度。 目
[单片机]
AVR<font color='red'>微控制器</font>在BLDC电机控制中的应用
基于单片机的微波辐射计数控单元设计与实现
  微波辐射计是用微波进行遥感,从而对地物进行探测的微波接收机,在探测大气、海洋、植被和土壤等方面有广泛应用,而数据处理与控制单元作为微波辐射计的重要组成部分,承担了所有的驱动及控制功能,对时序及精度要求十分严格。由于系统对可靠性要求较高,故采用单片机作为220 GHz微波辐射计数控单元的核心,通过精确的时序控制,实现了数据采集、天线控制、状态提取、串口通信等功能。同时,该数控单元具有功耗低,采样精度高,接口简便等特点。    1 系统结构   微波辐射计结构框图如图1所示,由检波器输出的模拟信号通过数控单元实现数据采集及传输、显示与数据处理等功能,并对系统时序、上下电等进行控制,在辐射计的设计中处于重要位置。    1
[单片机]
单片机开发中的几个基本技巧
在单片机应用开发中,代码的使用效率问题、单片机抗干扰性和可靠性等问题仍困扰着.现归纳出单片机开发中应掌握的几个基本技巧. 1、如何减少程序中的bug.对于如何减少程序的bug,应该先考虑系统运行中应考虑的超范围管理参数如下.物理参数:这些参数主要是系统的输入参数,它包括激励参数、采集处理中的运行参数和处理结束的结果参数.资源参数:这些参数主要是系统中的电路、器件、功能单元的资源,如记忆体容量、存储单元长度、堆叠深度.应用参数:这些应用参数常表现为一些单片机、功能单元的应用条件.过程参数:指系统运行中的有序变化的参数. 2、如何提高C语言编程代码的效率.用C语言进行单片机程序设计是单片机开发与应用的必然趋势.如果使用C编程时,要
[单片机]
瑞萨科技:层层重阵布局中国市场
  “中国市场很大,光凭我们的力量是不够的,今后如何与本地的厂商合作,扩大覆盖范围,对我们来说是一个大问题。”在日前的瑞萨技术论坛上,瑞萨科技MCU综合本部部长武部秀治不无感慨的说。   确实,发展中的中国半导体市场确实因其远高于世界平均增长率的速度在快速成长,也着实吸引了不少国外厂商的目光。据Gartner 2007年5月的调查显示,中国市场已经占据了全球半导体市场30%的市场份额,今后也将牵引全球市场的增长。其中在瑞萨所重点关注的MCU领域,2010年预计将是2006年的1.5倍。   面对如此诱人的市场,瑞萨当然也不会放松。从2007年1月瑞萨开始统一的在中国“安营扎寨”,实施一体化运营,着手推动中国事业新体制。同时
[焦点新闻]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved