stm32f10x.h文件分析理解
今天再看过半年前自己写的这篇发现自己当时理解有误,stm32f10x.h与库开发并未存在太大关系,只是一个最为重要的寄存器地址到寄存器结构体变量的映射。
stm32f10x.h 这个头文件是STM32开发最为重要的一个头文件相当于我玩51那会,那个 reg52.h 。但对于STM32来说,它的寄存器数量是非常多的,如果按照操作51一样的方法来操作32的话,查数据手册来配置寄存器是非常麻烦的。所以ST开发了这个库,方便大家开发,缩短开发周期。在 stm32f10x.h 中前面一开始就出现了:
#ifndef __STM32F10x_H
#define __STM32F10x_H #ifdef __cplusplus
extern "C" {
#endif
一开始我不解 extern "C" { 这个语句的意思,经度娘,了解到原来是用来说明后面的定义都是使用C语言写的。这个 __cplusplus 是指C++来的,4、5句的意思就是说如果用C++编译器的话,它里面是定义有__cplusplus 这个的,而通过 extern "C" { 告知编译器,这段代码是用C编写的,要按照C语言编译。这是因为C++里面有函数重载,编译的时候把参数也编译了,而C的话,编译只编译函数名。
go on:下面这段是用来定义器件容量,可以通过自己取消注释来选择,也可以在KEIL里面设置全局宏定义,2种方式。
#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL)
/* #define STM32F10X_LD */ /*!< STM32F10X_LD: STM32 Low density devices */
/* #define STM32F10X_LD_VL */ /*!< STM32F10X_LD_VL: STM32 Low density Value Line devices */
/* #define STM32F10X_MD */ /*!< STM32F10X_MD: STM32 Medium density devices */
/* #define STM32F10X_MD_VL */ /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices */
/* #define STM32F10X_HD */ /*!< STM32F10X_HD: STM32 High density devices */
/* #define STM32F10X_HD_VL */ /*!< STM32F10X_HD_VL: STM32 High density value line devices */
/* #define STM32F10X_XL */ /*!< STM32F10X_XL: STM32 XL-density devices */
/* #define STM32F10X_CL */ /*!< STM32F10X_CL: STM32 Connectivity line devices */
#endif #if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL)
#error "Please select first the target STM32F10x device used in your application (in stm32f10x.h file)"
#endif
如果没有定义器件的话,编译的时候就会出现以下错误:
"Please select first the target STM32F10x device used in your application (in stm32f10x.h file)"
go on:
用于定义是否使用外设驱动,如果注释掉或者keil中没设全局宏定义的话,则代表不使用ST库提供的外设驱动库,在本文倒数第二段代码中有句
#ifdef USE_STDPERIPH_DRIVER
#include "stm32f10x_conf.h"
#endif
stm32f10x_conf.h用于外设注释配置。
#if !defined USE_STDPERIPH_DRIVER
/**
* @brief Comment the line below if you will not use the peripherals drivers.
In this case, these drivers will not be included and the application code will
be based on direct access to peripherals registers
*/
/*#define USE_STDPERIPH_DRIVER*/
#endif
下面应该是对于器件HSE的设置
/**
* @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
#ifdef STM32F10X_CL
#define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
#else
#define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
#endif /* STM32F10X_CL */
#endif /* HSE_VALUE */
设置启动超时值和HSI
/**
* @brief In the following line adjust the External High Speed oscillator (HSE) Startup
Timeout value
*/
#define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500) /*!< Time out for HSE start up */ #define HSI_VALUE ((uint32_t)8000000) /*!< Value of the Internal oscillator in Hz*/
标准外设库版本号的定义
/**
* @brief STM32F10x Standard Peripheral Library version number
*/
#define __STM32F10X_STDPERIPH_VERSION_MAIN (0x03) /*!< [31:24] main version */
#define __STM32F10X_STDPERIPH_VERSION_SUB1 (0x05) /*!< [23:16] sub1 version */
#define __STM32F10X_STDPERIPH_VERSION_SUB2 (0x00) /*!< [15:8] sub2 version */
#define __STM32F10X_STDPERIPH_VERSION_RC (0x00) /*!< [7:0] release candidate */
#define __STM32F10X_STDPERIPH_VERSION ( (__STM32F10X_STDPERIPH_VERSION_MAIN << 24)\
|(__STM32F10X_STDPERIPH_VERSION_SUB1 << )\
|(__STM32F10X_STDPERIPH_VERSION_SUB2 << )\
|(__STM32F10X_STDPERIPH_VERSION_RC))
配置Cortex-M3处理器和核内外设
/**
* @brief Configuration of the Cortex-M3 Processor and Core Peripherals
*/
#ifdef STM32F10X_XL
#define __MPU_PRESENT 1 /*!< STM32 XL-density devices provide an MPU */
#else
#define __MPU_PRESENT 0 /*!< Other STM32 devices does not provide an MPU */
#endif /* STM32F10X_XL */
#define __NVIC_PRIO_BITS 4 /*!< STM32 uses 4 Bits for the Priority Levels */
#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */
中断线定义,前部分对于所有STM32F10x都有相同定义,后部分根据不同器件容量采用条件编译定义不同中断线。
/**
* @brief STM32F10x Interrupt Number Definition, according to the selected device
* in @ref Library_configuration_section
*/
typedef enum IRQn
{
/****** Cortex-M3 Processor Exceptions Numbers ***************************************************/
NonMaskableInt_IRQn = -, /*!< 2 Non Maskable Interrupt */
MemoryManagement_IRQn = -, /*!< 4 Cortex-M3 Memory Management Interrupt */
BusFault_IRQn = -, /*!< 5 Cortex-M3 Bus Fault Interrupt */
UsageFault_IRQn = -, /*!< 6 Cortex-M3 Usage Fault Interrupt */
SVCall_IRQn = -, /*!< 11 Cortex-M3 SV Call Interrupt */
DebugMonitor_IRQn = -, /*!< 12 Cortex-M3 Debug Monitor Interrupt */
PendSV_IRQn = -, /*!< 14 Cortex-M3 Pend SV Interrupt */
SysTick_IRQn = -, /*!< 15 Cortex-M3 System Tick Interrupt */ /****** STM32 specific Interrupt Numbers *********************************************************/
WWDG_IRQn = , /*!< Window WatchDog Interrupt */
PVD_IRQn = , /*!< PVD through EXTI Line detection Interrupt */
TAMPER_IRQn = , /*!< Tamper Interrupt */
RTC_IRQn = , /*!< RTC global Interrupt */
FLASH_IRQn = , /*!< FLASH global Interrupt */
RCC_IRQn = , /*!< RCC global Interrupt */
EXTI0_IRQn = , /*!< EXTI Line0 Interrupt */
EXTI1_IRQn = , /*!< EXTI Line1 Interrupt */
EXTI2_IRQn = , /*!< EXTI Line2 Interrupt */
EXTI3_IRQn = , /*!< EXTI Line3 Interrupt */
EXTI4_IRQn = , /*!< EXTI Line4 Interrupt */
DMA1_Channel1_IRQn = , /*!< DMA1 Channel 1 global Interrupt */
DMA1_Channel2_IRQn = , /*!< DMA1 Channel 2 global Interrupt */
DMA1_Channel3_IRQn = , /*!< DMA1 Channel 3 global Interrupt */
DMA1_Channel4_IRQn = , /*!< DMA1 Channel 4 global Interrupt */
DMA1_Channel5_IRQn = , /*!< DMA1 Channel 5 global Interrupt */
DMA1_Channel6_IRQn = , /*!< DMA1 Channel 6 global Interrupt */
DMA1_Channel7_IRQn = , /*!< DMA1 Channel 7 global Interrupt */ #ifdef STM32F10X_LD
...
#endif /* STM32F10X_LD */ #ifdef STM32F10X_LD_VL
...
#endif /* STM32F10X_LD_VL */ #ifdef STM32F10X_MD
...
#endif /* STM32F10X_MD */ #ifdef STM32F10X_MD_VL
...
#endif /* STM32F10X_MD_VL */ #ifdef STM32F10X_HD
...
#endif /* STM32F10X_HD */ ...
...
...
} IRQn_Type;
为兼容旧版本类似而生。
@addtogroup Exported_types
/*!< STM32F10x Standard Peripheral Library old types (maintained for legacy purpose) */
typedef int32_t s32;
typedef int16_t s16;
typedef int8_t s8; typedef const int32_t sc32; /*!< Read Only */
typedef const int16_t sc16; /*!< Read Only */
typedef const int8_t sc8; /*!< Read Only */ typedef __IO int32_t vs32;
typedef __IO int16_t vs16;
typedef __IO int8_t vs8; typedef __I int32_t vsc32; /*!< Read Only */
typedef __I int16_t vsc16; /*!< Read Only */
typedef __I int8_t vsc8; /*!< Read Only */ typedef uint32_t u32;
typedef uint16_t u16;
typedef uint8_t u8; typedef const uint32_t uc32; /*!< Read Only */
typedef const uint16_t uc16; /*!< Read Only */
typedef const uint8_t uc8; /*!< Read Only */ typedef __IO uint32_t vu32;
typedef __IO uint16_t vu16;
typedef __IO uint8_t vu8; typedef __I uint32_t vuc32; /*!< Read Only */
typedef __I uint16_t vuc16; /*!< Read Only */
typedef __I uint8_t vuc8; /*!< Read Only */ typedef enum {RESET = , SET = !RESET} FlagStatus, ITStatus; typedef enum {DISABLE = , ENABLE = !DISABLE} FunctionalState;
#define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE)) typedef enum {ERROR = , SUCCESS = !ERROR} ErrorStatus;
/*!< STM32F10x Standard Peripheral Library old definitions (maintained for legacy purpose) */
#define HSEStartUp_TimeOut HSE_STARTUP_TIMEOUT
#define HSE_Value HSE_VALUE
#define HSI_Value HSI_VALUE
把全部外设寄存器定义成结构体
/* @addtogroup Peripheral_registers_structures */ /**
* @brief Analog to Digital Converter
*/
typedef struct
{
} ADC_TypeDef; /**
* @brief Backup Registers
*/
typedef struct
{
} BKP_TypeDef; /**
* @brief Controller Area Network TxMailBox
*/
typedef struct
{
} CAN_TxMailBox_TypeDef; /**
* @brief Controller Area Network FIFOMailBox
*/
typedef struct
{
} CAN_FIFOMailBox_TypeDef; /**
* @brief Controller Area Network FilterRegister
*/
typedef struct
{
} CAN_FilterRegister_TypeDef; /**
* @brief Controller Area Network
*/
typedef struct
{
} CAN_TypeDef; /**
* @brief Consumer Electronics Control (CEC)
*/
typedef struct
{
} CEC_TypeDef; /**
* @brief CRC calculation unit
*/
typedef struct
{
} CRC_TypeDef; /**
* @brief Digital to Analog Converter
*/
typedef struct
{
} DAC_TypeDef; /**
* @brief Debug MCU
*/
typedef struct
{
}DBGMCU_TypeDef; /**
* @brief DMA Controller
*/
typedef struct
{
} DMA_Channel_TypeDef;
typedef struct
{
} DMA_TypeDef; /**
* @brief Ethernet MAC
*/
typedef struct
{
} ETH_TypeDef; /**
* @brief External Interrupt/Event Controller
*/
typedef struct
{
} EXTI_TypeDef; /**
* @brief FLASH Registers
*/
typedef struct
{
} FLASH_TypeDef; /**
* @brief Option Bytes Registers
*/
typedef struct
{
} OB_TypeDef; /**
* @brief Flexible Static Memory Controller
*/
typedef struct
{
} FSMC_Bank1_TypeDef; /**
* @brief Flexible Static Memory Controller Bank1E
*/
typedef struct
{
} FSMC_Bank1E_TypeDef; /**
* @brief Flexible Static Memory Controller Bank2
*/
typedef struct
{
} FSMC_Bank2_TypeDef; /**
* @brief Flexible Static Memory Controller Bank3
*/
typedef struct
{
} FSMC_Bank3_TypeDef; /**
* @brief General Purpose I/O
*/
typedef struct
{
} GPIO_TypeDef; /**
* @brief Alternate Function I/O
*/
typedef struct
{
} AFIO_TypeDef; /**
* @brief Inter Integrated Circuit Interface
*/
typedef struct
{
} I2C_TypeDef; /**
* @brief Independent WATCHDOG
*/
typedef struct
{
} IWDG_TypeDef; /**
* @brief Power Control
*/
typedef struct
{
} PWR_TypeDef; /**
* @brief Reset and Clock Control
*/
typedef struct
{
} RCC_TypeDef; /**
* @brief Real-Time Clock
*/
typedef struct
{
} RTC_TypeDef; /**
* @brief SD host Interface
*/
typedef struct
{
} SDIO_TypeDef; /**
* @brief Serial Peripheral Interface
*/
typedef struct
{
} SPI_TypeDef; /**
* @brief TIM
*/
typedef struct
{
} TIM_TypeDef; /**
* @brief Universal Synchronous Asynchronous Receiver Transmitter
*/
typedef struct
{
} USART_TypeDef; /**
* @brief Window WATCHDOG
*/
typedef struct
{
} WWDG_TypeDef;
对上面定义的结构体的成员,即寄存器映射到相应的地址上,以下包括一个是地址映射,一个是寄存器声明。
/** @addtogroup Peripheral_memory_map
* @{
*/
#define FLASH_BASE ((uint32_t)0x08000000) /*!< FLASH base address in the alias region */
#define SRAM_BASE ((uint32_t)0x20000000) /*!< SRAM base address in the alias region */
#define PERIPH_BASE ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */ #define SRAM_BB_BASE ((uint32_t)0x22000000) /*!< SRAM base address in the bit-band region */
#define PERIPH_BB_BASE ((uint32_t)0x42000000) /*!< Peripheral base address in the bit-band region */ #define FSMC_R_BASE ((uint32_t)0xA0000000) /*!< FSMC registers base address */ /*!< Peripheral memory map */
#define APB1PERIPH_BASE PERIPH_BASE
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000) #define TIM2_BASE (APB1PERIPH_BASE + 0x0000)
#define TIM3_BASE (APB1PERIPH_BASE + 0x0400) ...
... /** @addtogroup Peripheral_declaration
* @{
*/ #define TIM2 ((TIM_TypeDef *) TIM2_BASE)
#define TIM3 ((TIM_TypeDef *) TIM3_BASE)
#define TIM4 ((TIM_TypeDef *) TIM4_BASE)
#define TIM5 ((TIM_TypeDef *) TIM5_BASE)
#define TIM6 ((TIM_TypeDef *) TIM6_BASE) ...
...
一开头讲过,如果定义使用外设驱动,则包含 stm32f10x_conf.h 用来配置所使用外设的库函数
#ifdef USE_STDPERIPH_DRIVER
#include "stm32f10x_conf.h"
#endif
定义一些宏的操作,下面是位操作。
/** @addtogroup Exported_macro
* @{
*/ #define SET_BIT(REG, BIT) ((REG) |= (BIT)) #define CLEAR_BIT(REG, BIT) ((REG) &= ~(BIT)) #define READ_BIT(REG, BIT) ((REG) & (BIT)) #define CLEAR_REG(REG) ((REG) = (0x0)) #define WRITE_REG(REG, VAL) ((REG) = (VAL)) #define READ_REG(REG) ((REG)) #define MODIFY_REG(REG, CLEARMASK, SETMASK) WRITE_REG((REG), (((READ_REG(REG)) & (~(CLEARMASK))) | (SETMASK)))
#ifdef __cplusplus
}
#endif #endif /* __STM32F10x_H */
上面的代码源自 ST3.5版本库的 stm32f10x.h 文件。综合以上,可以看出 stm32f10x.h 用于定义了器件、中断线、数据类型、结构体封装的寄存器、寄存器地址映射、寄存器位操作以及防C++编译的条件编译。
stm32f10x.h文件分析理解的更多相关文章
- 由于MDK5.0A没有STM32F103程序错误 stm32f10x.h(298): error: #67: expected a "}"
转自:http://blog.163.com/lby147612@126/blog/static/17041045220150130438428/ 由于MDK4.72A没有STM32F030,所以升级 ...
- 关于stm32f10x_conf.h文件
简介 stm32f10x_conf.h文件有2个作用:①提供对assert_param运行时参数检查宏函数的定义.②将开发者用到的标准外设头文件集中在这个文件里面,而stm32f10x_conf.h又 ...
- linux内核中链表代码分析---list.h头文件分析(一)【转】
转自:http://blog.chinaunix.net/uid-30254565-id-5637596.html linux内核中链表代码分析---list.h头文件分析(一) 16年2月27日17 ...
- linux内核中链表代码分析---list.h头文件分析(二)【转】
转自:http://blog.chinaunix.net/uid-30254565-id-5637598.html linux内核中链表代码分析---list.h头文件分析(二) 16年2月28日16 ...
- KEIL MDK输出map文件分析
一.文件分析流程 1.第一部分:Section Cross References 主要是各个源文件生成的模块之间相互引用的关系. stm32f10x.o(STACK) refers (Special) ...
- C++学了这么多年,你也许不知道为什么类定义要放在.h文件,类实现放在cpp文件。它们如何关联?
原文 http://blog.csdn.net/ithzhang/article/details/8119286 主题 C++ C++学了这么多年你知道为什么定义类时,类的定义放在.h文件中,而类 ...
- Android JNI入门第三篇——jni头文件分析
一. 首先写了java文件: public class HeaderFile { private native void doVoid(); native int doShort(); native ...
- STM32固件库文件分析
STM32固件库文件分析 1.汇编编写的启动文件 startup/stm32f10x.hd.s:设置堆栈指针,设置pc指针,初始化中断向量,配置系统时钟,对用c库函数_main最后去c语言世界里. 2 ...
- coreCLR系列随笔 之ClrJit项目之alloc.cpp文件分析(1)
首先声明,自己对CLR了解得不多,只是个人爱好,可能有错误,请指出,文件源码如下(可能不是最新的) // // Copyright (c) Microsoft. All rights reserved ...
随机推荐
- SaaS系列介绍之十: SaaS的商业模式
1 引言 赚钱之道很多,但是找不到赚钱的种子,便成不了事业家.作为职业软件人,我们都寻求使用一种有效而经济的过程来建造一个能够工作的,有用的产品. ...
- 借助CAD在Altium Designer中定义不规则PCB外形
借助绘图软件CAD在Altium Designer中定义不规则PCB外形. 工具/原料 CAD2007 Altium Designer2015 方法/步骤 借助CAD绘制的不规则外形,保存成DXF格式 ...
- EPEL库安装
EPEL是yum的一个软件源,里面包含了许多基本源里没有的软件了,但在我们在使用epel时是需要安装它才可以了.EPEL,即Extra Packages for Enterprise Linux的简称 ...
- PHP开发搜索引擎技术全解析
谈到网页搜索引擎时,很多人都会想到雅虎.的确,雅虎开创了一个互联网络的搜索时代.然而,雅虎目前用于搜索网页的技术却并非该公司原先自己开发的.2000年8月,雅虎采用了Google这家由斯坦福大学学生创 ...
- 【HDOJ】4089 Activation
1. 题目描述长度为n的等待队列,tomato处于第m个,有如下四种可能:(1)激活失败,概率为$p_1$,队列中的顺序不变:(2)连接失败,概率为$p_2$,队头玩家重新排在队尾:(3)激活成功,概 ...
- 【POJ】2104 K-th Number
区间第K大数.主席树可解. /* 2104 */ #include <iostream> #include <sstream> #include <string> ...
- Android开发之json解析
目前正在尝试着写app,发现看懂代码和能写出来差距很大,最关键的是java基础比较的差,因为只会python,java基础只学习了一个礼拜就过了.感觉java写出来的代码不如python简单明了. 上 ...
- 结构体 lock_sys
typedef struct lock_sys_struct lock_sys_t; extern lock_sys_t* lock_sys; struct lock_sys_struct{ hash ...
- bzoj1058: [ZJOI2007]报表统计
set.操作:insert(u,v)在u后面插入v,若u后面已插入过,在插入过的后面插入.mingap求出序列两两之间差值的最小值.minsortgap求出排序后的序列两两之间的最小值.用multis ...
- HDU 4571 Travel in time ★(2013 ACM/ICPC长沙邀请赛)
[题意]给定N个点,每个点有一个停留所需的时间Ci,和停留能够获得的满意度Si,有M条边,每条边代表着两个点走动所需的时间ti,现在问在规定的T时间内从指定的一点S到E能够获得的最大的满意度是多少?要 ...