实例介绍
一天入门STM32 pdf
C秉火 《零死角玩转STM32》一F1系列 时钟源 To T 钟电路 FR和RAM ROM 定时/计数 5系统总线又 CPU 并行Io口 串行Io口 中断系统 P0p1P2 P3 TXD RXD I。I: 图151系统结构框图 我们说的51一般是指51系列的单片机,型号有很多,常见的有STC89C51、 AT89S51,其中国内用的最多的是STC89C51/2,下面我们就以STC89C51来讲解,并以 51简称。 内核 51由一个IP核和片上外设组成,IP核就是上图中的CPU,片上外设就是上图中的: 时钟电路、SFR和RAM、ROM、定时/计数器、并行IO口、串行IO口、中断系统。IP 核跟外设之间由系统总线连接,且是8bit的,速度有限 51内核是上个世纪70年代 intel公司设计的,速度只有12M,外设是IC丿商(STC) 在内核的基础上添加的,不同的IC厂商会在内核上添加不同的外设,从而设计出各具特色 的单片机。这里 intel属于PP核厂商,STC属于IC厂商。我们后面要讲的STM32世 样,ARM属于P核厂商,ARM给ST授权,ST公司在 Cortex-M3内核的基础上设计出 STM32单片机。 外设 我们在学习51的时候,关于内核部分接触的比较少,使用的最多的是片上外设,我们 在编程的时候操作的也就是这些外设。 第3页共53页 C秉火 《零死角玩转STM32》一F1系列 编程的时候操作的寄存器位于SFR和RAM这个部分,其中SFR(特殊功能寄存器) 占有128字节(实际上只用了26个字节,只有26个寄存器,其他都属于保留区),RAM 占有128字节,我们在程序中定义的变量就是放在RAM中。其中SFR和RAM在地址上 是重合的,都是在80-FF这个地址区间,但在物理区间上是分开的,所以51的RAM是有 256个字节 编写好的程序是烧写到ROM区。剩下的外设都是我们非常熟悉的IO口,串∏、定时 器、中断这几个外设 STM32系统结构 STM32系统结构框图 接Pash DCode CortexM3 System SFAM DMAT DMA FSMC SDIO 通道1 套 通道2 AHB系线线桥接2 桥接1 APB 1 APB2 复位和时钟 通道7 控制 DC2 PIOD PWR SP1129 DMA请求 ADCs GFIOE BKP USART1 GPioF bxCAN WDG SPl GPOG USE TIM1 RIC ExTIt2C2 TIM2 DMA2 12C1 TIE UARTS TIM5 GPc日 UART& TIM4 AHTa 通道1 USaRT TIM2 通 通通5 AA请求 图2STM32系统结构框图 内核 在系统结构上,STM32和51都属于单片机,都是由内核和片上外设组成。只是 STM32使用的 Cortex-M3内核比51复杂得多,优秀得多,支持的外设也比51多得多,同 时总线宽度也上升到32bit,无论速度、功耗、外设都强与51。 第4页共53页 C秉火 《零死角玩转STM32》一F1系列 从结构框图上看,对比5内核只有一种总线,取指和取数共用。 Cortex-M3内部有若 干个总线接∏,以使CM3能同时取址和访内(访问内存),它们是: 指令存储区总线(两条)、系统总线、私有外设总线。有两条代码存储区总线负责对代 码存储区(即 FLASH外设)的访问,分别是 I-Code总线和 D-Code总线。 I-Code用于取指, D-Code用于查表等操作,它们按最佳执行速度进行优化。 系统总线( System)用J访问内存和外设,覆盖的区域包括SRAM,片上外设,片外 RAM,片夕扩展设备,以及系统级存储区的部分空间。 私有外设总线负责一部分私有外设的访问,主要就是访问调试组件。它们也在系统级 存储区。 还有一个MDA总线,从字面上看,DMA是 data memory access的意思,是一种连接 内核和外设的桥梁,它可以访问外设、内存,传输不受CPU的控制,并且是双向通信。简 而言之,这个家伙就是一个速度很快的且不受老大控制的数据般运工,这个在51里面是没 有的 外设 从结构框图上看,STM32比51的外设多得多,51有的串口、定时器、O口等外设 STM32都有。STM32还多了很多特色外设:如FSMC、SDIO、SPI、2C等,这些外设按 照速度的不同,分别挂载到AHB、APB2、APB1这三条总线上。 小结 从内核和外设这两大方面米比较,SIM32之于51就是一个升级版的单片机。它适应 市场,引流淛流,在中低端的微控制器中流光溢彩。 12学习方法的区别 学习51用寄存器,学习STM32用库。 以前我们在学习51的时候,用的是寄存器编程的方法,想要实现什么效果,直接往寄 存器里面赋值,优点是直观,简单粗暴,知道自己具体干了啥,心里踏实 直接操作寄存器之所以在51上可行,究其原因,我想有两点: 1、51主频不高,资源有限,必须注重程序执行的效率,只能直接操作寄存器。关键 的地方还得用汇编,不适合用同件库。 第5页共53页 C秉火 《零死角玩转STM32》一F1系列 要知道当初我们学习51单片机的时候用的还是汇编,连现在的C编程都不是,就更 别说什么斥函数编程 2、51功能简单,寄存器不多。以国内普及最广的STC89C52为例,寄存器仝部加起 来不到30个。按照功能区分来记的话,可以把每个寄存器背的滚瓜烂熟,并且寄存器每一 位的功能都可以记得住,在编程的时候做到了然于胸。 现在从51过度到STM32的学习,很多人还是喜欢沿用51的学习方法。接受不了库, 在学习库的时候陷入迷糊之中,来回几个月下来,都不知道到底有没学会STM32,因为在 这一路的学习中都是在调用库函数,压根就没有操作过寄存器,心里面很不踏实。其实大 家在调用库函数的时候心中难道就没有疑问,库的底层是怎么实现的?难道就没有勇气对 庥的底层探究竟。可最后当我们丌始跟踪斥函数底层的时候,看到·堆的宏定义、结构 体、指针、各种的文件包含,而且注释全部都是荚文的,是不是乂心生忌惮。鉴于此,我 想用两个原因来总结下很多初学者畏惧库不愿意用库的原因。 1、C语言知识点的欠缺 库在实现寄存器映像时使用的宏定义,强制类型转换,在定义寄存器时使用的结构 体,在外设初始化函数时使用的指针,在组织头文件时使用的条件编译等C语言知识,在 大学课程中很少涉及,大多数老师也基本是不讲。在一些简单的51单片机编程中又很少会 用到这些知识。学单片机,做嵌入式开发其实80%的工作都跟C语言编程相关,剩下的 20%的匚作就是阅读各种数据手册,熟悉各和硬件外设。所以掌握这些基本的C语言知 识,是嵌入式学习中一道迈不过去的坎,STM32的库则给」我们一次提升C的机会 凡是可以从书本中找到的,相信我们基本都可以学会,很多初学者并不是不够聪明或 者勤奋,只是缺少方向性的指导罢了。对于这欠缺的知识点我们稍微花点时间就可以掌 握,剩下的就是不断地实践词试。这里我为大家推荐·本C语言的书籍《C和指针》。 2、程序架构设计思想的欠缺 这个比较难搞,很多C语言学习得挺好好的人,也比较难掌握。还好我们遇到了 SIM32的库,这给了我们一个学习和提升C语言绝佳的机会。库的整个架构是如何搭建起 来的,代码上是如何如何一步一步写出来的:从寄存器映像开始,到寄存器的封装,然后 到函数的编写,到每个外设函数对应的驱动文件,这里面涉及到了大量的条件编译,文件 包含的思想,对应刚写过几行51单片机的初学者来说简直就是噩梦。但是,如果你把这 系列的关系弄明自了,那么对库的整个架构也了解的差不多了,以后你就不用嚷嚷着说要 操作奇存器了。 如果你一开始不喜欢用库,对库开发很忌惮,那么请自问:是不是我的C语学得 不够好。库是一种全新的学习方法,是一种河流,我更把它看做是与C语言的又一次 历练和提升。是否用库,只差你一个闪亮的回眸 第6页共53页 C秉火 《零死角玩转STM32》一F1系列 1.3用寄存器点亮LED 为了顺利过渡到库开发,在STM32编程的开始,我们对照51点亮一个LED的方法, 给大家演示一下STM32如何用操作寄存器的方法点亮一个IFD,然后再慢慢讲解到底什 么是库,让大家知道库跟寄存器的关系 1.3.1用51点亮一个LED 在用STM32点亮一个LED之前,我们先来复习下用5如何点亮一个LED。 硬件上我们假设51单片札的P0口的第0位接了一个LED,负逻辑亮。如果我们要点 亮这个LED,代码上我们会这么写 1P0=0XFF;//总线操作点亮FD 这时侯我们就把LED点亮了,如果要关掉LED,则是: 1P0=0xFF;//总线操作关闭二ED 这里面我们用的是总线操作的方法,即是对P0口的8个1O同时操作,但起作用的只 是P0^0 除了这种总线操作的方法,我们还学习过位操作,利用51编译器的关键字sbit,我们 可以定义个位变量 1sbit工E 0^0 那么LED=0;就点亮了LED,LED=1;就关闭了LED。为了让程序看起来见名知 义,我们定义两个宏: 1 #define on 0 2 define OfF 1 点亮和关闭LED的代码就变成了: 1 LED //位操作点亮IED 2 LED= OFF //位操作关闭LD 稍微整理下代码,整体的效果就是: 1//假设51单片机的P0~0口接TFD,负逻辑点亮 3 #define ON 0 4 definc Ofe 1 6 sbit lEd poo 8 void main(void) 第7页共53页 C秉火 《零死角玩转STM32》一F1系列 9{ 10 PO OXFE; /总线操作点亮 0=0XE彐 //总线操作关闭LED 13 工ED=ON;//位操作点亮LED 14 LED=OF彐;/位操作关闭LED 15」 上血总线和位操作的的方法,学过51的朋友是非常熟悉的,也很容易理解。那么我们 再说一下大家容易忽略的几个知识点。 什么是寄存器 在点亮LED的时候,我们都是用操作寄存器的方法来实现的,那大家是否想过,这个 寄存器到底是什么?为什么我们可以直接操作P0口? 解答上面的问题之前,我们先简单介绍下51单片机的主要组成部分,这对我们学习其 他单片机也有好处。 我们以国内的STC89C51为例,该单片机主要由51内核、外设IP、和总线这三人部分 组成。内核是由 Intel公司生产的,外设P就是STC公司在内核的基础上添加的诸如定时 器、串口、IO凵等这些东西,总线就是用米连接內核和外设的接凵单元。 Intel在这里属于 IP核设计公司,STC属」I设计公司。世界上能设计IP核的公司屈指可数。我们非常熟 悉的ARM公司就属于IP核设计公司,ARM给其他公司授权,其他IC公司就在ARM内 核上设计出各具特色的MCU,我们后面要学习的STM32就是属于一中基于ARM内核的 MCU。 寄存器则是内置于各个IP外设中,是一种用于配置外设功能的存储器,就是一种内 存,并且有想对应的地址。学过C语言我们就知道,要操作这些内存就可以使用C语言中 的指针,通过寻址的方式来操作这些具有特殊功能的内存一寄存器。比如P0口对应的地址 是0X80,那么我们要修改0X80这个地址对应的内存的内容的话,按照常理可以这样操 作 1*(+0X80)=0XEE;点亮LED 可当我们编译的吋候,编译器会报错,在51里面只能通过SFR和SBIT这两个关键字 来实现寄存器映像,不能直接操作寄存器对应的地址,这是51相较于STM32不同的地 万 51单片机的这些寄存器位于地址80H~HFH中,对应着128个地址,但不是每个地址 都是有效的,51系列的单片机有21个,52系列的则有26个,其他的都是保留区 第8页共53页 C秉火 《零死角玩转STM32》一F1系列 表2AT89c52SFR映象及复位状态 OFB DEFH DFOH o00000 DFTH OE8H 0D000000 DETH 00000003 DOTH OC8H0000000) XXXXXXOD DCFH x000000 37H E DAFH 0粪0H 11111111 DATH SCON 98H00000002 SBUF 9FH P1 1111111 97H TCON 88H0000000) TMOD TLO TL1 00000000 00000000 0000000000000000000 BFH SP DPH PCON 80H1 DPL co111 OXXX0000 图351寄存器映射 2.寄存器映射 实际上我们在编程的吋侯并不是通过指针来操作奇存器的,而是直接给PO、Pl这些 端口寄存器赋值。那么这些外设资源是如何与地址建立一一对应的关系(寄存器映射定 义),这得益与51特有的两个关键字:SFR和sbit,其但单片机没有,只能用其他的方式 来实现寄存器映射。这两个关健字帮我们实现了所有寄存器的定义,所以我们才可以像操 作普通变量一个米操作寄存器。其实我们一开始提到的点亮LED的代码,全貌应该是这样 的: 1 sfr po cx80;//寄存器定义 2P0=0ⅩFE; /总线操作点亮LED 为了方便起见,我们可以扣奇存器映射全部写好封装在个头文件里面,不用每用 个寄存器就定义一次。其实这方面的工作不用我们做,我们在编程的时候都会在开始的地 方添加一个头文件 1 include <reg_.h> 第9页共53页 C秉火 《零死角玩转STM32》一F1系列 这个头文件已经实现了全部寄存器的定义,该文件是kei自带,在安装目录: KeiC5IINC可以找到。这个文件实现了字节寄存器和位寄存器的定义 2 REG51 4 Header file for generic 80C51 and 80C31 microcontroller 5 Copyright (c)-988-2002 Keil ELektronik GIbH and Kei- Software, Inc 6 All rights reserved. 9 +ifdef REG5- H 10#define RFG5. H 11 12/* BYTF, Reci ster * 13sfr0=x80; 1 456 PEE 2×90 sfr CaO; 1 3 BO 17 sfr PSW RDO 18 sfr Acc CeO: 901 str Bs ExFO; 12222 x8-; 3 sIr PCoN 24 sr icon Cx88 25 sfr TMOD Cx89: sfr Tlo xiA 22223 67890 sfr T Cx8B fr T Cx8Ci fr Ti 1 8D 8 31 sfr t 2×B8 32 sfr s LHHEPCB 98 33 sfr sbuf 99 34 36/* BIT Register 37/+PSW*/ 38 sbit CY OxD 39 sbit AC OxD6 40 sbit Fo 41 sbit rs 0xD4; 43 sbit ov 44 sbit P =0×D0; 45 46/*TCON*/ 47 sbit TF 0x8F; 48 sbit TR 0x8E; 49 sbit TFo 0x8D: 50 sbit mro 0x8C 51 sbit IE-= 0x8B; 53 sbit Ieo 0x89 4 shit tto 088 56/+IE 57 sbit eA 0×AF 58 sbit fs 0×AC 59 sbit er 0×AB; 60 sbit EX 0×AA 61 sbit ero 0x9 0×A8 第10页共53页 【实例截图】
【核心代码】
标签:
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论