收藏 分享(赏)

零死角玩转stm32-初级篇.pdf

上传人:a****2 文档编号:3060809 上传时间:2024-01-19 格式:PDF 页数:131 大小:4.13MB
下载 相关 举报
零死角玩转stm32-初级篇.pdf_第1页
第1页 / 共131页
零死角玩转stm32-初级篇.pdf_第2页
第2页 / 共131页
零死角玩转stm32-初级篇.pdf_第3页
第3页 / 共131页
零死角玩转stm32-初级篇.pdf_第4页
第4页 / 共131页
零死角玩转stm32-初级篇.pdf_第5页
第5页 / 共131页
零死角玩转stm32-初级篇.pdf_第6页
第6页 / 共131页
亲,该文档总共131页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

1、 野火淘宝店:http:/(点我)-第 2 页-有疑问就到: 0、友情提示、友情提示 零死角玩转零死角玩转 STM32系列教程由初级篇初级篇、中级篇中级篇、高级篇高级篇、系统篇系统篇、四个部分组成,根据野火 STM32 开发板旧版教程升级而来,且经过重新深入编写,重新排版,更适合初学者,步步为营,从入门到精通,从裸奔到系统,让您零死角玩转 STM32。M3 的世界,于野火同行,乐意惬无边。另外,野火团队历时一年精心打造的STM32 库开发实战指南库开发实战指南将于今年 10 月份由机械工业出版社机械工业出版社出版,该书的排版更适于纸质书本阅读以及更有利于查阅资料。内容上会给你带来更多的惊喜。是

2、一本学习 STM32 必备的工具书。敬请期待!野火淘宝店:http:/(点我)-第 3 页-有疑问就到: 1、如何编译和下载程序、如何编译和下载程序 在拿到开发板之后,很多朋友都想先尝尝鲜,想自己烧写个程序到开发板上,看看效果。下面将演示如何将光盘里面自带的程序烧写到野火 STM32 开发板上。前提是你的电脑上已经安装了JLINK驱动和MDK开发环境,如果这一部没有完成,请参考2、JLINKJLINK驱动安装与驱动安装与MDKMDK环境搭建环境搭建。野火 STM32 开发板光盘上提供的代码都是已经编译好的,直接下载即可。1.1 编译程序编译程序 首先打开一个MDK工程,在野火 STM32 开发

3、板光盘目录下:2-程序+教程第一部分-库开发初级篇5-野火 M3-流水灯USER,点击 STM32-DEMO.uvproj,打开流水灯这个工程。在弹出的MDK界面中,我们可以看到左边的工具栏中有三个按钮,现在我们从左往右来介绍下这三个按钮的功能。第一个按钮:Translate 就是翻译当下修改过的文件,说明白点就是检查下有没有语法错误,并不会去链接库文件,也不会生成可执行文件。第二个按钮:Build 就是编译当下修改过的文件,它包含了语法检查,链接动态库文件,生成可执行文件。野火淘宝店:http:/(点我)-第 4 页-有疑问就到: 重新编译整个工程,跟 Build 这个按钮实现的功能是一样的

4、,但有所不同的是它编译的是整个工程的所有文件,耗时巨大。综上:当我们编辑好我们的程序之后,只需要用第二个Build 按钮就可以,即方便又省时。第一个跟第三个按钮用的比较少。1.2 下载下载程序程序 野火 STM32 开发板有两种下载方式,JLINKV8下载和串口下载。要注意的是:1、JLINK下载的时候,开发板中的拨动开关BOOT0(在开发板边缘,靠近网口)即可以拨到VCC也可拨到GND,但在JLINK下载完程序后,必须将BOOT0拨到GND,好让程序从内部的存储器开始运行程序,所以在JLINK下载时最保险的方法就是将BOOT0拨到GND那端。2、在用串口下载程序的时候,必须将BOOT0开发拨

5、到VCC,在程序下载完后,然后将BOOT0开关拨到GND。1.2.1 JLINK 下载下载 插上DC-5V电源给开发板供电,再插上JLINK。点击MDK工具栏中的Load 按钮就可将编译好的程序下载到开发板中。下载成功之后,程序就会自动运行。如果发现程序没有运行,则可按下开发板中的复位按键。野火淘宝店:http:/(点我)-第 5 页-有疑问就到: Options-Debug-Setting-Falash DownLoad 中设置的:如果没有设置为自动运行的话,我们需要在程序下载完毕之后进行手动复位,手动复位可以是按键复位和上电复位。还有一点要注意的是:在程序下载到开发板之后,开发板要供电,J

