【stm32】stm32f1代码中core_cm3、system_stm32f10x、stm32f10x_conf、stm32f10x等文件的作用

1. 前言

前面总结了好几篇文件的代码结构和相关知识,总是要实践一下。
随便找了一个以前写的Stm32的demo来练练手。
顺便先整理一下工程里面一些文件的作用,一直都是从DEMO中直接拿来用,还没有认真的理过。

  • misc.c
  • core_cm3.c/h
  • startup_stm32f10x_hd.s
  • stm32f10x_conf.h
  • stm32f10x_it.c/h
  • system_stm32f10x.c/h
  • stm32f10x.h

2. ST一些容易混淆的文件作用

2.1 ST 3.5标准库

标准库3.5可以从官网下载,也可以从CSDN(搜STM32F10x_StdPeriph_Lib_V3.5.0即可)下载。注意,要下载原版,而不是别人移植过的,这样对比你才知道改了什么。

在ST3.5库的使用中,大家会发现,除了把STM32F10x_StdPeriph_Driver的官方发布的库中的一些类似于stm32f10x_adc.c这样的stm32f10x_xxx.c和.h导入工程之外,还有另外几个文件,也需要导入工程才能使用,类似下图:
在这里插入图片描述
类似misc.c,命名比较特殊,还有core_cm3.c,system_stm32f10x.c等等?

那这几个文件,是从哪里来的?做什么用的?

让我们把这些特殊的文件列一下,缕一下来龙去脉。

  • misc.c
  • core_cm3.c/h
  • system_stm32f10x.c/h
  • startup_stm32f10x_hd.s
  • stm32f10x_conf.h
  • stm32f10x_it.c/h
  • stm32f10x.h

偷一张别人的图。
在这里插入图片描述

1. misc.c

misc.c的关系比较好理,是属于3.5标准库的一员。
因为STM32 V3.5版本的库函数中没有原来版本中单独对于NVIC(中断向量嵌套)的外设驱动,把NVIC的外设驱动放在了misc.c中,实际上是代替原来的stm32f10x_nvic.c。
从misc.c的发布位置就能看出,这个文件是和其他的stm32f10x_xxx.c是在一起的,只是名字风格不同而已。路径在:

  • STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver\src

在这里插入图片描述

2. core_cm3.c/h 和 system_stm32f10x.c/h

core_cm3.c/h和 system_stm32f10x.c/h是内核支持API,由内核公司(ARM)提供,随着3.5的标准库同步发布,路径分别在

  • STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport
  • STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x

插一段话介绍下作用:

CMSIS是Cortex微控制器软件接口标准(Cortex MicroController Software Interface Standard)的缩写,这个是ARM定制的一个用于Cortex-M系列的一个标准,主要是为了提供通用api接口来访问内核和一些片上外设,提高代码的可移植性。
CMSIS有三个层:核内外设访问层Core Peripheral Access Layer(CPAL),中间件访问层Middleware Access Layer(MWAL),设备访问层(Device Peripheral Access Layer)。
CPAL用于访问内核的寄存器和组件,如NVIC,调试系统等。该层是由ARM实现的。
MWAL用于对中间件的访问,现在该层还未实现。(也不知道所谓的中间件是什么东西)。
DPAL用于定义一些硬件寄存器的地址和一些外设访问函数,由芯片制造商实现。
CPAL层的实现就是Core_cm3.c文件,DPAL层的实现就是system_stm32f10x.c文件(似乎还应该加上外设的函数库)

3. startup_stm32f10x_hd.s

启动代码,由内核公司(ARM)提供,随着3.5的标准库同步发布,路径在:
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm
可以使用提供的,也可以自己修改。

4. stm32f10x_conf.h + stm32f10x_it.c/h

这几个文件在ST官方发布3.5库的时候,并没有放在库代码里,而是放在工程应用层代码里。
比如:

  • STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\USART\Printf
    即放在了对应的项目工程中。

