STM32开发板(小苗板)资料系列之七——流水灯例程讲解_第1页
STM32开发板(小苗板)资料系列之七——流水灯例程讲解_第2页
STM32开发板(小苗板)资料系列之七——流水灯例程讲解_第3页
STM32开发板(小苗板)资料系列之七——流水灯例程讲解_第4页
STM32开发板(小苗板)资料系列之七——流水灯例程讲解_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、STM32开发板(小苗板)资料系列之七流水灯例程讲解来源:第九单片机论坛通过前面对小苗板资源的介绍、开发环境的说明以及如何下载程序,相信大家对小苗板如何使用已有了基本了解。先前所介绍的开发环境等内容都是最最基础的,也是重要并有用处的,这些基础为后续学习如何利用STM32实现各种功能提供了必不可少的操作环境。在有了以上基础后,我们可以使用开发板来实现一些功能,本章节就以最简单的流水灯为例,实际结果的现象是开发板上四个颜色的流水灯轮流点亮。通过流水灯这个例程,会让大家对STM32的库有一个大体的了解,知道STM32I/O口是如何工作的。一STM32I/O口概述STM32的I/O口有很多种功能,因此

2、被称为GPIO(General-purposeI/O)。GPIO又分为GPIOA、GPIOB、GPIOCGPIOG不同的组,每组端口分为015,共16个不同的引脚,对于不同型号的芯片,端口的组合引脚数量也不同,具体的需要参考相应芯片型号的datasheet。小苗板使用的STM32芯片型号是STM32F103RBT6模拟输入;输入下拉;推挽输出;开漏复用功能。STM32的I/O口可以由软件配置成种模式:输入浮空;输入上拉;开漏输出;推挽式复用功能每个I/O可以自由编程,单I/O口寄存器必须按32位字被访问。STM32的很多I/O口都是5V兼容的,具体哪些I/O口是5V兼容的可以从芯片手册引脚描述

3、章节查到,I/OLevel标FT的就是5V电平兼容的。STM32的每个I/O口都由七个寄存器来控制,分别是:32位端口配置低寄存器GPIOx_CRL;32位端口配置高寄存器GPIOx_CRH;32位端口输入数据寄存器GPIOx_IDR;32位端口输出数据寄存器GPIOx_ODR;32位端口位设置/清除寄存器GPIOx_BSRR;16位端口位清除寄存器GPIOx_BRR;32位端口配置锁定寄存器GPIOx_LCKR。以上7个寄存器可以分为以下4类,其功能概括如下:配置寄存器:选定GPIO的特定功能,例如:选择作为输入还是输出端口。数据寄存器:保存了GPIO的输入电平或将要输出的电平。位控制寄存器

4、:设置某引脚的数据为1或0,控制输出的电平。锁定寄存器:设置某锁定引脚后,就不能修改其配置。详细说明需要查看官方的datasheet。上述寄存器名称上的标号x代表的是AE,表示这些寄存器也和GPIO样,也是分组的。比如GPIOA对应的配置寄存器为GPIOA_CRL和GPIOA_CRH,GPIOB对应的配置寄存器为GPIOB_CRL和GPIOB_CRH,它们都有互不相干的一组寄存器。下面说明下寄存器的配置,以流水灯例程用到的三个寄存器CRL、CRH和BSRR为例,进行简要说明。首先要知道,如果想要控制LED,则需要控制I/OSTM32的I/O口有多种功能,通过给寄存器CRL和CRH配置参数,来实

5、现我们需要的功能。一个I/O口有个16个引脚,CRL配置低8位引脚,CRH配置高8位引脚,一个CRL/CRH有32位,每四位控制一个引脚。小苗板的流水灯例程用到的端口是GPIOC的pin0、pin1、pin2、pin3,以GPI0C_CRL,pin1为例,如图1、图2所示:I出L2i.E3:r:cCCK监口:A03E37:C:;03EJT0LZLC?:O:A03E0:I:C:J1rs13rrio331eJ9p0砒二址I出吐匚址L2i.N0DEl:r:0cktiej:o:AODEer:o:伽工1:0n二:工ACOEI7:C:3155賈芷313919ri飞适祁0乂寸寸釈寸寸寸寸1I憎辍厠叫:000