6、LINK一端连开发板,另一端连PC,这样程序才能运行。有些用户在下载程序之后,第二次用的时候只是给开发板供电,JLNK的一端只连了开发板而没有连PC,这样 野火淘宝店:http:/(点我)-第 6 页-有疑问就到: 串口下载串口下载 插上DC-5V电源给开发板供电,插上JLINK,插上自带的串口线(注意是两头注意是两头都是母的交叉串口线)。都是母的交叉串口线)。将BOOT0开关拨到VCC。在这里我们用的串口下载软件是 mcuisp,这个一个绿色的软件,可从网上自由下载,野火 M3光盘目录下:3-安装软件3-串口下载软件找到。点击mcuisp.exe,打开mcuisp,mcuisp是很智能的,只

7、要开发板上电且连接好了串口,它就会自动搜索串口,野火 STM32 开发板用的是电脑主板后面的串口,这个串口都会被默认为是串口1。假如你是笔记本用户,用的是USB转串口,那么端口号可能就不是COM1,需要到我的电脑管理设备管理器端口中查找,然后再修改。设置波特率为115200,选择要下载的程序。在开发板自带的例程中,可执行文件(hex文件)都在工程目录下的Output这个文件下。野火淘宝店:http:/(点我)-第 7 页-有疑问就到: 8 页-有疑问就到: 开始编程 按钮,如果程序下载成功后则会打印出下面红色框中的信息。程序下载成功之后,可是在开发板上看不到实验现象呀,怎么办?是不是出什么问题

8、了呀?这是因为我们是通过串口将我们的程序烧写到flash里面去了,而我们想要从flash里面执行我们的程序的话,则需要将BOOT0开关拨到GND,然后按下我们的复位按键就可以看到实验想象了。野火淘宝店:http:/(点我)-第 9 页-有疑问就到: 开始编程按钮时,还会出现mcuisp一直处于连接的状态,导致程序下载不了,如下截图所示。解决的方法是只需我们按一下开发板中的复位按键即可。1.2.3 串口下载与串口下载与 JLINK 下载对比下载对比 串口下载 优点:速度快,下载稳定,特别是下载大型程序的时候。如果你的板子用的的MAX3232是国产的毛片的话,则没有这个优点:(。国产的MAX323

9、2价格是0.3RMB,进口的是3.8RMB。野火 STM32 开发板用的MAX3232是3.8RMB的,在波特率设置到115200时,仍可稳定下载:)。缺点:不能够在线调试。JLINK 下载 优点:可以在线调试,开发一大利器,必不可少。有JLINK,犹如倚天屠龙在手:)。野火淘宝店:http:/(点我)-第 10 页-有疑问就到: JLINK。野火淘宝店:http:/(点我)-第 11 页-有疑问就到: 2、JLINKJLINK 驱动安装与驱动安装与 MDKMDK 环境搭建环境搭建 2.1 JLINK 驱动安装驱动安装 在用JLINK下载和调试程序之前,我们需要线在电脑上安装JLINK驱动,如

10、果电脑上已经安装JLINK驱动,则可跳过这一步。在野火 M3光盘目录下:3-安装软件1-JLINKV8 驱动 点击Setup_JLinkARM_V428c.exe,完成JLINK驱动的安装。安装过程非常简单,这里将跳过。在安装完成后,我们将JLINK插接到电脑的USB口,即可在我的电脑管理设备管理器通用串行总线控制器中看到一个J-Link driver。要注意的是在安装完JLINK驱动后,一定要将JLINK插接到电脑的USB口,否则在电脑的设备管理器中是查看不到J-Link driver的。当你把JLINK拔出电脑的USB口时候,J-Link driver就会消失。2.2 MDK 环境搭建环境

11、搭建 在我们学习编写代码之前需要先要把MDK这个软件安装好,野火用的版本是V4.14,在安装完成之后可以在工具栏help-about uVision选项卡中查看到版本信息。MDK是一个集代码编辑,编译,链接和下载于一体的集成开发环境(KDE)。MDK这个名字我们可能不熟悉,但说到KEIL,学过51的朋友就再熟悉不过了。后来KEIL被ARM公司收购之后就改名为MDK了,所以学过51的朋友是很快就可以熟悉这个开发环境的。在野火M3 光盘目录下:3-安装软件2-MDK 找到 MDK414.exe,点击MDK414.exe,在弹出MDK安装界面后,按照如下步骤操作即可。野火淘宝店:http:/(点我)

