STM32F1固件库详解

掌握STM32的估计库的构成和每个库文件的作用,对我们使用库非常有帮助,我们这里以3.5版本的库来分析。
按照内核和外设的关系,我把库分成两个部分:内核相关处理器相关

_________________
|跟CM3(内核)相关的|
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
cor_cm3.h
这个头文件实现了:1、内核结构体寄存器定义 2、内核寄存器内存映射 3、内存寄存器位定义。跟处理器相关的头文件stm32f10x.h实现的功能一样,一个是
针对内核的寄存器,一个是针对内核之外,即处理器的寄存器。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
misc.h :内核应用函数库头文件
misc.c:内核应用函数库
在CM3这个内核里面还有一些功能组件,如NVIC、SCB、ITM、MPU、CoreDebug,CM3带有非常丰富的功能组件,但是芯片厂商在设计MCU的时候
有一些并不是非要不可的,是可裁剪的,比如MPU、ITM等在STM32里面就没有。其中NVIC在每一个CM3内核的单片机中都会有,但都汇被裁剪,只能
是CM3内核的一个子集。在NVIC里面还有一个SysTick,是一个系统定时器,可以提供时基,一般为操作系统定时器所用。这两个文件提供了操作这些
组件的函数,并可以在CM3内核单片机直接移植。处理器中与这两个文件相对应的就是:stm32f10x_xxx.h和stm32f10x_xxx.c。
_____________
|跟处理器相关的:|即内核之外,由SOC芯片厂商添加的
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
启动文件
在F1大容易产品中用的是这个:startup_stm32f10x_hd.s,该文件由汇编编写,主要作用是:
1、设置初始SP 
2、设置初始PC=Reset_Handler
3、Set the vector table entries with the exceptions ISR address
     意译过来就是:设置向量表的入口地址,并用异常地址初始化向量表。向量表里面保存的是异常响应的时候服务例程的入口地址。     STM32把向量表放在0地址开始的code区。
4、调用库函数SystemInit,把系统时钟配置成72M,SystemInit在库文件system_stm32f10.c定义
5、跳转到标号_mian,最终来到C的世界。
我们着重需要理解的就是第四和第五点
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
stm32f10x.h
这个头文件非常重要,可以说上帝之手。这个头文件实现了:1、处理器外设寄存器的结构体定义 2、处理器外设的内存映射 3、处理器外设寄存器的位定义
关于1和2我们暂时知道一概念即可,在其他的章节会有详细的说明。3:处理器外设寄存器的位定义,这个非常重要,具体是什么意思呢。我们知道一个寄存器
有很多个位,每个位写1或者写0的功能都是不一样的,处理器外设寄存器的位定义就是把外设的每个寄存器的每一个位写1的16进制数定义成一个宏,宏名即
用该位的功能名称表示,如果我们操作寄存器要开启某一个功能的话,就不用自己亲自去算这个值是多少,可以直接到这个头文件里面找。我们以片上外设
ADC为例,假设我们要启动ADC开始转换,根据手册我们知道是要控制ADC_CR2寄存器的位0:ADON,即往位0写1即可,即:ADC->CR2=0x00000001;
这是一般的操作方法。现在这个头文件里面有关于ADON位的位定义:#define  ADC_CR2_ADON     ((uint32_t)0x00000001),有了这个位定义,我们刚刚的
代码就变成了:ADC->CR2=ADC_CR2_ADON。这对于我们编程是何其方便,简直就是天降救星,感激之情无以言表啊。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
system_stm32f10x.c
这个文件的作用是里面实现了各种常用的系统时钟设置函数,有72M,56M,48,36,24,8M,我们使用的是是把系统时钟设置成72M。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
stm32f10x_xxx.h:外设xxx应用函数库头文件
这里面主要是实现外设某一功能的结构体,比如通用定时器有很多功能,有定时功能,有输出比较功能,有输入捕捉功能,而通用定时器有非常多的寄存器
要实现某一个功能,比如定时功能,我们根本不知道具体要操作哪些寄存器,这个头文件就为我们打包好了要实现某一个功能的寄存器,是以机构体的形式
定义的,比如通用定时器要实现一个定时的功能,我们只需要初始化TIM_TimeBaseInitTypeDef这个结构体里面的成员即可,里面的成员就是定时所需要
操作的寄存器。 具体的初始化函数在对应的stm32f10x_xxx.c文件中。
stm32f10x_xxx.c:外设xxx应用函数库
这里面写好了操作xxx外设的所有常用的函数,我们使用库编程的时候,使用的最多的就是这里的函数。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------

http://www.chuxue123.com/thread-9882-1-1.html

时间: 2024-10-22 04:26:16