6、1_)5JaSGM(GblOXCKT)(x=VE)这四位控帀pin1每4位寄存器配置一个引脚图1m:寸ji:je5J:3D=O-J?)(bOLjxs-GipiM)F0位和门6位扌制pin0狂;阿苦M1HL爭基l-R詞卜IRLS迪汕草国Rh圧呂哇由“j;厚曙狷谨即ODM礪护Do:弭舁吵刃CC/HJ士云三鶴唄境齐仲节脾戸/士讨朋打吉疋邺)旳蜜耳怖年53J:jeR:甥燔聲:IX阴匡入(A=DJEbDLfX阴晌p;3?12B2I5B2IIE2J0E2BB20B2AB2SB22B23B23&2TB20727FI?13II10d31G2IDIL生显.扯出迫足生比.比.曲23KI-1FEET7PKTC-BK

7、1BK9BB2B&J3E2BE0njO333S;L詆記讯3j乱37蓟H73二W苴WP000000000押砒樽:QXJO85卫Wnft(eblOX_B3bb)(x=y-E)I图3从上图寄存器BSRR参数设置说明可知,一个引脚(y代表第几个引脚)的输出数据由GPI0 x_BSRR寄存器的2个位来控制分别是BRy(BitResety)和BSy(BitSety),BRy位用于写1清零,使引脚输出低电平;BSy位用于写1置1,使引脚输出高电平。对这两个位都写1来控制,分别实现清零和置1,写零是无效的。(小苗板的流水灯例程是使用BSRR寄存器的,也可以通过设置寄存器ODR来控制引脚。)举例说明:如要控制x

8、端口的pinO引脚,使其输出高电平,则对寄存器GPI0 x_BSRR的第0位(BS0)写1;若使其输出低电平,则对寄存器GPIOx_BSRR的第16位(BR0)写1。二流水灯具体代码分析上面详细介绍了本例程使用到的寄存器该如何操作,让大家对下面将要提到的代码涉及到的参数配置不会感到陌生。关于代码中涉及到的STM32的库的和STM32的时钟系统都会在这一部分说明。先来简单说下STM32的库,在51单片机的程序开发中,如果我们需要使用中断、定时器等工作方式就得直接配置51单片机的寄存器。配置寄存器时,常常需要查看寄存器表,看看需要配置哪些位,是置1还是置0。这些工作对于51单片机来说还是比较简单容

9、易的,但对于拥有丰富外设资源的STM32来说就会很复杂,所以ST公司针对STM32提供了STM32库,在我们需要使用哪些外设时直接调用相应的库就可以,不需要我们自己去配置。下面开始分析流水灯的代码Dm图4是流水灯的电路图:bC3bC3be!bCO图4四个LED连接的是GPIOC的pinO、pinl、pin2、pin3,所以选择的寄存器组标号为C。选择GPIOC实现的功能,配置GPIOC_CRL的0到3引脚。控制LED的亮灭,设置寄存器GPIOC_BSRR的值。用到的库文件:startup_stm32fl0 x_md.sstm32f10 x_conf.hcore_cm3.ccore_cm3.hs

10、ystem_stm32f10 x.cstm32f10 x.hsystem_stm32f10 x.hstm32f10 x_gpio.hstm32f10 x_rcc.hstm32f10 x_gpio.cstm32f10 x_rcc.c用户编写的文件:main.cled.cled.hstm32f10 x_it.c需要的配置库文件下面说一下用到的这些库文件都是有什么作用的。startup_stm32f10 x_md.s是系统启动文件,不同的的芯片型号对应不同的文件。小苗开发板使用的芯片是STM32F103RBT6,所以使用startup_stm32fl0 x_md.s文件。如下图所示。14KB即gqn

11、tT邙山揺口qx一山qfsHKB_2f9kfnb2fLU33|.Jox|qA|5IPKB_即gqnb即山務HoxpqA|sIPKB2H_即gqntT邙山msucix-qpIPKB2_邙gyntr邙山msucix-x岸13KB_5f9kfnb邙山?5UCixLuq513KB2耳枯一-即gqnb即山?5HCix旧它IPKB2_邙gqntT邙山总孔iox-pqscl:互联型产品,stm32fl05/107系列vl:超值型产品,stm32fl00系列xl:超高密度产品,stm32fl01/103系列ld:低密度产品,FLASH小于64kmd:中等密度产品,FLASH=64or128hd:高密度产品,F

12、LASH大于128stm32f10 x.h这个文件主要是把STM32的所有寄存器进行地址映射,如同51单片机reg52.h头文件一样。源文件core.c和头文件core.h是为那些采用Cortex-M3核设计SOC的芯片商设计的芯片外设提供一个进入M3内核的接口。这两个文件在其他公司的M3系列芯片中也是相同的。system_stm32f10 x.c的功能是设置系统时钟和总线时钟。因为所有外设都需要时钟,所以这个文件很关键。并且这个文件在实现系统时钟时需要操作寄存器,寄存器都是以存储器映射的方式来访问的,所有该文件还包含stm32f10 x.h这个头文件。因为流水灯实验使用到I/O口和时钟(每个

13、外设都要配置时钟),所以我们需要在工程中添相应的库文件,它们分别为stm32f10 x_gpio.c和stm32f10 x_rcc.c文件(每个外设都会用的文件)。其中前者是用于操作I/O口,后者用于配置系统时钟和外设时钟。添加完这两个文件后,还需添加与他们相对应的头文件stm32f10 x_gpio.h和stm32f10 x_rcc.h。每个外设库都会有一个与stm32f10 xxx.c文件相对的stm32f10 xxx.h的头文件。该头文件包含了相应外设的C语言函数实现的声明,只有把头文件一起包含到工程中才能使用这些外设库。在库中还有一个文件用来专门管理所有库的头文件,它是stm32f10

14、 x_conf.h。下面是该文件的源码,其中没有用到外设库可以给注释掉。jucyngsijjtbc卩“斗HT&卩丁&血&丁nuGfioua壬口匸piAICsuqaAaircji(sqq-oucoCHSISnuGfioua)*IjtgJnqsacmssJOXriiiqajjil*TncjngsapinaSTOXnarjz-pu*iweynqectki-iJll*ijtgynqsacmssJOX0叶卩“*TncjngsapinaSTOXaqTO卩“*iweynqeu卩“*ijtgynqsacmssJOXEGGJtl*TncjngsapinaSTOXbilEJTU*iweynqeii-iqa-JJl

15、L*ijtgynqsacmssJOXTSGPlltttucJnqsuaciW3SXTQXriI:iTO-Fbb*iweynqe二2应匚罪*ijtgynqsacmssJOX工丁*TncjngsapinaSTOXSXfT-JTbb*iweynqe叩回心*ijtgynqsacmssJOX匚打二|日J.ll二盯Jtl*TncjngsapinaSTOX匚IhUJJU*iweynqeQECIJlL*ijtgynqsacmssJOXQGGJtl*TncjngsapinaSTOXC3ITJTU*iweynqePKbPLL#TUU丁盯叨日些文件3就可以工nlJGOW-IXJGITpCOMXJGITf卩匚TTiJ

16、Gpsyon匚口guzitgqTSijgbGETEiiJGEJdrT卩GqcrtjgTUQTnaTon工、牛工编匚丁nqG文首先把stm32fl0 x_it.c这个文件包含到USER目录下,该文件提供了M3所有中断函数的入口,默认情况下这些中断服务程序为空,等到用的时候需要用户自己编写。然后在工程中新建led.c和led.h两个文件保存到CODE文件夹下,并将led.c添加到工程中。led.c文件中的代码如下:CblOTnifTAbEDSi廿TucinqsECCVbESbSEibTbBSbSEib卩QhlOC1EPlYBrE)牡冒dW凹皆舟B4畀以cbioiurcacEnGcnEG-olion