12、-第 12 页-有疑问就到: Next。把勾勾上,点击 Next。野火淘宝店:http:/(点我)-第 13 页-有疑问就到: C:keil 目录下。在用户名中填入名字(可随便写,可空格),在邮件地址那里填入邮件地址(可随便写,可空格),点击Next。野火淘宝店:http:/(点我)-第 14 页-有疑问就到: Finish,安装完成。野火淘宝店:http:/(点我)-第 15 页-有疑问就到: 和谐和谐 MDK 安装完MDK开发环境后,在下载程序的时候会有40K的代码限制,我只需要和谐下即可搞定:)。在野火 M3光盘目录下:3-安装软件2-MDK 找到KEIL_Lic.exe,点击KEIL_

13、Lic.exe,在弹出的界面中的CID选项框中填入MDK的CID(MDK的CID在MDK开发环境中的菜单栏FileLicense Managemant 中获取到),在Target下拉框中选择ARM,然后点击Generate按钮,复制产生的CID Code,然后回到MDK开发环境中的菜单栏FileLicense Managemant 中,把刚刚在注册机复制到的CID Code粘贴到New License ID Code(LIC):框中,然后点击 Add LIC,点击close,大功告成:)。野火淘宝店:http:/(点我)-第 16 页-有疑问就到: 3、如何、如何新新建工程模板建工程模板 3.

14、1 获取获取 ST 库源码库源码 在新建工程模板之前,我们首先需要获取到st库的源码,源码可从st的官方网站下载到,也可在野火 M3光盘目录下:2-程序+教程第一部分-库开发初级篇 找到,里面有V3.0.0和V3.5.0版本的库,这两个库的版本区别很小,几乎可以兼容。在这里我们以V3.5.0来新建我们的工程模板。3.2 开始新建工程开始新建工程 点击桌面UVision4图标,启动软件。如果是第一次使用的话会打开一个自带的工程文件,我们可以通过工具栏Project-Close Project选项把它关掉。在工具栏Project-New Vision Project新建我们的工程文件,我们将新建的

15、工程文件保存在桌面的STM32-TemplateUSER文件夹下(先在电脑桌面上新建一个STM32-Template文件夹,在STM32-Template里面新建一个USER文件夹),文件名取为STM32-DEMO(英文DEMO的意思是例子),名字可以随便取,点击保存。野火淘宝店:http:/(点我)-第 17 页-有疑问就到: SRAM,512K Flash,属于高集成度的芯片。按如下选择即可。野火淘宝店:http:/(点我)-第 18 页-有疑问就到: 野火淘宝店:http:/(点我)-第 19 页-有疑问就到: Microcontroller Software Interface Sta

16、ndard,是ARM Cortex微控制器软件接口标准,是ARM公司为芯片厂商提供的一套通用的且独立于芯片厂商的处理器软件接口。Uotput用来保存软件编译后输出的文件,Listing用来存放一些编译过程中产生的文件,具体可不用了解。把野火 M3光盘目录下:3-ST 库 3.5.0 源码3.5.03.5.0STM32F10 x_StdPeriph_Lib_V3.5.0LibrariesSTM32F10 x_StdPeriph_Driver 的 inc 跟 src 这两个文件夹拷贝到STM32-TemplateFWlib文件夹中。野火淘宝店:http:/(点我)-第 20 页-有疑问就到: M3

17、光盘目录下:2-程序+教程第一部分-库开发初级篇3-ST 库 3.5.0源码3.5.03.5.0STM32F10 x_StdPeriph_Lib_V3.5.0ProjectSTM32F10 x_StdPeriph_Template 下的 main.c、stm32f10 x_conf.h、stm32f10 x_it.h、stm32f10 x_it.c、system_stm32f10 x.c 拷贝到 STM32-TemplateUSER 目录下。stm32f10 x_it.h、和stm32f10 x_it.c这两个文件里面是中断函数,里面为空,并没有写任何的中断服务程序。stm32f10 x_co

18、nf.h是用户需要配置的头文件,当我们需要用到芯片中的某部分外设的驱动时,我们只需要在该文件下将该驱动的头文件包含进来即可,片上外设的驱动在src文件夹中,inc文件夹里面是它们的头文件。这三个文件是用户在编程时需要修改的文件,其他库文件一般不需要修改。system_stm32f10 x.c是ARM公司提供的符合CMSIS标准的库文件,等下我们把这个文件移动到 STM32-TemplateCMSIS这个文件夹中。野火淘宝店:http:/(点我)-第 21 页-有疑问就到: M3光盘目录下:2-程序+教程第一部分-库开发初级篇3-ST 库3.5.0 源码3.5.03.5.0STM32F10 x_

