掌握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