这么放其实是对的,因为其他的库函数接口是不会变化的,在用户实际使用过程中是不需要改动的,但是,这几个文件,虽然也是ST提供的,但是实际使用中,要根据不同项目做改动的,是和应用有关的。

所以在实际使用中,所以只是移植了3.5库,还需要另外把这几个文件放进来。

  • stm32f10x_conf.h
    相当于是把所有的ST的3.5库的头文件都包含了一下,用户在上层调用的时候,不需要挨个去调用头文件,只需要打开这个文件的注释即可。
  • stm32f10x_it.c/h
    相当于所有中断函数入口,stm32f103的中断入口名称都是固定的,统一写在这里,方便移植。实际上,用户也可以不需要这个文件,把各自的中断函数放在各自的模块中即可,都是一样的。
5. Stm32f10x.h

这个文件比较重要,看源码分析,主要功能是
1. 依据stm32的类型(主要是flash的大小),定义各种中断向量表的顺序
2. 定义数据类型
3. 定义MCU外设相关的结构体
4. 定义外设在FLASH中的地址
5. 进行外设寄存器的位定义

那这个文件从哪来的?谁提供的?
Stm32f10x.h是ST公司提供的,在3.5的库的DeviceSupport中可以找到

  • STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x

2.2 ST HAL库

这部分在做stm32f7的时候用过,还没细整理,暂时略过。

### STM32F10x_conf.h 文件详解 #### 配置文件作用 `stm32f10x_conf.h` 是用于配置外设驱动的关键文件之一。该文件允许开发者通过调整包含的头文件来选择固件库支持的具体外设模块[^1]。 #### 示例代码结构 下面展示了一个典型的 `stm32f10x_conf.h` 的简化版本: ```c #ifndef __STM32F10X_CONF_H #define __STM32F10X_CONF_H /* Includes ------------------------------------------------------------------*/ #include "stm32f10x.h" /* Uncomment the line corresponding to the selected assert parameter */ //#define USE_FULL_ASSERT 1 /* Exported types ------------------------------------------------------------*/ /* Exported constants --------------------------------------------------------*/ /** * @brief In the following line adjust the value of External High Speed oscillator (HSE) * used in your application. * * Tip: To avoid modifying this file each time you need to use different HSE, you can define * the HSE value in your toolchain compiler preprocessor. */ #if !defined(HSE_VALUE) #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */ #endif /* HSE_VALUE */ /* Uncomment or comment out lines below based on required peripheral support */ #define USE_STDPERIPH_DRIVER // #include "stm32f10x_adc.h" // #include "stm32f10x_bkp.h" // #include "stm32f10x_can.h" // #include "stm32f10x_cec.h" // #include "stm32f10x_crc.h" // #include "stm32f10x_dac.h" // #include "stm32f10x_dbgmcu.h" // #include "stm32f10x_dma.h" // #include "stm32f10x_exti.h" // #include "stm32f10x_flash.h" // #include "stm32f10x_gpio.h" // #include "stm32f10x_i2c.h" // #include "stm32f10x_iwdg.h" // #include "stm32f10x_pwr.h" // #include "stm32f10x_rcc.h" // #include "stm32f10x_rng.h" // #include "stm32f10x_rtc.h" // #include "stm32f10x_sdio.h" // #include "stm32f10x_spi.h" // #include "stm32f10x_tim.h" // #include "stm32f10x_usart.h" // #include "stm32f10x_wwdg.h" // #include "misc.h" /* High level functions for NVIC and SysTick configuration */ #ifdef __cplusplus extern "C" { #endif #ifdef __cplusplus } #endif #endif /* __STM32F10X_CONF_H */ ``` 此段代码展示了如何定义外部高速振荡器 (`HSE`) 值以及哪些外设应该被编译到项目中。未注释掉的部分表示默认启用的功能;如果不需要某些特定功能,则可以将其对应行前加上 `//` 来禁用它们。 #### 使用注意事项 为了确保最佳性能并减少不必要的内存占用,建议仅保留当前应用所需的最少数量的外设头文件。这不仅有助于优化资源利用效率,还能使代码更加简洁易读[^4]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值