19、StdPeriph_Lib_V3.5.0LibrariesCMSISCM3DeviceSupportSTSTM32F10 xstartuparm 的全部文件拷贝到 STM32-TemplateCMSISstartup(需先在CMSIS新建好startup文件夹)文件夹下。这些是用汇编写的启动文件。野火 M3开发板用的CPU是STM32F103VET6,有512K Flash,属于大容量的,所以等下我们把startup_stm32f10 x_hd.s添加到我们的工程中。根据ST的官方资料:Flash在16 32 Kbytes为小容量,64 128 Kbytes 为中容量,256 512 Kbyt

20、es为大容量,不同大小的Flash对应的启动文件不一样,这点要注意。(2)把野火 M3光盘目录下:2-程序+教程第一部分-库开发初级篇3-ST 库 3.5.0 源码3.5.03.5.0STM32F10 x_StdPeriph_Lib_V3.5.0LibrariesCMSISCM3CoreSupport 的core_cm3.c和core_cm3.h也拷贝到 STM32-TemplateCMSIS 文件夹下。(3)把野火 M3光盘目录下:2-程序+教程第一部分-库开发初级篇3-ST 库3.5.0 源码 野火淘宝店:http:/(点我)-第 22 页-有疑问就到: 文件夹下。此时我们新进的工程目录如

21、下所示 野火淘宝店:http:/(点我)-第 23 页-有疑问就到: 24 页-有疑问就到: Group选项,新建四个组,分别命名为STARTCODE、USER、FWlib、CMSIS。STARTCODE从名字就可以看得出我们是用它来放我们的启动代码的,USER用来存放用户自定义的应用程序,FWlib用来存放库文件,CMSIS用来存放M3系列单片机通用的文件。接下来我们往我们这些新建的组中添加文件,双击哪个组就可以往哪个组里面添加文件。我们在STARTCOKE里面添加startup_stm32f10 x_hd.s,在USER组里面添加main.c 和 stm32f10 x_it.c 这两个文件

22、,在FWlib组里面添加src里面的全部驱动文件,当然,src里面的驱动文件也可以需要哪个就添加哪个。这里将它们全部添加进去是为了后续开发的方便,况且我们可以通过配置stm32f10 x_conf.h 这个头文件来选择性添加,只有在stm32f10 x_conf.h文件中配置的文件才会被编译。在CMSIS里面添加core_cm3.c 和 system_stm32f10 x.c文件。注意,这些组里面添加的都是汇编文件跟C文件,头文件是不需要添加的。最终效果如下图:野火淘宝店:http:/(点我)-第 25 页-有疑问就到: MDK 的配置选项,点击工具栏中的魔术棒按钮,在弹出来的窗口中选中 野火

23、淘宝店:http:/(点我)-第 26 页-有疑问就到: Select Folder for Objects.设置编译后输出文件保存的位置。同时把 Create HEX File 和 Browse information 这两个选项框也选上。同样在 Listing 这个选项卡中,我们也点击 Select Folder listings定位到模板中的 Listing 文件夹。野火淘宝店:http:/(点我)-第 27 页-有疑问就到: Define 里面输入添加USE_STDPERIPH_DRIVER,STM32F10X_HD。添加USE_STDPERIPH_DRIVER是为了屏蔽编译器的默认搜

24、索路径屏蔽编译器的默认搜索路径,转而,转而使用我们添加到工程中的ST的库,添加STM32F10X_HD是因为我们用的芯片是大容量的,添加了STM32F10X_HD这个宏之后,库文件里面为大容量定义的寄存器我们就可以用了。芯片是小或中容量的时候宏要换成STM32F10X_LD或者STM32F10X_MD。其实不管是什么容量的,我们只要添加上STM32F10X_HD这个宏即可,当你用小或者中容量的芯片时,那些为大容量定义的寄存器我不去访问就是了,反正也访问不了。在 Include Paths 栏点击,在这里添加库文件的搜索路径,这样就可以屏蔽掉默认的搜索路径。但当编译器在我们指定的路径下 搜索不到