17、ogs=olionogsonet.t.-X舟克曰們煩耳丫破總徵用以OLIOinTfacEHGfnEE-QblOhTU=CLIObTU0IChIObin11QblOhTU3ICLIObTU3-“琛軽堡宙凹awe日聊以工工工工早工工工BA:裁*审诧社琛丧uipncsTansrrEDif-bcarED3-bCSrEDS-bCT腫甘压煤:FEDT-bCO却黑:朋镇至簞回1ED耳甘尿:TGq-cGbI02sej?BTfa(QblOCQblOtO1CblOSSfBTCa(QblOCQblObTUS)CblOSSfBTCS(CblOCeblObTUT)、GbIO_aG-BTCa(QbI0CQbI0_bTU_

18、o)韬亚阻厲TEDU以GbIO_IUT-(QblOCGbIO_IUT-a-EnG-nEG)坦崔犀圉瓠粗舉烁岛2以GbIO_IUT-a-EnG-nEG-QbIO_abGGq=QbIO_abGGq_20HHE在该文件中定义的函数LED_GPIO_Config()的功能是配置了点亮LED所需的条件。16行代码,GPIO_InitTypeDefGPIO_InitStrueture,这是使用库定义了一个名为GPI0_InitStrueture的结构体,结构体类型为GPI0_InitTypeDef。GblC-initjh&DE_3bIOHoq-j/bDtGbIcF旦13BictBgg旷的&口&t3bic_

19、a&q仃丁GE.IO_bTnpAbcqe匚訂匚工rruGbI0_ID?HJtD6l邮皿I?GblcFEl寸NGhIObnjji1BGhIObnjj513ehIOLnJjjHehIOLnJjo10ehIOLnJ&GBIOLnrg-.8GBIOLnj丹0一酥飞:.QGhIOLnj5卑出長陳2GBIOEnr-+寸GBIOEnJ?GBIOEnJ5算出员陳為ChIObnjj算出员陳IChIObnjo:.0GhIObnjioucCbIOl(nIfpjtIg?CblOLP胞犀尋刪渝爆鼎晶閏obio晶累r岳宙毬蛀坯迪用一滋舞出逵心晶融。宝册底崔上率申旳旺覃番导eBIO_LI口、TTa选择完要使用的引脚后,在后

20、面会有一个函数把这些值进行处理,设置相应的寄存器,就实现了对GPIO端口的配置。24行代码,配置GPIO的引脚模式为推挽输出,使用这个就不需要像先前那样给寄存器每一位赋值了。GLIOIoqe-ODGLIOHoqeonri)bGLIOHoqeonroo出1輙卅GblCf用申Pbr一GblCf用申PbDGiIOI0-ii-LrOIIkCjypjtCbIO_7Ioc6直接向丄面代码中力p样写就可以,不需要再位位赋I且。举个例子,上面表格里的GPIO_Mode_Out_PP即为0 x10,参照前面所讲的寄存器的配置就能够明白了。四种输出模式的主要使用场合推挽输出:一般应用在输出高低电平场合,高电平为3

21、.3V,低电平为0V。开漏输出:一般应用在电平不匹配的场合,如需要5V高电平则需要外接上拉电阻。复用推挽输出:如GPIO引脚用作串口的输出,则使用复用推挽输出。复用开漏输出:如果用在IC、SMBUS这些需要线与功能的复用场合,就使用复用开漏模式。如何一种开漏模式,都需要接上拉电阻。27行代码,是配置GPIO的速率。-:冬/1申-:肓呼-:EZI申31行代码,使用到了一个初始化函数GPIO_Init()。先前涉及到的ST的库文件以及各种各样由ST库定义的新类型都是为库函数服务的。在我们应用库函数的时候,只需要知道它的功能及输入参数的类型,允许的参数且就可以了,这些都可以通过查找库的帮助文档获得。

22、如下图所示。H2(m331:T0X_flb!OCJA3nl/IOUG姿画卑:C0U|.ianL9fl0UIU|.0LLU3fl0UJ.OLfp62bSCIJ.ISqGbIOb6LlbpSL9|CblO-iuii-nq:1:boiu匸gl匸3eblO-IulAb6D6|.afLncfnks匸pafcoujzgiuafpsCbIOXb:MpSLGXC9Upe(VG)匚26|6CfQblOb6Llbp6L3|礬暮:iCbIO_IU!l:lAb6D6t*CbIO_IU!l:enq:AOiqebIO_IU!l:(CblO-lAbeoet*CbIOXb这个函数有个输入参数,分别为GPIO_TypeDef和

23、GPI0_InitTypeDef型指针。它的允许值为GPI0A.GPI0G,和GPIO_InitTypeDef型指针变量。在使用时,如led.c的31行。括号内的第一个参数,表示是要对GPI0C端口进行初始化。初始化的配置以第二个参数GPI0_InitStructure结构体的成员值为准。这个结构体的成员,在调用初始化函数前已经对其参数进行配置。即代码的22、24、27行。在调用初始化函数后,GPIOC的pin0、pinl、pin2、pin3就被配置成最高频为50MHz的推挽输出模式。该函数内部实现了把参数按照一定规则转化并写入寄存器,实现GPI0端口的功能。19行代码,开启外设时钟。在对GP

24、IO初始化前还要记住,必须开启外设时钟!在开启外设时钟之前,首先要配置好系统时钟SYSCLK,配置系统时钟要设置一系列的时钟来源、倍频、分频等控制参数,这些工作由Systemlnit()库函数完成。外设时钟默认是处在关闭状态,所以外设时钟一般会在初始化外设的时候设置为开启。开启和关闭外设时钟也有封装好的库函数RCC_APB2PeriphClockCmd()。在代码的第19行调用了该函数。查看其帮组手册如下图。S2|:m33U0 x_LCCCTO黄旦否贰|/OUG蔓回国:EnverEolDiavprE1l/IGMefgfs1:U6M己匸9f6oj.匸|jgabscij-isqb6LibpsL9|

25、qciqc丄PEbaLaiJUGfGLcaups:CCVbBSbGLibplIWTT_yCCVbBSbSLibpUHa1yCC-VbBSbGLibp-iiHJO1CCVbBSbGLibplIHTP1KCC7VbB5b6LibHkJJi1CCVbBSbGLibpVDCaCCTVbBSbGLibnwJ21yCCVbBSbSLibpHHB1yCCVbBSbSLibpnSVKU1CCVbBSbGLibplIHT1CCbBSbGLibpsblT1CCVbBSbGLibpVDClCCbB5b6LibpDC5yCCVbBSbGLibpGblOL1lCCJ/bB5bGLibpjablOG1CCVbBSbGLi

26、bpGblOD1CCVbBSbGLibpGblOE1CCVbBSbGLibpGblOB匚一灯匕日忑业一Qhioc:yCC-VbBSbGLibp-vtlO1yCC_VbBSbSL!bp_GbIOC9Upe3UAC0LJUpiU9fl0U0匸|JG.O|OMIUaA9|nsa:KCC-tfbPSbGLpP12bGCi|.iG2qjmvbE?3bGLibpGL9|foaafeaifau|Ciu(一0b!ou嶷a、寸:旦运怎。1/I0U6姿回回couupiuafiouoj.GbIO-biu-Mpsksxcaups(J2)CblO-bjUb:2bGCI|.IG2qJGboi-l:pifafOpeMLIf

27、lZGU丄PQb9L9LJUGfGLC9UpG9UACblOX:MpGLGXC9Upe(VG)fO2G|GC|:fGQblObGLlbpGL9|尋郢:n!UTp_(GbIO_b!UAOiqebIO_KG2G(B!(s(CblQ-lAbGDG*GbIOXb引脚清零函数需要输入的参数有两个,第一个为将要控制的GPIO的端口,GPIOAGPIOG,第二个为要控制的引脚号,pinOpinl5。在led.c文件中最后四行调用了置1函数,让这几个引脚输出高电平,使LED初始化后处于熄灭状态。led.h文件该文件中的内容并不多,把它独立成一个头文件,方便以后扩展或移植使用。在写头文件时加上上图中所示代码,这

28、样可以防止头文件重复包含,使得工程兼容性更好。在led.h头文件的步伐,包含了前面提到的很重要的ST库必备头文件stm32f10 x.h,有了该文件我们才可以使用各种库定义,库函数。最后在第6行声明了我们在led.c源文件定义Config函数。所以,我们要使用led.c文件定函数时,只要把led.h包含到调用的函数的文件中就可以了。main文件写好了led.c和led.h两个文件,控制LED灯的驱动程序就全部完成了,接下来,可以利用写好的驱动文件,在main文件中编写应用程序了main文件中的内容如下。DGTsA():_GbI02aGfBTfa(GhlOCGhlObina)-QblOaefBTfa(CBIOC1ChlObT35eblOaeBTfS(CblOC1CblObT11GbIO_aGfBTfa(GhlOCGhlO-bliJ-o)rEDT7rEDS7rED37EDtJ爲坐MPT丁吕(T)rEDQblOContra()舉烁ED踹以TUfIJJ3TI

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论