STM32
直播中

李宛蔓

7年用户 984经验值
私信 关注
[问答]

STM32F1固件库的每个库文件都有何作用呢

STM32F1固件库的结构是由哪些部分组成的?
STM32F1固件库的每个库文件都有何作用呢?

回帖(1)

廖宇婷

2021-11-19 14:04:58
  掌握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外设的所有常用的函数,我们使用库编程的时候,使用的最多的就是这里的函数。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分