25、的话还是会回到标准目录去搜索,就像有些ANSIC C 的库文件,如 stdin.h、stdio.h。野火淘宝店:http:/(点我)-第 28 页-有疑问就到: main.c 文件。因为刚刚我们的 main.c 文件是从官方库里面复制过来的,里面有许多的东西我们是不需要的,为了简化 main.c 文件,我们将修改如下。/*(C)COPYRIGHT 2012 WildFire Team*文件名 :main.c *描述 :用 3.5.0 版本建的工程模板。*实验平台:野火 STM32 开发板 *库版本 :ST3.5.0 *作者 :wildfire team *论坛 :http:/ *淘宝 :htt

26、p:/ */#include stm32f10 x.h /*函数名:main 野火淘宝店:http:/(点我)-第 29 页-有疑问就到: :主函数 *输入 :无 *输出 :无 */int main(void)while(1);/add your code here _。/*(C)COPYRIGHT 2012 WildFire Team*END OF FILE*/至此,我们的工程模板就建成了。学会新建工程,是学习 stm32 的第一步。3.3 硬件调试配置硬件调试配置 这个工程默认的是软件仿真,如果开发板要用 J-LINK 调试的话,还需要在开发环境中做如下修改。实际上,我们开发程序的时候 8

27、0%都是在硬件上调试的。具体配置如下图所示:点击,在 Debug 选项里 野火淘宝店:http:/(点我)-第 30 页-有疑问就到: DebugSettingFlash download 中我们设置成如下:到了这里就算是大功告成了。如果在新建工程中遇到什么问题,先不要急,可先参考野火 M3 光盘目录下提供的已经新建好的工程模板。野火淘宝店:http:/(点我)-第 31 页-有疑问就到: 4、初、初识识 STM32STM32 库库 本章通过简单介绍 STM32 库的各个文件及其关系,让读者建立 STM32 库的概念,看完后对库有个总体印象即可,在后期实际开发时接触了具体的库时,再回头看看这一

28、章,相信你对 STM32 库又会有一个更深刻的认识。4.1 STM32 神器之库开神器之库开发发 4.1.1 什么是什么是 STM32 库?库?在 51 单片机的程序开发中,我们直接配置 51 单片机的寄存器,控制芯片的工作方式,如中断,定时器等。配置的时候,我们常常要查阅寄存器表,看用到哪些配置位,为了配置某功能,该置 1 还是置 0。这些都是很琐碎的、机械的工作,因为 51 单片机的软件相对来说较简单,而且资源很有限,所以可以直接配置寄存器的方式来开发。STM32 库是由 ST 公司针对 STM32 提供的函数接口函数接口,即,即 API(Application Program Inter

29、face),开发者可调用这些函数接口来配置STM32 的寄存器,使开发人员得以脱离最底层的寄存器操作,有开发快速,易脱离最底层的寄存器操作,有开发快速,易于阅读,维护成本低等优点。于阅读,维护成本低等优点。当我们调用库的 API 的时候可以不用挖空心思去了解库底层的寄存器操作,就像当年我们学习 C 语言的时候,用 prinft()函数时只是学习它的使用格式,并没有去研究它的源码实现,如非必要,可以说是老死不相往来。实际上,库是架设在寄存器与用户驱动层之间的代码,向下处理与寄存器库是架设在寄存器与用户驱动层之间的代码,向下处理与寄存器直接相关的配置,向上为用户提供配置寄存器的接口。直接相关的配置

30、,向上为用户提供配置寄存器的接口。库开发方式与直接配置寄存器方式的区别见错误!未找到引用源。错误!未找到引用源。4-1。野火淘宝店:http:/(点我)-第 32 页-有疑问就到: 4-1 4.1.2 为什么采用库来开发?为什么采用库来开发?对于 STM32,因为外设资源丰富,带来的必然是寄存器的数量和复杂度的增加,这时直接配置寄存器方式的缺陷就突显出来了:1)开发速度慢 2)程序可读性差 这两个缺陷直接影响了开发效率,程序维护成本,交流成本。库开发方式则正好弥补了这两个缺陷。而坚持采用直接配置寄存器的方式开发的程序员,会列举以下原因:1)更直观 2)程序运行占用资源少 初学 STM32 的读

31、者,普遍因为第一个原因而选择以直接配置寄存器的方法来学习。认为这种方法直观,能够了解到是配置了哪些寄存器,怎样配置寄存器。事实上,库函数的底层实现恰恰是直接配置寄存器方式的最佳例子,想深事实上,库函数的底层实现恰恰是直接配置寄存器方式的最佳例子,想深入了解芯片是如何工作的话,只要追踪到库的最底层实现就能理解,相信你会入了解芯片是如何工作的话,只要追踪到库的最底层实现就能理解,相信你会为它严谨、优美的实现方式而陶醉。为它严谨、优美的实现方式而陶醉。要想修炼要想修炼 C 语言,就从语言,就从 ST 的库开始吧。的库开始吧。这将在 错误!未找到引用源。错误!未找到引用源。进行详细分析。野火淘宝店:h