STM32F1固件库详解的相关文章

STM32固件库详解

本文转自http://www.cnblogs.com/emouse/archive/2011/11/29/2268441.html 1.1 基于标准外设库的软件开发 1.1.1 STM32标准外设库概述 STM32标准外设库之前的版本也称固件函数库或简称固件库,是一个固件函数包,它由程序.数据结构和宏组成,包括了微控制器所有外设的性能特征.该函数库还包括每一个外设的驱动描述和应用实例,为开发者访问底层硬件提供了一个中间API,通过使用固件函数库,无需深入掌握底层硬件细节,开发者就可以轻松应用每一

Struts标签库详解【3】

struts2标签库详解 要在jsp中使用Struts2的标志,先要指明标志的引入.通过jsp的代码的顶部加入以下的代码: <%@taglib prefix="s" uri="/struts-tags" %> If elseif  else 描述: 执行基本的条件流转. 参数: 名称 必需 默认 类型 描述 备注 test 是 boolean 决定标志里的内容是否显示的表达式 else标志没有这个参数 id 否 Object/String 用来标识元素的

Lua的协程和协程库详解

我们首先介绍一下什么是协程.然后详细介绍一下coroutine库,然后介绍一下协程的简单用法,最后介绍一下协程的复杂用法. 一.协程是什么? (1)线程 首先复习一下多线程.我们都知道线程——Thread.每一个线程都代表一个执行序列. 当我们在程序中创建多线程的时候,看起来,同一时刻多个线程是同时执行的,不过实质上多个线程是并发的,因为只有一个CPU,所以实质上同一个时刻只有一个线程在执行. 在一个时间片内执行哪个线程是不确定的,我们可以控制线程的优先级,不过真正的线程调度由CPU的调度决定.

php中的PDO函数库详解

PHP中的PDO函数库详解 PDO是一个“数据库访问抽象层”,作用是统一各种数据库的访问接口,与mysql和mysqli的函数库相比,PDO让跨数据库的使用更具有亲和力:与ADODB和MDB2相比,PDO更高效.目前而言,实现“数据库抽象层”任重而道远,使用PDO这样的“数据库访问抽象层”是一个不错的选择. PDO中包含三个预定义的类 PDO中包含三个预定义的类,它们分别是 PDO.PDOStatement 和 PDOException. 一.PDO PDO->beginTransaction(

struts2标签库详解

原文:struts2标签库详解 源代码下载地址:http://www.zuidaima.com/share/1781606927846400.htm 要在jsp中使用Struts2的标志,先要指明标志的引入.通过jsp的代码的顶部加入以下的代码: <%@taglib prefix="s" uri="/struts-tags" %> If elseif  else 描述: 执行基本的条件流转. 参数: 名称 必需 默认 类型 描述 备注 test 是 bo

C++11 std::chrono库详解

所谓的详解只不过是参考www.cplusplus.com的说明整理了一下,因为没发现别人有详细讲解. chrono是一个time library, 源于boost,现在已经是C++标准.话说今年似乎又要出新标准了,好期待啊! 要使用chrono库,需要#include<chrono>,其所有实现均在std::chrono namespace下.注意标准库里面的每个命名空间代表了一个独立的概念.所以下文中的概念均以命名空间的名字表示! chrono是一个模版库,使用简单,功能强大,只需要理解三个

PHP PDO函数库详解

文章来源:PHP开发学习门户 地址:http://www.phpthinking.com/archives/565 PDO是一个"数据库访问抽象层",作用是统一各种数据库的访问接口,与mysql和mysqli的函数库相比,PDO让跨数据库的使用更具有亲和力:与ADODB和MDB2相比,PDO更高效. 目前而言,实现"数据库抽象层"任重而道远,使用PDO这样的"数据库访问抽象层"是一个不错的选择. 目前而言,实现"数据库抽象层"

python WEB接口自动化测试之requests库详解

1.Get请求 前提: requests库是python的第三方库,需要提前安装哦,可以直接用pip命令:`python –m pip install requests` 按照惯例,先将requests库的属性打印出来,看看哪些属性. >>> import requests >>> dir(requests) #查看requests库的属性 ['ConnectionError', 'HTTPError', 'NullHandler', 'PreparedRequest'

Struts标签库详解【1】

struts2标签详解 要在jsp中使用Struts2的标志,先要指明标志的引入.通过jsp的代码的顶部加入以下的代码: <%@taglib prefix="s" uri="/struts-tags" %> If elseif  else 描述: 执行基本的条件流转. 参数: 名称 必需 默认 类型 描述 备注 test 是 boolean 决定标志里的内容是否显示的表达式 else标志没有这个参数 id 否 Object/String 用来标识元素的i