STM32库开发实战指南:基于STM32F4.html.pdf

收藏

编号:20200522091055303125    类型:共享资源    大小:12.01MB    格式:PDF    上传时间:2020-05-22
  
1
文币
关 键 词:
STM32 开发 实战 指南 基于 STM32F4 html
资源描述:
前言 本书的编写风格 本书着重讲解STM32F429的外设以及外设的应用,力争全面分析每个外设的功能框图和使用方法,让读者可以零死角地玩转STM32F429。 基本每个章节对应一个外设,每章的主要内容大概分为3个部分,第1部分为简介,第2部分为外设功能框图分析,第3部分为代码讲解。 外设简介则是用作者自己的话把外设概括性地介绍一遍,力求语句简短,通俗易懂,避免照抄数据手册中的介绍。 外设功能框图分析是每章的重点,该部分会详细讲解功能框图各部分的作用,是学习STM32F429的精髓所在,掌握了整个外设的框图则可以熟练地使用该外设,熟练地编程,日后学习其他型 号的单片机也会得心应手。即使单片机的型号不同,外设的框图基本也是一样的。这一步的学习比较枯燥,但是必须下功夫钻研,方能学有所成。 代码分析则是讲解使用该外设的实验过程,主要分析代码流程和一些编程注意事项。在掌握了框图之后,学习代码部分则会轻而易举。 本书的学习方法 本书第3~11章连贯性非常强,属于单片机底层知识的讲解,对后面章节的学习起着“千斤顶”的作用,读者需要按照顺序学习,不可跳跃阅读。学完这部分之后,能力稍强的用户基本可以入 门STM32。其余章节连贯性较弱,可根据项目需要选择阅读。另外本书配套200集手把手教学视频和大量的PPT,观看视频辅助学习,效果会更佳。相关视频请到秉火论坛[1]下载。 本书的参考资料 本书的参考资料为《STM32F4xx中文参考手册》和《Cortex-M4内核参考手册》,这两本是ST官方的手册,属于精华版,内容面面俱到,无所不包。限于篇幅问题,本书着重于STM32F429的功 能框图分析和代码讲解,有关寄存器的详细描述则略过,在学习本书的时候,涉及寄存器描述部分还请参考上述两本手册,这样学习效果会更佳。 本书的配套硬件和程序 本书配套的硬件平台为秉火STM32F429挑战者开发板,见图0-1。如果配合该硬件平台做实验,必会达到事半功倍的学习效果,省去中间移植时遇到的各种问题。书中提到的配套工程程序可以 在秉火论坛( )下载。 本书的技术论坛 如果在学习过程中遇到问题,可以到秉火论坛( )发帖交流,开源共享,共同进步。 鉴于作者水平有限,本书难免存在纰漏,热心的读者也可把勘误发到论坛,以便我们改进。祝你学习愉快!M4的世界,秉火与您同行! 图0-1 秉火STM32F429挑战者硬件资源 图0-1 (续) [1] www.f 第1章 如何安装KEIL5 1.1 温馨提示 1)安装路径名中不能带中文,必须是英文路径名。 2)安装目录不能跟51单片机的KEIL或者KEIL4冲突,三者目录必须分开。 3)KEIL5的安装比KEIL4多一个步骤,必须添加MCU库,不然没法使用。 4)如果使用的时候出现莫名其妙的错误,可先上相关网站查找解决方法,不要急于处理。 第1章 如何安装KEIL5 1.1 温馨提示 1)安装路径名中不能带中文,必须是英文路径名。 2)安装目录不能跟51单片机的KEIL或者KEIL4冲突,三者目录必须分开。 3)KEIL5的安装比KEIL4多一个步骤,必须添加MCU库,不然没法使用。 4)如果使用的时候出现莫名其妙的错误,可先上相关网站查找解决方法,不要急于处理。 1.2 获取KEIL5安装包 要想获得KEIL5的安装包,在互联网上搜索“KEIL5下载”即可找到很多网友提供的下载文件,或者到KEIL的官网 是MDK 5.15,若有新版本,读者可使用更高版本,见图1-1。 图1-1 KEIL官网页面 1.3 开始安装KEIL5 双击KEIL5安装包,开始安装,单击Next按钮,如图1-2所示。 图1-2 开始安装 勾选同意协议,单击Next按钮,见图1-3。 图1-3 同意协议 选择安装路径,路径名中不能有中文,单击Next按钮,如图1-4所示。 图1-4 选择安装路径 填写用户信息,全部填空格(按键盘的Space键)即可,单击Next按钮,见图1-5。 图1-5 填写用户信息 单击Finish按钮,安装完毕,见图1-6。 图1-6 安装完毕 1.4 安装STM32芯片包 KEIL5不像KEIL4那样自带了很多厂商的MCU型号,而是需要自己安装。把图1-7中弹出的对话框关掉,直接去KEIL的官网 图1-7 关闭弹出的对话框 在官网上找到STM32F1、STM32F4和STM32F7这3个系列的包,并下载到本地电脑,具体下载哪个系列根据你使用的型号选择即可,这里只下载了自己需要使用的F1/F4/F7这3个系列的 包,F1代表M3,F4代表M4,F7代表M7,见图1-8。 图1-8 选择下载系列包 把下载好的包双击安装即可,安装路径选择与KEIL5一样的。安装成功之后,在KEIL5的Pack Installer中就可以看到已安装的包,见图1-9。以后新建工程的时候,就有单片机的型号可选了。 图1-9 安装好的包 第2章 如何用DAP仿真器下载程序 2.1 仿真器简介 本书配套的仿真器为Fire-Debugger,遵循ARM公司的CMSIS-DAP标准,支持所有基于Cortex内核的单片机,常见的M3、M4和M7都可以完美支持,其外观见图2-1。 图2-1 仿真器外观 Fire-Debugger支持下载和在线仿真程序,支持Windows XP/Windows 7/Windows 8/Windows 10这4个操作系统,不需要安装驱动即可使用,并支持KEIL和IAR直接下载,非常方便。 第2章 如何用DAP仿真器下载程序 2.1 仿真器简介 本书配套的仿真器为Fire-Debugger,遵循ARM公司的CMSIS-DAP标准,支持所有基于Cortex内核的单片机,常见的M3、M4和M7都可以完美支持,其外观见图2-1。 图2-1 仿真器外观 Fire-Debugger支持下载和在线仿真程序,支持Windows XP/Windows 7/Windows 8/Windows 10这4个操作系统,不需要安装驱动即可使用,并支持KEIL和IAR直接下载,非常方便。 2.2 硬件连接 把仿真器用USB连接到电脑,如果仿真器的灯亮,则表示正常,可以使用。然后把仿真器的另外一端连接到开发板,给开发板上电,接着就可以通过软件KEIL或者IAR给开发板下载程序。仿 真器与电脑和开发板的连接方式示意图如图2-2所示。 图2-2 仿真器与电脑和开发板的连接方式 2.3 仿真器配置 在将仿真器与电脑和开发板连接好且开发板供电正常的情况下,打开编译软件KEIL,在魔术棒选项卡里面选择仿真器的型号,然后进行以下配置。 1)Debug选项配置,见图2-3。 图2-3 选择CMSIS-DAP Debugger 2)Utilities选项配置,见图2-4。 图2-4 选择Use Debug Driver 3)Debug Settings选项配置,见图2-5。 图2-5 Debug Settings选项配置 图2-6 选择目标板 2.4 选择目标板 选择目标板时,具体选择多大的Flash要根据板子上的芯片型号决定。秉火STM32开发板的配置是:F1选512KB,F4选1MB。这里面有个小技巧就是把“Reset and Run”选项也勾选上,这 样程序下载完之后就会自动运行,否则需要手动复位。要擦除的Flash大小选择Erase Sectors即可,选择Erase Full Chip的话,下载会比较慢。具体选项见图2-6。 2.5 下载程序 如果前面步骤都成功了,接下来就可以把编译好的程序下载到开发板上运行。下载程序不需要其他额外的软件,直接单击KEIL中的LOAD按钮即可,见图2-7。 图2-7 下载程序 程序下载后,Build Output选项卡上如果打印出“Application running…”,则表示程序下载成功,见图2-8。如果没有出现这一现象,可按复位键试试。 图2-8 程序下载成功 第3章 初识STM32 3.1 什么是STM32 STM32,从字面上来理解,ST是意法半导体,M是Microelectronics的缩写,32表示32位,合起来理解,STM32就是指ST公司开发的32位微控制器。在如今的32位控制器当中,STM32可以 说是最璀璨的新星,深受工程师和市场的青睐,无芯能出其右。 51单片机是嵌入式学习中一款入门级的经典MCU,因其结构简单,易于教学,且可以通过串口编程而不需要额外的仿真器,所以被大量用于教学中,至今很多大学在嵌入式教学中用的还是 51单片机。51单片机诞生于20世纪70年代,属于传统的8位单片机,如今,久经岁月的洗礼,既有其辉煌又有其不足。现在,市场上的产品竞争越来越激烈,对成本极其敏感,相应地对MCU的 性能要求也更苛刻:更多功能、更低功耗、易用界面和多任务。面对这些要求,51单片机现有的资源就显得捉襟见肘。所以无论是高校教学还是市场,都急需一款新的MCU来为这个领域注入活 力。 基于这样的需求,ARM公司推出了全新的基于ARMv7架构的32位Cortex-M3微控制器内核。紧随其后,ST公司就推出了基于Cortex-M3内核的MCU-STM32。STM32凭借其产品线的多样 化、极高的性价比、简单易用的库开发方式,迅速在众多Cortex-M3MCU中脱颖而出,成为最闪亮的一颗新星。STM32一上市就迅速占领了中低端MCU市场,受到了市场和工程师的无比青睐, 颇有“星火燎原”之势。 作为一名合格的嵌入式工程师,面对新出现的技术,不能漠不关心,而是要尽快学习,跟上技术的潮流。如今STM32的出现就是一种趋势,一种潮流,我们要做的就是搭上这趟快车,让自己 的技术更有竞争力。 第3章 初识STM32 3.1 什么是STM32 STM32,从字面上来理解,ST是意法半导体,M是Microelectronics的缩写,32表示32位,合起来理解,STM32就是指ST公司开发的32位微控制器。在如今的32位控制器当中,STM32可以 说是最璀璨的新星,深受工程师和市场的青睐,无芯能出其右。 51单片机是嵌入式学习中一款入门级的经典MCU,因其结构简单,易于教学,且可以通过串口编程而不需要额外的仿真器,所以被大量用于教学中,至今很多大学在嵌入式教学中用的还是 51单片机。51单片机诞生于20世纪70年代,属于传统的8位单片机,如今,久经岁月的洗礼,既有其辉煌又有其不足。现在,市场上的产品竞争越来越激烈,对成本极其敏感,相应地对MCU的 性能要求也更苛刻:更多功能、更低功耗、易用界面和多任务。面对这些要求,51单片机现有的资源就显得捉襟见肘。所以无论是高校教学还是市场,都急需一款新的MCU来为这个领域注入活 力。 基于这样的需求,ARM公司推出了全新的基于ARMv7架构的32位Cortex-M3微控制器内核。紧随其后,ST公司就推出了基于Cortex-M3内核的MCU-STM32。STM32凭借其产品线的多样 化、极高的性价比、简单易用的库开发方式,迅速在众多Cortex-M3MCU中脱颖而出,成为最闪亮的一颗新星。STM32一上市就迅速占领了中低端MCU市场,受到了市场和工程师的无比青睐, 颇有“星火燎原”之势。 作为一名合格的嵌入式工程师,面对新出现的技术,不能漠不关心,而是要尽快学习,跟上技术的潮流。如今STM32的出现就是一种趋势,一种潮流,我们要做的就是搭上这趟快车,让自己 的技术更有竞争力。 3.2 STM32能做什么 STM32属于一个微控制器,自带了各种常用通信接口,比如USART、I2C、SPI等,可连接非常多的传感器,可以控制很多的设备。现实生活中,我们接触到的很多电器产品中都有STM32的 身影,比如智能手环、微型四轴飞行器、平衡车、移动POST机、智能电饭锅、3D打印机等。下面我们以最近较流行的两个产品为例来讲解一下STM32:一个是智能手环,一个是飞行器。 3.3 STM32选型 3.3.1 STM32分类 STM32有很多系列,可以满足市场的各种需求。从内核上分,有Cortex-M0、M3、M4和M7,每个内核又可分为主流、高性能和低功耗等,具体见表3-2。 表3-2 STM8和STM32分类 单纯从学习的角度出发,可以选择F1和F4系列。F1代表了基础型,基于Cortex-M3内核,主频为72MHz;F4代表了高性能,基于Cortex-M4内核,主频180MHz。 与F1相比,F4(429系列以上)除了内核不同且主频有提升外,更高级的特点是带了LCD控制器和摄像头接口,支持SDRAM,这个区别在STM32选型上会被优先考虑。 第4章 寄存器 4.1 寄存器简介 我们经常说寄存器,那么什么是寄存器?这正是本章需要讲解的内容,在学习的过程中,大家带着这个疑问好好思考下,到最后看看能否用一句话给寄存器下一个定义。 第4章 寄存器 4.1 寄存器简介 我们经常说寄存器,那么什么是寄存器?这正是本章需要讲解的内容,在学习的过程中,大家带着这个疑问好好思考下,到最后看看能否用一句话给寄存器下一个定义。 4.2 STM32的外观 图4-1所示是包含176个引脚的STM32F429IGT6,这也是我们接下来要学习的STM32,其正面引脚图见图4-2。 图4-1 STM32F429IGT6实物图 芯片正面是丝印,“ARM”表示该芯片使用的是ARM的内核,“STM32F429IGT6”是芯片型号,后面的字符串应该与生产批次相关,最下面的是ST的LOGO。 芯片四周是引脚,左下角的小圆点表示1引脚,然后从1引脚起按照逆时针的顺序排列编号(所有芯片的引脚编号顺序都是逆时针排列的)。开发板上把芯片的引脚引出来,连接到各种传感器 上,然后在STM32上编程(实际就是通过程序控制这些引脚输出高电平或者低电平)以控制各种传感器工作,可通过做实验的方式学习STM32芯片的各个资源。开发板是一种评估板,板载资源 非常丰富,引脚复用比较多,目的是力求在一个板子上验证芯片的全部功能。 图4-2 STM32F429IGT6正面引脚图 4.3 芯片里面有什么 我们看到的STM32芯片是已经封装好的成品,主要由内核和片上外设组成。若与电脑类比,内核与外设就如同电脑上的CPU与主板、内存、显卡、硬盘的关系。 STM32F429采用的是Cortex-M4内核,内核即CPU,由ARM公司设计。ARM公司并不生产芯片,而是出售其芯片技术授权。芯片生产厂商,如ST、TI、Freescale,负责设计内核之外的部 件并生产整个芯片,这些内核之外的部件被称为核外外设或片上外设,如GPIO、USART(串口)、I2C、SPI等,具体见图4-3。 图4-3 STM32芯片结构简图 芯片和外设之间通过各种总线连接,其中主控总线有8条,被控总线有7条,具体见图4-4。主控总线通过一个总线矩阵来连接被控总线,总线矩阵用于主控总线之间的访问仲裁管理,仲裁采 用循环调度算法。总线交叉时,用圆圈表示可以通信,否则表示不可以通信。比如S0:I总线只有跟M0、M2和M6这3根被控总线交叉的时候才会用圆圈,表示S0只能跟这3根被控总线通信。从功 能上来理解,I总线是指令总线,实现取指功能,指令指的是编译好的程序指令。我们知道,STM32有3种启动方式:从Flash启动(包含系统存储器),从内部SRAM启动,从外部RAM启动。这3 种存储器刚好对应的就是M0、M2和M6这3根总线。 图4-4 STM32F42xxx和STM32F43xxx器件的总线接口 图4-5 存储器映射 4.4 存储器映射 在图4-4中,连接被控总线的是Flash、RAM和片上外设,这些功能部件共同排列在一个4GB大小的地址空间内。在编程的时候,操作的正是这些功能部件。 存储器本身不具有地址信息,它的地址由芯片厂商或用户分配,给存储器分配地址的过程就称为存储器映射,具体见图4-5。如果给存储器再分配一个地址,就叫存储器重映射。 存储器区域功能划分 在这4GB的地址空间中,ARM将其大致地平均分成8块(Block),每个块也都规定了用途,具体功能分类见表4-1。每个块的大小都有512MB,显然这是非常大的,芯片厂商在每个块的地址 范围内设计各具特色的外设时一般只用其中的一部分。 表4-1 存储器功能分类 在这8个Block里面,有3个非常重要,也是我们最关心的3个。Block0用于设计内部Flash,Block1用于设计内部RAM,Block2用于设计片上的外设。下面我们简单介绍这3个Block里具体区 域的功能划分。 1.Block0内部区域功能划分 Block0主要用于设计片内的Flash,F429系列芯片内部Flash最大是2MB,STM32F429IGT6的Flash是1MB。在芯片内部集成更大的Flash或者SRAM意味着芯片成本会增加,往往片内集成的 Flash都不会太大,ST在追求性价比的同时能做到1MB以上,实乃良心之举。Block0内部区域的功能划分具体见表4-2。 表4-2 Block0内部区域功能划分 2.Block1内部区域功能划分 Block1用于设计片内的SRAM。F429芯片内部SRAM的大小为256KB,其中64KB的CCM RAM位于Block0,剩下的192KB位于Block1,分为:SRAM1112KB、SRAM216KB、 SRAM364KB。Block1内部区域的功能划分具体见表4-3。 表4-3 Block1内部区域功能划分 3.Block2内部区域功能划分 Block2用于设计片内的外设,根据外设的总线速度不同,Block2被分成了APB和AHB两部分,其中APB又被分为APB1和APB2,AHB分为AHB1和AHB2,具体见表4-4。还有一个AHB3包含 了Block3/4/5/6,这4个Block用于扩展外部存储器,如SDRAM、NORFlash和NANDFlash等。 表4-4 Block2内部区域功能划分 4.5 寄存器映射 我们知道,存储器本身没有地址,给存储器分配地址的过程叫存储器映射。那么什么叫寄存器映射?寄存器到底是什么? 存储器Block2这块区域用于设计片上外设,它们以4个字节为一个单元,共32位,每一个单元对应不同的功能,当我们控制这些单元时就可以驱动外设工作。我们可以找到每个单元的起始地 址,然后通过C语言指针的操作方式来访问这些单元。但如果每次都是通过这种地址的方式来访问,不仅不好记忆还容易出错,这时我们可以根据每个单元功能的不同,以功能为名给这个内存单 元取一个别名,这个别名就是我们经常说的寄存器,这个给已经分配好地址的、有特定功能的内存单元取别名的过程就叫寄存器映射。 比如,GPIOH端口的输出数据寄存器ODR的地址是0x40021C14(至于是如何找到这个地址,后面我们会有详细的讲解),ODR寄存器是32位,低16位有效,对应16个外部IO,写入0/1,对 应的IO则输出低/高电平。现在通过C语言指针的操作方式,让GPIOH的16个IO都输出高电平,具体见代码清单4-1。 代码清单4-1 通过绝对地址访问内存单元 1 // GPIOH 端口全部输出高电平 2 *(unsigned int*)(0x4002 1C14) = 0xFFFF; 0x40021C14在我们看来是GPIOH端口ODR的地址,但是在编译器看来,这只是一个普通的变量,是一个立即数,要想让编译器也认为它是指针,得进行强制类型转换,把它转换成指针,即 (unsigned int*)0x40021C14,然后再对这个指针进行*操作。 刚刚我们说了,通过绝对地址访问内存单元不但不好记忆且容易出错,所以可以通过寄存器别名的方式来操作,具体见代码清单4-2。 代码清单4-2 通过寄存器别名方式访问内存单元 1 // GPIOH 端口全部输出高电平 2 #define GPIOH_ODR (unsigned int*)(GPIOH_BASE+0x14) 3 * GPIOH_ODR = 0xFF; 为了方便操作,我们干脆把指针操作“*”也定义到寄存器别名里面,具体见代码清单4-3。 代码清单4-3 通过寄存器别名访问内存单元 1 // GPIOH 端口全部输出高电平 2 #define GPIOH_ODR *(unsigned int*)(GPIOH_BASE+0x14) 3 GPIOH_ODR = 0xFF; 第5章 新建工程——寄存器版 5.1 新建本地工程文件夹工程 5.1.1 新建本地工程文件夹 为了使工程目录更加清晰,在本地电脑上新建1个文件夹用来存放整个工程,如命名为“LED”,然后在该目录下新建两个文件夹,具体见表5-1。 表5-1 工程目录文件夹清单 工程文件夹目录界面见图5-1。 图5-1 工程文件夹目录 在本地新建好文件夹后,在文件夹下新建一些文件,见表5-2。 表5-2 工程目录文件夹内容清单 第5章 新建工程——寄存器版 5.1 新建本地工程文件夹工程 5.1.1 新建本地工程文件夹 为了使工程目录更加清晰,在本地电脑上新建1个文件夹用来存放整个工程,如命名为“LED”,然后在该目录下新建两个文件夹,具体见表5-1。 表5-1 工程目录文件夹清单 工程文件夹目录界面见图5-1。 图5-1 工程文件夹目录 在本地新建好文件夹后,在文件夹下新建一些文件,见表5-2。 表5-2 工程目录文件夹内容清单 5.2 下载程序 如果前面步骤都成功了,接下来就可以把编译好的程序下载到开发板上运行。下载程序不需要其他额外的软件,直接单击KEIL中的LOAD按钮即可。 图5-13 下载程序 程序下载后,Build Output选项卡中如果显示“Application running…”,则表示程序下载成功。如果没有出现这一现象,可按复位键试试。当然,这只是一个工程模板,我们还没写程序, 开发板不会有任何现象。 至此,一个新的工程模板建立完毕。 第6章 使用寄存器点亮LED 6.1 GPIO简介 GPIO是通用输入输出端口的简称,简单来说就是STM32可控制的引脚,STM32芯片的GPIO引脚与外部设备连接起来,实现与外部通信、控制以及数据采集的功能。STM32芯片的GPIO被分 成很多组,每组有16个引脚,如型号为STM32F4IGT6的芯片有GPIOA、GPIOB、GPIOC、…、GPIOI共9组GPIO,芯片共有176个引脚,其中GPIO就占了大部分,所有的GPIO引脚都有基本的 输入输出功能。 最基本的输出功能是由STM32控制引脚输出高、低电平,实现开关控制的,若把GPIO引脚接到LED,就可以控制LED的亮灭;引脚接到继电器或三极管,就可以通过继电器或三极管控制外部 大功率电路的通断。 最基本的输入功能是检测外部输入电平,如把GPIO引脚连接到按键,则可通过电平高低判断按键是否被按下。 第6章 使用寄存器点亮LED 6.1 GPIO简介 GPIO是通用输入输出端口的简称,简单来说就是STM32可控制的引脚,STM32芯片的GPIO引脚与外部设备连接起来,实现与外部通信、控制以及数据采集的功能。STM32芯片的GPIO被分 成很多组,每组有16个引脚,如型号为STM32F4IGT6的芯片有GPIOA、GPIOB、GPIOC、…、GPIOI共9组GPIO,芯片共有176个引脚,其中GPIO就占了大部分,所有的GPIO引脚都有基本的 输入输出功能。 最基本的输出功能是由STM32控制引脚输出高、低电平,实现开关控制的,若把GPIO引脚接到LED,就可以控制LED的亮灭;引脚接到继电器或三极管,就可以通过继电器或三极管控制外部 大功率电路的通断。 最基本的输入功能是检测外部输入电平,如把GPIO引脚连接到按键,则可通过电平高低判断按键是否被按下。 6.2 GPIO框图剖析 GPIO硬件结构框图见图6-1。通过此框图可以从整体上深入了解GPIO外设及它的各种应用模式。图6-1最右端就是STM32芯片引出的GPIO引脚,其余部件都位于芯片内部。 6.3 实验:使用寄存器点亮LED 本小节以实例讲解如何控制寄存器来点亮LED。此处侧重于讲解原理,读者可直接用KEIL5软件打开我们提供的实验例程配合阅读,先了解原理,学习完本小节后,再尝试自己建立一个同样的 工程。本节配套例程名为“GPIO输出—寄存器点亮LED”,在工程目录下找到后缀为“.uvprojx”的文件,用KEIL5打开即可。 自己尝试新建工程时,请参考第5章。 若没有安装KEIL5软件,请参考第1章。 打开该工程,可看到一共有3个文件,分别是startup_stm32f429_439xx.s、stm32f4xx.h以及main.c,见图6-3。下面对这3个工程进行讲解。 图6-3 工程文件目录 第7章 自己写库——构建库函数雏形 7.1 STM32函数库简介 虽然我们使用寄存器点亮了LED,乍看一下好像代码也很简单,但是别以为就可以一直用寄存器开发。在用寄存器点亮LED的时候,我们会发现STM32的寄存器都是32位的,每次配置的时候 都要对照《STM32F4xx参考手册》中寄存器的说明,然后根据说明对每个控制的寄存器位写入特定参数,因此在配置的时候非常容易出错,而且代码还很不好理解,不便于维护。所以学习 STM32最好的方法是用软件库,然后在软件库的基础上了解底层,学习所有寄存器。 以上所说的软件库是指“STM32标准函数库”,它是由ST公司针对STM32设置的函数接口,即API(Application Programming Interface)。开发者可调用这些函数接口来配置STM32的寄 存器,以脱离最底层的寄存器操作,具有开发快速、易于阅读、维护成本低等优点。 当我们调用库API的时候不需要挖空心思去了解库底层的寄存器操作,就像刚开始学习C语言的时候,只需要会用printf()函数,并没有去研究它的源码实现一样。但在需要深入研究的时 候,经过千锤百炼的库API源码就是最佳的学习范例。 实际上,库是架设在寄存器与用户驱动层之间的代码,向下处理与寄存器直接相关的配置,向上为用户提供配置寄存器的接口。库开发方式与直接配置寄存器方式的对比见图7-1。 图7-1 开发方式对比图 第7章 自己写库——构建库函数雏形 7.1 STM32函数库简介 虽然我们使用寄存器点亮了LED,乍看一下好像代码也很简单,但是别以为就可以一直用寄存器开发。在用寄存器点亮LED的时候,我们会发现STM32的寄存器都是32位的,每次配置的时候 都要对照《STM32F4xx参考手册》中寄存器的说明,然后根据说明对每个控制的寄存器位写入特定参数,因此在配置的时候非常容易出错,而且代码还很不好理解,不便于维护。所以学习 STM32最好的方法是用软件库,然后在软件库的基础上了解底层,学习所有寄存器。 以上所说的软件库是指“STM32标准函数库”,它是由ST公司针对STM32设置的函数接口,即API(Application Programming Interface)。开发者可调用这些函数接口来配置STM32的寄 存器,以脱离最底层的寄存器操作,具有开发快速、易于阅读、维护成本低等优点。 当我们调用库API的时候不需要挖空心思去了解库底层的寄存器操作,就像刚开始学习C语言的时候,只需要会用printf()函数,并没有去研究它的源码实现一样。但在需要深入研究的时 候,经过千锤百炼的库API源码就是最佳的学习范例。 实际上,库是架设在寄存器与用户驱动层之间的代码,向下处理与寄存器直接相关的配置,向上为用户提供配置寄存器的接口。库开发方式与直接配置寄存器方式的对比见图7-1。 图7-1 开发方式对比图 7.2 采用库来开发及学习的原因 在以前8位机时代的程序开发中,一般直接配置芯片的寄存器,控制芯片的工作方式,如中断、定时器等。配置的时候,常常要查阅寄存器表,看用到哪些配置位,为了配置某功能,该置1还 是置0。这些都是很琐碎、机械的工作,因为8位机的软件相对来说较简单,而且资源很有限,所以可以通过直接配置寄存器的方式来开发。 对于STM32,因为外设资源丰富,带来的必然是寄存器的数量和复杂度的增加,这时直接配置寄存器方式的缺陷就突显出来了: ·开发速度慢 ·程序可读性差 ·维护复杂 这些缺陷直接影响了开发效率、程序维护成本、交流成本。库开发方式则正好弥补了这些缺陷。 采用直接配置寄存器的方式开发的优点如下: ·具体参数更直观 ·程序运行占用资源少 相对于库开发的方式,直接配置寄存器方式生成的代码量的确会少一点,但因为STM32有充足的资源,权衡库的优势与不足,绝大部分时候,我们愿意牺牲一点CPU资源,而选择库开发。一 般只有在对代码运行时间要求极苛刻的地方,才用直接配置寄存器的方式代替,如频繁调用的中断服务函数。 对于库开发与直接配置寄存器的方式,就好比编程是用汇编好还是用C好一样。在STM32F1系列刚推出函数库时,引起了程序员的激烈争论,但是,随着ST库的完善,以及大家对库的了解, 更多的程序员选择了库开发。现在STM32F1系列和STM32F4系列各有一套自己的函数库,但是它们大部分是兼容的,F1和F4之间的程序移植只需要小修改即可。而如果要移植用寄存器编写的程 序,将是很麻烦的。 用库来进行开发,市场已有定论,用户群说明了一切,但对于STM32的学习仍然有人认为用寄存器好,而且他们会强调,汇编不是还没退出大学教材吗?他们认为这种方法直观,能够了解配 置了哪些寄存器,以及怎样配置寄存器。事实上,库函数的底层实现恰恰是直接配置寄存器方式的最佳例子,它代替我们完成了寄存器配置的工作。而想深入了解芯片是如何工作的话,只要直接 查看库函数的最底层实现即可。所以在以后的章节中,使用软件库是我们的重点,而且我们通过讲解库API去高效地学习STM32的寄存器,并不至于因为用库学习,就不用寄存器控制STM32芯 片。 7.3 实验:构建库函数雏形 虽然库的优点很多,但很多人对库还是很忌惮的,因为一开始用库的时候会有很多代码,很多文件,而不知道如何入手。不知道你是否认同这么一句话:一切的恐惧都来源于认知的空缺。我 们对库的忌惮那是因为我们不知道什么是库,不知道库是怎么实现的。 接下来,我们在寄存器点亮LED的代码上继续完善,把代码一层层封装,实现库的最初的雏形。相信经过这一步的学习后,对库的运用会游刃有余。这里我们只讲如何实现GPIO函数库,其他 外设则直接参考ST标准库学习即可,不必自己写。 下面打开本章配套例程“构建库函数雏形”来阅读理解,该例程是在上一章的基础上修改得来的。 第8章 初识STM32标准库 8.1 CMSIS标准及库层次关系 在上一章中,我们构建了几个控制GPIO外设的函数,实现了函数库的雏形,但还有很多GPIO功能函数我们没有实现,而且STM32芯片不仅只有GPIO这一个外设。如果我们想要亲自完成这 个函数库,工作量是非常巨大的。ST公司提供的标准软件库中包含了STM32芯片所有寄存器的控制操作,学习如何使用ST标准库,会极大地方便控制STM32芯片。 Cortex系列芯片采用的内核都是相同的,区别主要为核外的片上外设的差异,这些差异却导致软件在相同内核、不同外设的芯片上移植困难。为了解决不同的芯片厂商生产的Cortex微控制器 软件的兼容性问题,ARM与芯片厂商建立了CMSIS标准(Cortex Microcontroller Software Interface Standard)。 所谓CMSIS标准,实际是新建了一个软件抽象层,见图8-1。 图8-1 CMSIS标准架构 CMSIS标准中最主要的是CMSIS核心层,它包括以下部分: ·内核函数层:即SIMD Cortex-M4,其中包含用于访问内核寄存器的名称、地址定义,主要由ARM公司提供。 ·设备外设访问层:提供了片上的核外外设的地址和中断定义,主要由芯片生产商提供。 可见CMSIS层位于硬件层与操作系统或用户层之间,提供了与芯片生产商无关的硬件抽象层,可以为接口外设、实时操作系统提供简单的处理器软件接口,屏蔽了硬件差异,这对软件的移植 是有极大的好处的。STM32的库就是按照CMSIS标准建立的。 第8章 初识STM32标准库 8.1 CMSIS标准及库层次关系 在上一章中,我们构建了几个控制GPIO外设的函数,实现了函数库的雏形,但还有很多GPIO功能函数我们没有实现,而且STM32芯片不仅只有GPIO这一个外设。如果我们想要亲自完成这 个函数库,工作量是非常巨大的。ST公司提供的标准软件库中包含了STM32芯片所有寄存器的控制操作,学习如何使用ST标准库,会极大地方便控制STM32芯片。 Cortex系列芯片采用的内核都是相同的,区别主要为核外的片上外设的差异,这些差异却导致软件在相同内核、不同外设的芯片上移植困难。为了解决不同的芯片厂商生产的Cortex微控制器 软件的兼容性问题,ARM与芯片厂商建立了CMSIS标准(Cortex Microcontroller Software Interface Standard)。 所谓CMSIS标准,实际是新建了一个软件抽象层,见图8-1。 图8-1 CMSIS标准架构 CMSIS标准中最主要的是CMSIS核心层,它包括以下部分: ·内核函数层:即SIMD Cortex-M4,其中包含用于访问内核寄存器的名称、地址定义,主要由ARM公司提供。 ·设备外设访问层:提供了片上的核外外设的地址和中断定义,主要由芯片生产商提供。 可见CMSIS层位于硬件层与操作系统或用户层之间,提供了与芯片生产商无关的硬件抽象层,可以为接口外设、实时操作系统提供简单的处理器软件接口,屏蔽了硬件差异,这对软件的移植 是有极大的好处的。STM32的库就是按照CMSIS标准建立的。 8.2 使用帮助文档 官方资料是所有关于STM32知识的源头,所以本小节介绍如何使用官方资料。官方的帮助手册是最好的教程,几乎包含了所有在开发过程中遇到的问题。这些资料已整理到了秉火论坛中。 第9章 新建工程——库函数版 9.1 新建本地工程文件夹 了解STM32的标准库文件之后,我们就可以使用它来建立工程了,因为用库新建工程的步骤较多,我们一般是使用库建立一个空的工程,作为工程模板。以后直接复制一份工程模板,在它之 下进行开发。 为了使得工程目录更加清晰,我们在本地电脑上新建一个“工程模板”文件夹,在它之下再新建6个文件夹,见表9-1和图9-1。 表9-1 工程目录文件夹清单 图9-1 工程文件夹目录 在本地新建好文件夹后,把准备好的库文件添加到相应的文件夹下,见表9-2。 表9-2 工程目录文件夹内容清单 第9章 新建工程——库函数版 9.1 新建本地工程文件夹 了解STM32的标准库文件之后,我们就可以使用它来建立工程了,因为用库新建工程的步骤较多,我们一般是使用库建立一个空的工程,作为工程模板。以后直接复制一份工程模板,在它之 下进行开发。 为了使得工程目录更加清晰,我们在本地电脑上新建一个“工程模板”文件夹,在它之下再新建6个文件夹,见表9-1和图9-1。 表9-1 工程目录文件夹清单 图9-1 工程文件夹目录 在本地新建好文件夹后,把准备好的库文件添加到相应的文件夹下,见表9-2。 表9-2 工程目录文件夹内容清单 9.2 新建工程 打开KEIL5,新建一个工程,根据喜好命名工程,这里取LED-LIB,保存在Project\RVMDK(uv5)文件夹下,见图9-2。 图9-2 在KEIL5中新建工程 1.选择CPU型号 这个根据你开发板使用的CPU具体的型号来选择,对于M4挑战者,选STM32F429IGT型号,如图9-3所示。如果这里没有出现你想要的CPU型号,或者一个型号都没有,那么肯定是你的 KEIL5没有添加device库,KEIL5不像KEIL4那样自带了很多MCU的型号,而是需要自己添加。 图9-3 选择具体的CPU型号 2.在线添加库文件 现在暂时不添加库文件,稍后手动添加。由于在线添加非常缓慢,因此单击关闭按钮,关闭添加窗口,见图9-4。 图9-4 添加库文件窗口 3.添加组文件夹 在新建工程中右击,选择Add Group选项,在新建的工程中添加5个组文件夹,见图9-5。组文
展开阅读全文
  文库网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
0条评论

还可以输入200字符

暂无评论,赶快抢占沙发吧。

关于本文
本文标题:STM32库开发实战指南:基于STM32F4.html.pdf
链接地址:http://www.wenkunet.com/p-2185378.html
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

文库网用户QQ群:731843829    百度熊掌号:文库网精选     微信公众号:WENKUNET

copyright© 2018-2020 文库网 wenkunet.com 网站版权所有

经营许可证编号:粤ICP备19143267号-1 


1.png 2.png 3.png 4.png 5.png 6.png 7.png 8.png 9.png 10.png