32、ttp:/(点我)-第 33 页-有疑问就到: STM32 有充足的资源,权衡库的优势与不足,绝大部分时候,我们愿意牺牲一点资源,选择库开发。一般只有在对代码运行时间要求极苛刻的地方,才用直接配置寄存器的方式代替,如频繁调用的中断服务函数。对于库开发与直接配置寄存器的方式,在 STM32 刚推出时引起程序员的激烈争论,但是,随着 ST 库的完善与大家对库的了解,更多的程序员选择了库开发。本书采用 STM32 的库进行讲解,既介绍如何使用库接口,也讲解库接口的实现方式。使读者既能利用库进行快速开发,也能深入了解 STM32 的工作原理。为进一步解答读者为什么使用库开发,请读者先思考一下为会么采用

33、 c 语言开发软件而不是采用汇编。相比之下,可以发现调用库接口开发与直接配置寄存器开发的关系,犹如 c 语言与汇编的关系。见表 4-1 和表 4-2。据某无从考证的 IT 大师说过,“一切计算机科学的问题都可以用分层来解“一切计算机科学的问题都可以用分层来解决。”决。”从汇编到 c,从直接配置寄存器到使用库,从裸机到系统,从操作系统到应用层软件,无不体现着这样的分层思想。开发的软件多了,跨越的软件层次多了,会深刻地认同他这句话,分层思想在软件开发上体现得淋漓尽致,分层使得问题变得更简单,使得能够屏蔽下层实现方式的差异,使得软件开发变成简单的调用函数接口,而不用管它的实现,大大提高效率。野火淘宝

34、店:http:/(点我)-第 34 页-有疑问就到: STM32 这样高性能的芯片,我想我们会愿意承受分层带来的缺点的。表 4-1 表 4-2 野火淘宝店:http:/(点我)-第 35 页-有疑问就到: STM32 结构及库层次关系结构及库层次关系 4.2.1 CMSIS 标准标准 我们知道由 ST 公司生产的 STM32 采用的是 Cortex-M3内核内核,内核是整个微控制器的 CPU。该内核是 ARM 公司设计的一个处理器体系架构。ARM 公司并不生产芯片,而是出售其芯片技术授权。ST 公司或其它芯片生产厂商如 TI,负责设计的是在内核之外的部件,被称为核外外设核外外设或片上外设、设备

35、外设片上外设、设备外设。如芯片内部的模数转换外设 ADC、串口 UART、定时器 TIM 等。内核与外设,如同 PC 上的 CPU 与主板、内存、显卡、硬盘的关系。见错误!未找到引用错误!未找到引用源。源。图 4-2 因为基于 Cortex 的某系列芯片采用的内核都是相同的,区别主要为核外的片上外设的差异,这些差异却导致软件在同内核,不同外设的芯片上移植困难。为了解决不同的芯片厂商生产的 Cortex 微控制器软件软件 的兼容性问题,ARM 与芯片厂商建立了 CMSIS 标准(Cortex MicroController Software Interface Standard)。所谓 CMSI

36、S 标准,实际是新建了一个软件抽象层。见错误!未找到引用错误!未找到引用源。源。野火淘宝店:http:/(点我)-第 36 页-有疑问就到: 标准中最主要的为 CMSIS 核心层,它包括了:内核函数层:其中包含用于访问内核寄存器的名称、地址定义,主要由ARM 公司提供。设备外设访问层:提供了片上的核外外设的地址和中断定义,主要由芯片生产商提供。可见 CMSIS 层位于硬件层与操作系统或用户层之间,提供了与芯片生产商无关的硬件抽象层,可以为接口外设、实时操作系统提供简单的处理器软件接口,屏蔽了硬件差异,这对软件的移植是有极大的好处的。STM32 的库,就是按照 CMSIS 标准建立的。野火淘宝店

37、:http:/(点我)-第 37 页-有疑问就到: 库目录库目录、文件简介、文件简介 STM32 的 3.5 版库可以从官网获得,也可以直接从本书的附录光盘得到。本书主要采用最新版的 3.5 库文件,在高级篇的章节有部分代码是采用 3.0 的库开发的,因为 3.5 与 3.0 的库文件兼容性很好,对于旧版的代码我们仍然使用用 3.0 版的。解压后进入库目录:stm32f10 x_stdperiph_libSTM32F10 x_StdPeriph_Lib_V3.5.0 各文件夹内容说明见图 4-1 图 4-1 Libraries文件夹下是驱动库的源代码及启动文件。Project 文件夹下是用驱动

