stm32教程

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

野火20万字PDF教程,40多个实验例程,帮您助赢STM321/13详解用STM32官方库来开发自己的应用程序作者野火嵌入式开发工作室E-Mailfirestm32@foxmail.com淘宝=1008硬件平台野火STM32开发板库版本ST3.0.0这里用的库是ST3.0.0版本,库的源代码可从ST的官网下载到。(网址可能会有变动)首先,让我们来分析下这个库的目录结构,如下图所示:Libraries文件夹下是驱动库的源代码跟启动文件。Project文件夹下是用驱动库写的例子跟一个工程模板。还有一个已经编译好的HTML文件,主要讲的是如何使用野火20万字PDF教程,40多个实验例程,帮您助赢STM322/13驱动库来编写自己的应用程序,说得形象一点,这个HTML就是告诉我们:ST公司已经为你写好了每个外设的驱动了,想知道如何运用这些例子就来向我求救吧。既然ST给我们提供的美味大餐(驱动源码)就在眼前,我又何必去找品尝大餐的方法呢,还不如直接一头直接扎进大餐中,大吃一顿再说(直接阅读库的源码)。但当我们吃的有点呛口的时候回去找下方法还是很好的。其他三个文件作用不大,我们可以不用管它。接下来我们重点来分析下Librarie文件夹下的内容。Libraries\STM32F10x_StdPeriph_Driver文件夹下有inc(include的缩写)跟src(source的简写)这两个文件,src里面是每个片上外设的驱动程序,这些外设当中很多是芯片制造商在Cortex-M3核上加进去的,Cortex-M3核自带的外设是通用的,放在CMSIS文件夹下。如下图所示:Libraries\STM32F10x_StdPeriph_Driver\inc文件夹下是每个驱动文件对应的头文件。当我们的应用程序需要用到某个外设的驱动程序的话只需将它的头文件包含进我们的应用程序即可。野火20万字PDF教程,40多个实验例程,帮您助赢STM323/13Libraries\CMSIS\Core\CM3\startup\arm文件夹下是三个汇编编写的系统启动文件,分别对应于小(LD)中(MD)大(HD)容量Flash的单片机,在我们新建工程的时候需要将它包含到我们的工程中去。启动文件是任何处理器在上点复位之后最先运行的一段汇编程序。启动文件的作用是:1、初始化堆栈指针SP,2、初始化程序计数器指针PC,3、设置异常向量表的入口地址,4、配置外部SRAM作为数据存储器(这个由用户配置,一般的开发板可没有外部SRAM),5、设置C库的分支入口__main(最终用来调用main函数)。如若要详细了解启动文件的详细过程可参考如下网友的文章:。搞不明白也没太大关系,我们新建工程的时候只要将它包含进来就可以了。Libraries\CMSIS\Core\CM3文件夹下除了放有startup启动文件外,还有这几个文件core_cm3.c、core_cm3.h,stm32f10x.h、system_stm32f10x.c,system_stm32f10x.h。野火20万字PDF教程,40多个实验例程,帮您助赢STM324/13core_cm3.c是CMSISCortex-M3核外设接入层的源文件,在所有符合CMSIS标准的Cortex-M3核系列单片机都适用,独立于芯片制造商,由ARM公司提供。它的作用是为那些采用Cortex-M3核设计SOC的芯片商设计的芯片外设提供一个进入M3内核的接口。至于这些功能是怎样用源码实现的,我们可以不用管它,我们只需把这个文件加进我们的工程文件即可。该文件还定义了一些与编译器相关的符号。在文件中包含了stdin.h这个头文件,这是一个ANSICC文件,是独立于处理器之外的,就像我们熟知的C语言头文件stdio.h文件一样。位于RVMDK这个软件的安装目录下,主要作用是提供一些类型定义,如:core_cm3.c跟启动文件一样都是底层文件,都由ARM公司提供,遵守CMSIS标准,即所有CM3芯片的库都带有这个文件,这样软件在不同的CM3器件的移植工作就得以化简。core_cm3.c里面包含了一些跟编译器相关的信息,如:RealViewCompiler,ICCCompiler,GNUCompiler。core_cm3.h这个文件实现了CM3内核里面野火20万字PDF教程,40多个实验例程,帮您助赢STM325/13的NVIC和SysTick这两个资源的所有功能,NVIC是嵌套向量中断控制器,SysTick是CM3内核里面的一个简单的定时器,其时钟由外部时钟源(STCLK)或内核时钟(FCLK)来提供,一般我们在编程的时候选择FCLK作为它的运行时钟,FCLK由SYSCLK八分频得到。NVIC的寄存器是以存储器映射的方式来访问的,所以core_cm3.h头文件中也包含了寄存器的存储映射和一些宏声明。system_stm32f10x.c的性质跟core_cm3.c是一样的,也是由ARM公司提供,遵守CMSIS标准。该文件的功能是根据HSE或者HSI设置系统时钟和总线时钟(AHB、APB1、APB2总线)。系统时钟可以由HSI单独提供,也可以让HSI二分频之后经过PLL(锁相环)提供,也可以由HSE经过PLL之后获得。具体可参考STM32的时钟树:(该图截自STM32参考手册中文版47页)。注意:system_stm32f10x.c文件只是设置了系统时钟和总线时钟,至于那些外设的时钟是在rcc.c这个文件中实现的。因为各个SOC厂商在CM3内核的基础上添加的外设工作的速率是不一样的,有的是高速外设(时钟经过APB2高速总线获得),野火20万字PDF教程,40多个实验例程,帮您助赢STM326/13有的为低速外设(时钟经过APB1低速总线获得),所以这一功能的实现放在芯片驱动文件夹src/rcc.c下。这篇文档分析的是ST(意法半导体)公司的STM32,对于其他公司的芯片可能不太一样,但是,不论是哪个厂商,系统时钟都是由ARM公司实现,为的是软件移植的方便。然后,再从系统时钟里面分频来得到各个外设的时钟。system_stm32f10x.c在实现系统时钟的时候要用到PLL(锁相环),这就需要操作寄存器,寄存器都是以存储器映射的方式来访问的,所以该文件中包含了stm32f10x.h这个头文件。stm32f10x.h这个文件非常重要,是一个非常底层的文件。以前我在学习其他单片机的时候只是纯粹地操作寄存器,但不知道寄存器到底是个神马东东。但在这里我们可以学习到寄存器,也就是内存,我们访问寄存器也就是在访问内存。它先把内存地址先强制类型转换为指针,再把该指针实现为一个宏。下面我们通过一个例子来说明这一过程(并不非常准确,寄存器也是随便取的,只是为了帮助理解)。以前我们在写应用程序时,只是这样写但为什么这样写就可以操作内存呢,其实系统为我们提供的头文件已经帮我们做了很多工作了。假如换种方式来操作寄存器,如下。这就再简单不过了。学过C语言的朋友都明白:这是将一个十六进制值通过强制类型转换为一个指针,再对这个指针进行解引用操作。假如我们在操作寄存器的时候都是用这种方法的话会有什么缺点没。当然有:1、地址容易写错2、我们需要查大量的手册来确定哪个地址对应哪个寄存器3、看起来还不好看,且容易造成编程的错误,效率低,影响开发进度。所以处理器厂商都会将对野火20万字PDF教程,40多个实验例程,帮您助赢STM327/13内存的操作封装成一个宏,即我们通常说的寄存器,并且把这些实现封装成一个系统文件,包含在相应的开发环境中。这样,我们在开发自己的应用程序的时候只要将这个文件包含进来就可以了。stm32f10x.h就是实现这么个功能的文件,并且它把这种功能发挥得更好。下面我们通过分析其源码来看看STM32是怎么样来实现其存储器映射的。要是有STM32存储系统的知识的话,对这些源码理解的会更快。关于STM32存储器系统大家可以参考《ARMCortex-M3权威指南》中文版宋岩译第五章:存储器系统,重点看83页。要是把这章的内容都理解了,那么stm32f10x.h这个文件的源码也就理解的差不多了。下面我们以RCC来说明这一功能的实现过程。RCC是英文ResetandClockControl的简写,是复位和时钟控制,是STM32片上的一个外设,这个外设里面包含了很多寄存器。ST库把这些寄存器都定义在一个结构体里面,寄存器的长度都是无符号整型32位的,如下所示:__IO在core_cm3.h这个头文件中定义,uint32_t在stdin.h这个头文件定义。stm32f10x.h这个文件中包含了core_cm3.h和stdin.h这两个头文件。如下所示:野火20万字PDF教程,40多个实验例程,帮您助赢STM328/13从上可知RCC_TypeDef这个结构体中声明了很多的变量,这些变量的名字跟RCC里面的寄存器的名字是对应的。关于RCC寄存器的具体内容可以参考《STM32参考手册中文》。但是,对变量的操作怎么转化为对寄存器的操作呢?接着往下看…………STM32是32位的CPU,其寻址空间可以达到4GB(2的32次方等于4GB),即从0X00000000到0XFFFFFFFF。这4GB的空间被分成了许多功能模块,其中地址0X40000000到0X5FFFFFFF这512M空间用于片上外设,即片上外设的寄存器区。详细内容可参考《ARMCortex-M3权威指南》中文版宋岩译,第83页。以下是代码实现RCC寄存器是如何映射的。声明片上外设的所有寄存器的起始地址,当要定义某些寄存器的地址的时候只需在这个地址上加上一定的偏移量即可。声明高速寄存器的起始地址,因为外设要高速和低速之分,这从它们的时钟频率上可以体现出来,RCC就属于高速的外设。声明RCC寄存器的开始地址,从这个地址开始的一段内存都是RCC的寄存器,具体这段内存有多大,由上面的RCC_TypeDef这个结构体的长度确定。将RCC声明为一个RCC_TypeDef*型的指针,用于指向RCC寄存器的起始地址。这样,我们就可以通过RCC这个指针来访问寄存器了。如:RCC-CR=0XFFFFFFFF;野火20万字PDF教程,40多个实验例程,帮您助赢STM329/13现在我们把上面这个例子的代码整理在一起,整体来看下。STM32有非常多的寄存器,这里只是以外设RCC来作为例子。注意,这些源码在stm32f10x.h头文件中并不是紧靠在一起的,而是每个功能模块都分开的,如全部寄存器的结构声明放在一起,外设存储器映射地址声明放在一起,外设的指针声明放在一起。我们这里把他们放在一起是为了好理解。具体情况可查看源码。stm32f10x.h头文件还包含了寄存器的位声明,要知道STM32是具有非常强大的位处理功能的,具体这里不详述,可参考《ARMCortex-M3权威指南》第五章的5.5位带操作部分。上面的RCC-CR=0XFFFFFFFF;是我们以前学习单片机时直接操作寄存器的方法,但ST官方库为我们想到了一个更绝妙的方法,就是将写到寄存器里面的值都实现为一个宏,宏名即是实现什么功能的英文描述,达到了让人一看宏名就知道往这个寄存器里面写这个宏是实现什么功能,非常的方便。当我们往寄存器里面写一个值时,实际上是操作了寄存器的所有位的值,但更绝的是在这个库里面将实现每个位功能的值也实现为一个宏。这些功能的实现都包含在相应外设的头文件中,如RCC则为野火20万字PDF教程,40多个实验例程,帮您助赢STM3210/13stm32f10x_rcc.h,ADC则为stm32f10x_adc.h。有很多网友觉得这样很多,眼花缭乱

1 / 212
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功