38、库写的例子跟一个工程模板。还有一个已经编译好的HTML文件,是库帮助文档库帮助文档,主要讲的是如何使用驱动库来编写自己的应用程序。说得形象一点,这个HTML就是告诉我们:ST公司已经为你写好了每个外设的驱动了,想知道如何运用这些例子就来向我求救吧。不幸的是,这个帮助文档是英文的,这对很多英文不好的朋友来说是一个很大的障碍。但野火要告诉大家,英文仅仅是一种工具,绝对不能让它成为我们学习的障碍。其实这些英文还是很简单的,我们需要的是拿下它的勇气。驱动示例和工程模板 库源码及启动文件 库使用帮助文档 库版本更新说明 基于 ST官方开发板的例程 野火淘宝店:http:/(点我)-第 38 页-有疑问就

39、到: 2.x 版本的,但 3.x 以上版本的目录结构和库函数接口跟 2.x 版本的区别还是比较大的,这点大家要注意下。在使用库开发时,我们需要把libraries目录下的库函数文件添加到工程中,并查阅库帮助文档库帮助文档来了解 ST 提供的库函数,这个文档说明了每一个库函数的使用方法。进入Libraries文件夹看到,关于内核与外设的库文件分别存放在CMSIS和STM32F10 x_StdPeriph_Driver文件夹中。LibrariesCMSISCM3文件夹下又分为CoreSupport和DeviceSupport文件夹。4.2.2.1 core_cm3.c 文件文件 在CoreSupp

40、ort中的是位于 CMSIS 标准的核内核内设备设备函数层函数层 的 M3 核通用的源文件core_cm3.c和头文件core_cm3.h,它们的作用是为那些采用Cortex-M3 核设计 SOC 的芯片商设计的芯片外设提供一个进入 M3 内核的接口。这两个文件在其它公司的 M3 系列芯片也是相同的。至于这些功能是怎样用源码实现的,我们可以不用管它,我们只需把这个文件加进我们的工程文件即可,有兴趣的朋友可以深究。core_cm3.c文件还有一些与编译器相关条件编译语句,用于屏蔽不同编译器的差异,我们在开发时不用管这部分,有兴趣可以了解一下。里面包含了一些跟编译器相关的信息,如:RealView

41、 Compiler(RVMDK),ICC Compiler(IAR),GNU Compiler。1./*define compiler specific symbols*/2.#if defined(_CC_ARM )3.#define _ASM _asm 4.#define _INLINE _inline 5.6.#elif defined(_ICCARM_)7.#define _ASM _asm 8.#define _INLINE inline 9.#elif defined (_GNUC_ )10.#define _ASM _asm#define _INLINE inline 11.12

42、.#elif defined (_TASKING_ )13.#define _ASM _asm 使用 RVMDK 编译器时的嵌入汇编与内联函数的关键字形式 使用 IAR 编译器时的形式 野火淘宝店:http:/(点我)-第 39 页-有疑问就到: _INLINE inline 15.#endif 较重要的是在core_cm3.c文件中包含了 stdin.h 这个头文件,这是一个ANSI C 文件,是独立于处理器之外的,就像我们熟知的 C 语言头文件 stdio.h 文件一样。位于 RVMDK 这个软件的安装目录下,主要作用是提供一些新类型定义,如:1./*exact-width signed

43、integer types*/2.typedef signed char int8_t;3.typedef signed short int int16_t;4.typedef signed int int32_t;5.typedef signed _int64 int64_t;6.7./*exact-width unsigned integer types*/8.typedef unsigned char uint8_t;9.typedef unsigned short int uint16_t;10.typedef unsigned int uint32_t;11.typedef unsi

44、gned _int64 uint64_t;这些新类型定义屏蔽了在不同芯片平台时,出现的诸如 int 的大小是 16位,还是 32 位的差异。所以在我们以后的程序中,都将使用新类型如int8_t、int16_t 在稍旧版的程序中还可能会出现如u8、u16、u32这样的类型,请尽量避免这样使用,在这里提出来是因为初学时如果碰到这样的旧类型让人一头雾水,而且在以新的库建立的工程中是无法追踪到u8、u16、u32这些的定义的。core_cm3.c跟启动文件一样都是底层文件,都是由 ARM 公司提供的,遵守 CMSIS 标准,即所有 CM3 芯片的库都带有这个文件,这样软件在不同的CM3 芯片的移植工作

45、就得以简化。4.2.2.2 system_stm32f10 x.c 文件文件 在DeviceSupport文件夹下的是启动文件、外设寄存器定义外设寄存器定义&中断向量中断向量定义层定义层 的一些文件,这是由 ST 公司提供的。见图 4-2 野火淘宝店:http:/(点我)-第 40 页-有疑问就到: 4-2 system_stm32f10 x.c,是由 ST 公司提供的,遵守 CMSIS 标准。该文件的功能是设置系统时钟和总线时钟,M3 比 51 单片机复杂得多,并不是说我们外部给一个 8M 的晶振,M3 整个系统就以 8M 为时钟协调整个处理器的工作。我们还要通过 M3 核的核内寄存器来对

46、8M 的时钟进行倍频,分频,或者使用芯片内部的时钟。所有的外设都与时钟的频率有关,所以这个文件的时钟配置是很关键的。system_stm32f10 x.c在实现系统时钟的时候要用到 PLL(锁相环),这就需要操作寄存器,寄存器都是以存储器映射的方式来访问的,所以该文件中包含了stm32f10 x.h 这个头文件。4.2.2.3 stm32f10 x.h 文件文件 stm32f10 x.h 这个文件非常重要,是一个非常底层的文件。所有处理器厂商都会将对内存的操作封装成一个宏,即我们通常说的寄存器,并且把这些实现封装成一个系统文件,包含在相应的开发环境中。这样,我们在开发自己的应用程序的时候只要将

47、这个文件包含进来就可以了。各种STM32 型号的启动文件 配置时钟频率相应的头文件 设备外设访问层,主要配置时钟频率 定义寄存器的地址及使用的结构体封装 野火淘宝店:http:/(点我)-第 41 页-有疑问就到: 启动文件启动文件 LibrariesCMSISCoreCM3startuparm文件夹下是由汇编编写的系统启动文件,不同的文件对应不同的芯片型号,在使用时要注意。见图 4-3 图 4-3 文件名的英文缩写的意义如下:cl:互联型产品,stm32f105/107 系列 vl:超值型产品,stm32f100 系列 xl:超高密度(容量)产品,stm32f101/103 系列 ld:低密

48、度产品,FLASH 小于 64K md:中等密度产品,FLASH=64 or 128 hd:高密度产品,FLASH 大于 128 野火野火 M3 开发板开发板中用的芯片是STM32F103VET6,64KRAM,512KROM,是属于高密度产品,所以启动文件要选择startup_stm32f10 x_hd.s。启动文件是任何处理器在上点复位之后最先运行的一段汇编程序。在我们编写的 c 语言代码运行之前,需要由汇编为 c 语言的运行建立一个合适的环境,接下来才能运行我们的程序。所以我们也要把启动文件添加进我们的的工程中去。总的来说,启动文件的作用是:野火淘宝店:http:/(点我)-第 42 页

49、-有疑问就到: SP;2.初始化程序计数器指针 PC;3.设置堆、栈的大小;4.设置异常向量表的入口地址;5.配置外部 SRAM 作为数据存储器(这个由用户配置,一般的开发板可没有外部 SRAM);6.设置 C 库的分支入口_main(最终用来调用 main 函数);7.在 3.5 版的启动文件还调用了在system_stm32f10 x.c文件中的SystemIni()函数配置系统时钟,在旧版本的工程中要用户进入main 函数自己调用SystemIni()函数。4.2.2.5 STM32F10 x_StdPeriph_Driver 文件夹文件夹 LibrariesSTM32F10 x_Std

50、Periph_Driver文件夹下有inc(include 的缩写)跟src(source 的简写)这两个文件夹,这都属于 CMSIS 的设备外设函设备外设函数数 部分。src里面是每个设备外设的驱动程序,这些外设是芯片制造商在Cortex-M3 核外加进去的。进入libraries目录下的STM32F10 x_StdPeriph_Driver文件夹,见图 4-4。野火淘宝店:http:/(点我)-第 43 页-有疑问就到: 4-4 在src 和inc文件夹里的就是 ST 公司针对每个 STM32 外设而编写的库函数文件,每个外设对应一个.c 和.h 后缀的文件。我们把这类外设文件统称为:st

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 实用范文 > 工作总结

copyright@ 2008-2023 wnwk.com网站版权所有

经营许可证编号:浙ICP备2024059924号-2