/**这里是STM32比较重要的头文件
- a9 G! g- i' z+ ~0 h: l; Z+ f6 s ******************************************************************************7 s+ ?6 B& Z# a+ Y
* @file stm32f10x.h ST 标准的头文件' C! r3 |# X4 |; `4 l/ Y
* @author MCD Application Team 微控制器开发小组。
# r* C8 s9 v& i: g, H! W * @version V3.5.0 版本
% @6 P' ^- c+ I, Y7 X! B) F' G * @date 11-March-2011 2011年3月11; E" s3 d' O# F, ^/ C
* @brief CMSIS Cortex-M3 Device Peripheral Access Layer Header File.(CMSIS:Cortex Microcontroller Software Interface Standard) 是 Cortex-M 处理器系列的与供应商无关的硬件抽象层。 9 v; o* x( {# s0 V' G, Q
* This file contains all the peripheral register’s definitions, bits
4 B; Q( X3 }5 P+ f * definitions and memory mapping for STM32F10x Connectivity line,
5 o- A7 L0 p$ l1 } * High density, High density value line, Medium density,
" R& l$ `2 r( I5 S: V; A" T * Medium density Value line, Low density, Low density Value line
& B0 a) L) U% P0 {4 C# E * and XL-density devices.8 t7 W s, y, x8 T
* 这个文件包含了芯片STM32F10X(接口增强型)内部的寄存器定义,位定义,内存地址变换定义,还有一些相应的高密度,低密度产品线的设备。0 x3 S+ K8 O! C8 _# D' Q y
3 |( Z6 `4 [8 O2 L( X
* The file is the unique include file that the application programmer; M1 J$ r3 B4 u! W; f
* is using in the C source code, usually in main.c. This file contains:* C" E3 F8 C/ [0 ^( d
* - Configuration section that allows to select:, X( X7 W$ t0 A1 F5 p2 o
* - The device used in the target application
+ S* |" |, a% k2 D. k' P& N * - To use or not the peripherals drivers in application code(i.e.
6 [ W, \' R5 A * code will be based on direct access to peripherals registers
. e( |9 R0 l& e/ M9 n: o. I, A * rather than drivers API), this option is controlled by % ^2 I9 h+ \# j; T3 u$ E
* “#define USE_STDPERIPH_DRIVER”
* x) R3 j% T# C+ G6 ]4 s7 l * - To change few application-specific parameters such as the HSE
5 Q d% \5 e( w- G, L) V * crystal frequency
/ g: \6 N% k$ M& W: r7 K* ^ * - Data structures and the address mapping for all peripherals
" e. k: N+ x# o' E1 ^% p * - Peripheral’s registers declarations and bits definition$ J `2 x7 u }
* - Macros to access peripheral registers hardware( o. F3 S9 V$ Q( }
*这个文件在应用程序中是至关重要的头文件,它是用C代码编写而成。通常包括在MAIN主程序中。它包括:1 设备中使用的目标应用程序。
9 J7 h ]0 _, H+ [0 R2 决定是否使用外部设备的代码(例如使用基于寄存器的代码,而不是我们所熟悉的API应用程序接口代码)。这一设备可以通过设置 ”#define USE_STDPERIPH_DRIVER” 来实现。
7 L, T J( a& F5 m3 ~3 通过这一文件可以改变诸如外部设备的频率参数。7 B- ^ \0 R6 s4 v4 H" ]
4 可以了解程序的数据结构以及外设的地址映射。
E8 `4 g. [/ b* p) ~# x5 外设的寄存器声明和位定义可以在这个文件里面了解到。2 A! Q% X/ Z S7 E
! [0 [ s) L3 I% g+ r* A
******************************************************************************
* |2 S! G/ q: | * @attention
$ X. p+ B' X) H2 I- H *
( Z/ D, Z( m9 t6 J& W$ n: r3 r * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS. {% Y) o7 P# D6 ]
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE* r+ ~0 j4 h' F. _/ z, v
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY" s$ w1 o' r6 }/ z1 l$ z% i
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
5 w; n& f5 ]. R * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE: i- ? q1 T t9 C% e( m$ g1 Y& s
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
3 t1 r2 v! o7 I X) c *注意:这一文件代码供应给用户,旨在帮助用户提升效率节约时间。ST将不会提供任何对于用户自己代码的解释和帮助。也不会解决其在代码中的任何BUG。
4 k1 a! l( E' | e+ J# G" c( Q * <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>( j0 _* I: J) q* ]9 a: c/ _9 n
******************************************************************************
6 L/ G- f i A5 a# p7 F' n3 a */* o! {+ M( x* Y" T, L
& L1 d y. t* L/** @addtogroup CMSIS
2 r- M5 `; H- C1 `/ a' z/ K * @{- A* C& M8 ?5 Y* i$ v; k& ?; u
*/这个不需要关心,只是说明这个文件的作者,公司产品等等,你贴出来的估计是小小的广而告之,这也是程序员的一点小小的特权嘛% G! _0 t- A4 j3 D& N- d
* v( N. O3 q- H: ~; b6 X
/** @addtogroup stm32f10x0 T- f$ X0 J& d$ j; m u& X) _& s
* @{
& o0 ]& r$ v. u9 [# t */
Y8 M+ v# V$ A" F+ C5 z+ Z3 R
# Q# V/ a; S% H#ifndef __STM32F10x_H//如果没有定义__STM32F10x_H ,则定义__STM32F10x_H 9 q" s3 d6 O) E" `3 W# T
#define __STM32F10x_H- C3 [& n5 `( Q/ H( r- J7 _- f
( n7 h8 E- O& O) o: |
#ifdef __cplusplus// $ W5 ^- Q; F M. t6 Z1 Z, b4 a
extern “C” {
3 \6 d6 ^, I! x9 ]% Q8 \1 Z#endif
8 N8 g- l3 }- N& z4 s; r+ G 这里是一种条件编译。extern “C”指令非常有用,因为C和C++的近亲关系。注意:extern “C”指令中的C,表示的一种编译和连接规约,而不是一种语言。C表示符合C语言的编译和连接规约的任何语言,如Fortran、assembler等。
# q: `4 f) Q9 Y, y3 P: v
. J9 w0 Z. f1 Q! P- ^/ d) n2 o3 X还有要说明的是,extern “C”指令仅指定编译和连接规约,但不影响语义。例如在函数声明中,指定了extern “C”,仍然要遵守C++的类型检测、参数转换规则。/** @addtogroup Library_configuration_section
4 ^( S1 @6 w: B2 N3 W5 { * @{
" _2 a' b# m$ J+ q+ q */6 U' ^) i4 z% `6 ]
( Z1 p5 D& H( F- {% a" u) \
/* Uncomment the line below according to the target STM32 device used in your0 E" z( z0 W2 i H
application 5 J8 Q* U+ ] ?8 i8 T0 q
*/9 g$ u) w- |$ y& T& {1 p+ m: d' f$ ~
0 t' [$ c3 F* T2 f& a% ^6 W#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)
. g4 S+ E, t/ O. r: K) ] /* #define STM32F10X_LD */ /*!< STM32F10X_LD: STM32 Low density devices */
- n L" j9 G8 U5 N( r) g /* #define STM32F10X_LD_VL */ /*!< STM32F10X_LD_VL: STM32 Low density Value Line devices */ 1 I1 r0 q' U) Y$ j2 S6 i5 @ i" W- W
/* #define STM32F10X_MD */ /*!< STM32F10X_MD: STM32 Medium density devices */2 N4 M% [; Y( B9 S
/* #define STM32F10X_MD_VL */ /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices */
6 @2 ?7 x, Q( B* Q- k /* #define STM32F10X_HD */ /*!< STM32F10X_HD: STM32 High density devices */
7 C7 ]6 N! h9 B4 h /* #define STM32F10X_HD_VL */ /*!< STM32F10X_HD_VL: STM32 High density value line devices */ ( x- T9 G9 l( ]. |8 A
/* #define STM32F10X_XL */ /*!< STM32F10X_XL: STM32 XL-density devices */, M Z# L6 w3 {0 F# @
/* #define STM32F10X_CL */ /*!< STM32F10X_CL: STM32 Connectivity line devices */
' E" o2 A; F2 } w* q#endif
, s! z4 l1 c8 J% P' Y1 g, b! p& n* bSTM32启动文件选择:' f! A5 s/ o' [0 W
- startup_stm32f10x_ld_vl.s: for STM32 Low density Value line devices - startup_stm32f10x_ld.s: for STM32 Low density devices - startup_stm32f10x_md_vl.s: for STM32 Medium density Value line devices - startup_stm32f10x_md.s: for STM32 Medium density devices - startup_stm32f10x_hd.s: for STM32 High density devices - startup_stm32f10x_xl.s: for STM32 XL density devices - startup_stm32f10x_cl.s: for STM32 Connectivity line devices ! O% J1 j+ ^- m U- H
cl:互联型产品,stm32f105/107系列
3 g* P2 V3 L6 `0 O6 t: Evl:超值型产品,stm32f100系列 % J5 V# S- l& \9 k
xl:超高密度产品,stm32f101/103系列
3 P+ k0 `# P, ?5 V! r- X5 Z5 T& Uld:低密度产品,FLASH小于64K
5 e8 E8 V: A$ f, emd:中等密度产品,FLASH=64 or 128" r: _6 n& ]+ L) d
hd:高密度产品,FLASH大于128
" \, P! S( \% O/* Tip: To avoid modifying this file each time you need to switch between these
3 X% d4 }$ t; x6 J Z9 |$ e* a devices, you can define the device in your toolchain compiler preprocessor.: F5 J" T8 q) B7 p5 T
提示:为了避免每次编译都要修改这些文件,意思是可以使用编译器的preprocessor选项来定义芯片型号等,免得反复更新这个文件。…0 r* ?/ ^" v8 Q( H* G' c
- Low-density devices are STM32F101xx, STM32F102xx and STM32F103xx microcontrollers
) Z; w/ o+ S8 O# y, z9 Z where the Flash memory density ranges between 16 and 32 Kbytes., F. E- s( |& K4 X
- Low-density value line devices are STM32F100xx microcontrollers where the Flash% [+ I, R/ { \5 R2 @
memory density ranges between 16 and 32 Kbytes.
?# e+ K& X9 p4 \( T( X3 U1 J- Medium-density devices are STM32F101xx, STM32F102xx and STM32F103xx microcontrollers这里定义的是各种产品线的FLASH的大小。
1 Q$ Y3 ^1 @2 I/ B where the Flash memory density ranges between 64 and 128 Kbytes.
% d n1 c; e4 {5 D& _8 Y! b- Medium-density value line devices are STM32F100xx microcontrollers where the & H3 J" s2 h$ m, \6 q7 z
Flash memory density ranges between 64 and 128 Kbytes. 5 S! j+ z/ D4 `+ u
- High-density devices are STM32F101xx and STM32F103xx microcontrollers where
2 u( y, o( J& X the Flash memory density ranges between 256 and 512 Kbytes.
* s3 Q# M8 U- O6 a' W, ?9 M6 _7 l- High-density value line devices are STM32F100xx microcontrollers where the
7 R) M$ q1 d6 V0 J4 t0 L Flash memory density ranges between 256 and 512 Kbytes.
: R R) f6 O- _1 ?! s L- XL-density devices are STM32F101xx and STM32F103xx microcontrollers where$ L4 L8 S; T1 f) l
the Flash memory density ranges between 512 and 1024 Kbytes.% E2 Z0 N, C: ?) i" j& C6 u
- Connectivity line devices are STM32F105xx and STM32F107xx microcontrollers.
9 m" `+ I' } }" z */
G+ N1 R7 L5 F r, Q, P+ ~, e4 N+ V. h: k e- X
#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)6 z( A% \) W9 ]
#error “Please select first the target STM32F10x device used in your application (in stm32f10x.h file)”
1 g0 p1 N5 w% @: y$ ?#endif 如果设备类型选择不正确,这里会报错的。
/ v3 F F0 u6 r. `# a6 v k; W4 N9 X3 Y: O8 e9 E0 b/ Q$ _7 ?
#if !defined USE_STDPERIPH_DRIVER
; r6 Q1 q$ E& g, B: G/**
' h. v6 W5 Y7 A, M/ S, m- n* @brief Comment the line below if you will not use the peripherals drivers., ?+ R; d2 ?" X0 r7 X2 `+ ]
In this case, these drivers will not be included and the application code will
9 X& |) S* l8 K9 J6 c- C be based on direct access to peripherals registers
# V" C0 L3 \5 b( ?) N% T */1 S7 v) _4 u1 M
/*#define USE_STDPERIPH_DRIVER*/% ~- W" g" F# ~
#endif
) o, C. h; q* l( f. `# v5 F+ ~' O# `/ q1 @, x
/**5 k" P' X. Q5 j
* @brief In the following line adjust the value of External High Speed oscillator (HSE)) s6 \) x+ o3 W3 ?
used in your application
( d* b0 V' w2 h- R) o& Z1 p
' o5 r: s8 l: c" \; ~1 ~4 ]9 i6 W Tip: To avoid modifying this file each time you need to use different HSE, you
% ~, r! P4 d) X8 E/ L, F can define the HSE value in your toolchain compiler preprocessor.5 P; _! `- b+ M
提示:为了避免每次编译都要修改这些文件,意思是可以使用编译器的preprocessor选项来定义芯片型号等,免得反复更新这个文件。… ; t+ p Y: b9 X4 D# N2 m" W
*/ ; g+ u- |4 B7 q1 V p7 u
#if !defined HSE_VALUE; N8 B5 Y, V) P' B5 U/ {; |2 n
#ifdef STM32F10X_CL , i7 }7 [3 z& S
#define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */ x0 E; E% N- c5 O4 }0 d
#else
0 ?2 `. \- p3 g #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
% k: O% A. l( V, b$ d8 f#endif /* STM32F10X_CL */! D' @/ |- p8 X+ n* `' E
#endif /* HSE_VALUE */
7 F1 P: ~0 ~4 y3 h
" ^! D9 F' A- d8 c U& w, Z: L# L" z
/**
3 r {2 O3 T) O+ Q- r/ m* @brief In the following line adjust the External High Speed oscillator (HSE) Startup
! Y& V) {; m1 R e5 m Timeout value ! u3 J$ ?6 Q# E* ~, [% B0 `( s
*/①、HSI是高速内部时钟,RC振荡器,频率为8MHz。 ②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。, f0 d4 B, O6 z X* A9 U. }
③、LSI是低速内部时钟,RC振荡器,频率为40kHz。/ [$ O" Y/ a$ h T: d& Z9 g
④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。' t7 A; n5 U, ?! H- q- E- r4 v
⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。) E- n% z2 Z. u I( A
#define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500) /*!< Time out for HSE start up */
# S5 \5 r! S0 u* H" V+ [+ G/ D高速外部时钟启动时间3 r. g0 A% y) C6 W9 D0 k
#define HSI_VALUE ((uint32_t)8000000) /*!< Value of the Internal oscillator in Hz*/% }5 r+ }: [- }0 x! j
外部时钟设置的值) ]6 _: i) T7 u/ f
/**
+ X1 Y& b5 r9 C* @brief STM32F10x Standard Peripheral Library version number. `8 Q! b% m9 ]% z" D8 N# Y6 W- v0 c2 J
*/
, a4 s5 Y+ i2 M" u1 x0 l#define __STM32F10X_STDPERIPH_VERSION_MAIN (0x03) /*!< [31:24] main version */
' P' o, @3 `6 j6 h$ k; \5 m#define __STM32F10X_STDPERIPH_VERSION_SUB1 (0x05) /*!< [23:16] sub1 version */) U5 h3 R8 o! i! ^
#define __STM32F10X_STDPERIPH_VERSION_SUB2 (0x00) /*!< [15:8] sub2 version */. ]- { P) Q3 C2 x3 k
#define __STM32F10X_STDPERIPH_VERSION_RC (0x00) /*!< [7:0] release candidate */
% s9 {) ?/ p7 d' G. S! b#define __STM32F10X_STDPERIPH_VERSION ( (__STM32F10X_STDPERIPH_VERSION_MAIN << 24)\
0 n. e4 Z' T3 r7 m |(__STM32F10X_STDPERIPH_VERSION_SUB1 << 16)\2 H3 w# N6 l4 L- e) B0 M
|(__STM32F10X_STDPERIPH_VERSION_SUB2 << 8)\( ?! `+ E0 F% ~7 s5 R
|(__STM32F10X_STDPERIPH_VERSION_RC))8 n( U7 G' @. l0 |0 |
* a" r/ L+ Q' f: h+ g' A7 W& j
/**
$ f; O+ O. d p* _3 H * @}$ Y2 _9 F% j9 N; k8 w8 I5 c
*/. h4 `3 B6 J/ F) A+ E) [
; B' [& l2 E, H* E6 Y
/** @addtogroup Configuration_section_for_CMSIS' `! y+ @$ u' l
* @{$ K# ?! I8 c$ a) ~( n6 q
*/3 i. N) Z* Q; l- H0 m+ N9 S
) D# Q$ D0 F5 I) `4 G0 H6 W) o
/**: ~$ O, @. M7 {
* @brief Configuration of the Cortex-M3 Processor and Core Peripherals
) E; i9 P. x K* U" V*/; c' f+ |* _3 n. p" t
#ifdef STM32F10X_XL
; s9 X; T/ |9 ^8 u3 a$ h#define __MPU_PRESENT 1 /*!< STM32 XL-density devices provide an MPU */( x3 M' }: ?0 s; j3 [' l" T3 ~
#else1 q# G* \7 k9 P
#define __MPU_PRESENT 0 /*!< Other STM32 devices does not provide an MPU */
' V# G# u- M( p/ o#endif /* STM32F10X_XL */
$ h+ _& G6 B# P' v/ z2 u5 ^#define __NVIC_PRIO_BITS 4 /*!< STM32 uses 4 Bits for the Priority Levels */1 I5 I$ r0 F5 o* H5 b; w2 W
#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */
5 C, |, ]: R8 c% S( a9 B6 @% k* ~; {7 k2 h( r: z6 J( m$ i+ _! |- q
/**, W' R/ B) f, c$ N+ C1 W
* @brief STM32F10x Interrupt Number Definition, according to the selected device " u+ k% m$ ?6 T7 {# ? {
* in @ref Library_configuration_section
, O9 G/ W2 G$ P0 G*/
$ o3 j2 A0 x0 M6 ]6 Ytypedef enum IRQn2 {7 s$ \4 w% L- x
{5 u, A7 q! D9 _ @7 [0 k2 S) `
/****** Cortex-M3 Processor Exceptions Numbers ***************************************************/
. {0 y* l- x' O& \! j NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */
/ E z8 L$ [- R" @& j$ ?( Z0 Q2 W MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt *// f9 U( w" R6 V. t: q# ^2 ~
BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */; ~. O0 C! d8 O* a- G( V1 L6 P$ R
UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */3 ^% ~* [9 w) o% Q( X
SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */
4 j: n) o2 l3 n6 b1 A DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */, u3 {5 W: D9 ~+ Z0 X7 w; @/ A; B
PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */
% i5 U- I7 [) {! K8 F+ | SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt */ / e- M7 p4 `$ l, O( j P
————————————————————————————————————————————————————————- ————————————————————————————————————————————————————————- /**这里是STM32比较重要的头文件
/ [4 T2 @3 H }( K ******************************************************************************
( V( I, ]/ |4 l% i0 L; ?. b" UST版本库的 stm32f10x.h 文件,包含整个头文件代码。综合以上,可以看出 stm32f10x.h 用于定义了器件、中断线、数据类型、结构体封装的寄存器、寄存器地址映射、寄存器位操作以及防C++编译的条件编译。 * @file stm32f10x.h ST 标准的头文件; Z" C6 O9 d* @: \
* @author MCD Application Team 微控制器开发小组。
/ x6 c0 o* d; h% m7 t% `* t * @version V3.5.0 版本. y( F. K! ^# b5 f. @
* @date 11-March-2011 2011年3月11
9 c% d/ `1 g8 l' ?6 U2 U * @brief CMSIS Cortex-M3 Device Peripheral Access Layer Header File.(CMSIS:Cortex Microcontroller Software Interface Standard) 是 Cortex-M 处理器系列的与供应商无关的硬件抽象层。 ! z- |/ Z( [' }' j0 |
* This file contains all the peripheral register’s definitions, bits
, l8 H# Z+ ~! N* A1 }/ P* }+ H * definitions and memory mapping for STM32F10x Connectivity line,
" Q: j5 d" ~$ t! X$ p7 v * High density, High density value line, Medium density, ! v, ^* g' f7 x3 E0 m
* Medium density Value line, Low density, Low density Value line d& L0 Q$ E9 E& E
* and XL-density devices.
/ Q V& \ m3 J8 t/ L * 这个文件包含了芯片STM32F10X(接口增强型)内部的寄存器定义,位定义,内存地址变换定义,还有一些相应的高密度,低密度产品线的设备。. F5 {; K( p Z. r! Z
6 X7 j; ~5 }# W" y' F
* The file is the unique include file that the application programmer
! O; F! i) e5 S7 R5 R * is using in the C source code, usually in main.c. This file contains:
% t2 b7 }1 \; l3 C8 G0 G0 N7 | * - Configuration section that allows to select:; ?: _% f# `# a+ L
* - The device used in the target application
- }/ f( g; B- r0 J * - To use or not the peripherals drivers in application code(i.e. & w! o: g. A( D: R
* code will be based on direct access to peripherals registers / d9 O) n/ @3 p5 ]9 a' U/ \9 {0 o
* rather than drivers API), this option is controlled by ( K" }' l6 L0 x9 ~3 Z% o
* “#define USE_STDPERIPH_DRIVER”: N" e, l0 ^$ h6 I N
* - To change few application-specific parameters such as the HSE
' s: u9 ]. F x; ?. {. V9 f * crystal frequency/ \" I3 S' \" B. C# |
* - Data structures and the address mapping for all peripherals+ p$ H$ |% y7 k T
* - Peripheral’s registers declarations and bits definition2 Y3 e9 q2 a v7 t3 J
* - Macros to access peripheral registers hardware
. _& X* I' o @ {. }) q9 I' W*这个文件在应用程序中是至关重要的头文件,它是用C代码编写而成。通常包括在MAIN主程序中。它包括:1 设备中使用的目标应用程序。
% ~) U8 [+ w( V, `4 _( f" N2 决定是否使用外部设备的代码(例如使用基于寄存器的代码,而不是我们所熟悉的API应用程序接口代码)。这一设备可以通过设置 “#define USE_STDPERIPH_DRIVER” 来实现。
( \- J6 S' k3 p. T3 通过这一文件可以改变诸如外部设备的频率参数。) H- n- O6 T# S4 ?$ i7 u: P! A2 B- p
4 可以了解程序的数据结构以及外设的地址映射。
( i+ Q) V: G3 Z& w+ w# C5 外设的寄存器声明和位定义可以在这个文件里面了解到。
6 ]' Q0 T+ h% B4 T5 A& W9 X- `8 Y+ C
. f7 V+ b/ f1 `' ?& Z ******************************************************************************- a5 ^3 `8 m) u9 v$ V/ {, d1 c3 w+ _
* @attention
# f: p6 }! P# Y! R: s% p *
( Y6 K/ u% A$ s4 D/ ^8 |* I& w4 j * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS {' r# r: B- Y+ n' x- P
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
. {: h1 z* x8 @. [9 D0 O* r# f * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY' h" s. a/ v+ N
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING0 ]" R9 Q9 O) D' b
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE) E# D& s! U) [- S& X ? l+ ?
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
: A% J$ C1 t8 }! h- K" k) E+ s1 v/ H *注意:这一文件代码供应给用户,旨在帮助用户提升效率节约时间。ST将不会提供任何对于用户自己代码的解释和帮助。也不会解决其在代码中的任何BUG。
( h0 e8 k! `, e3 o4 N * <h2><center>? COPYRIGHT 2011 STMicroelectronics</center></h2>7 O$ w. O7 R; @; D
******************************************************************************3 e6 v- V) y7 O( d3 p: K. U4 N
*/. K' N7 q' @, N! \) \- X. Z' G
+ W, K3 w+ l( V' p7 _/** @addtogroup CMSIS
. y0 d( |+ M, N( {9 Y * @{3 e8 H7 B5 w8 D, P& v
*/这个不需要关心,只是说明这个文件的作者,公司产品等等,你贴出来的估计是小小的广而告之,这也是程序员的一点小小的特权嘛
& s/ M: h* K4 y7 O) R( G
% R2 |3 b, P5 @/** @addtogroup stm32f10x
, J- h) H6 A' e * @{( `+ ^+ b/ p' T& K7 k
*/; i; h* m: z g/ ^
$ S7 D( [1 h# Q" V
#ifndef __STM32F10x_H//如果没有定义__STM32F10x_H ,则定义__STM32F10x_H
4 a! [ ~' b# H: i- u' P#define __STM32F10x_H1 n$ J" X9 k+ H" {
0 y* A, K" F& C9 t. K# Z7 Q! V! q#ifdef __cplusplus// ' o r# v% n: v
extern “C” {
0 z! S' Y/ @ J' _4 b#endif
7 s2 p, H9 F+ [. n& s9 _* {' k' {: L 这里是一种条件编译。extern “C”指令非常有用,因为C和C++的近亲关系。注意:extern “C”指令中的C,表示的一种编译和连接规约,而不是一种语言。C表示符合C语言的编译和连接规约的任何语言,如Fortran、assembler等。
0 s; r# N( E2 w/ P0 ]8 C
" P. d; C) b. y( |% m还有要说明的是,extern “C”指令仅指定编译和连接规约,但不影响语义。例如在函数声明中,指定了extern “C”,仍然要遵守C++的类型检测、参数转换规则。
& w! }& ^7 o9 I6 k一开始我不解 extern “C” { 这个语句的意思,原来是用来说明后面的定义都是使用C语言写的。这个 __cplusplus 是指C++来的,4、5句的意思就是说如果用C++编译器的话,它里面是定义有__cplusplus 这个的,而通过 extern “C” { 告知编译器,这段代码是用C编写的,要按照C语言编译。这是因为C++里面有函数重载,编译的时候把参数也编译了,而C的话,编译只编译函数名。
9 P3 @0 f$ q4 G/** @addtogroup Library_configuration_section
( A, [# p1 e2 g' Z5 | * @{
! j/ l) A5 n# m3 ]6 b; q) i */: R4 S) o8 |# Y+ I) D3 S! o
$ W( v) ?0 E1 t8 E" x M/* Uncomment the line below according to the target STM32 device used in your7 k! z8 |4 r, n* x3 C
application
2 ?! ` F+ y9 e8 z5 Q7 o */
: {/ |% X6 v; U7 m. C
7 G; U8 ^* s5 X# O4 u- E#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)
5 S* u8 u$ \2 R: \: a$ Z& x$ g /* #define STM32F10X_LD */ /*!< STM32F10X_LD: STM32 Low density devices */8 ]. D! R; V0 w5 }$ G+ Z% N
/* #define STM32F10X_LD_VL */ /*!< STM32F10X_LD_VL: STM32 Low density Value Line devices */
0 Y$ p5 }6 n+ Q8 b! _ L /* #define STM32F10X_MD */ /*!< STM32F10X_MD: STM32 Medium density devices */
! {3 a, a; Q( S1 _0 G+ n /* #define STM32F10X_MD_VL */ /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices */ / v* ~, ^3 U& }% T* y
/* #define STM32F10X_HD */ /*!< STM32F10X_HD: STM32 High density devices */
6 [' t) Z' ~0 V6 A/ @ /* #define STM32F10X_HD_VL */ /*!< STM32F10X_HD_VL: STM32 High density value line devices */
1 I. y$ H( f" t0 }' M3 _, `* _+ w /* #define STM32F10X_XL */ /*!< STM32F10X_XL: STM32 XL-density devices */
: ^; h0 X) e) @ /* #define STM32F10X_CL */ /*!< STM32F10X_CL: STM32 Connectivity line devices */
! c3 l \8 z. T" i9 V- T: s( g* ]& {; t#endif/ C: M; i' h! }# A; h. l
STM32启动文件选择:
) A4 R9 F+ B( L8 R$ B- startup_stm32f10x_ld_vl.s: for STM32 Low density Value line devices - startup_stm32f10x_ld.s: for STM32 Low density devices - startup_stm32f10x_md_vl.s: for STM32 Medium density Value line devices - startup_stm32f10x_md.s: for STM32 Medium density devices - startup_stm32f10x_hd.s: for STM32 High density devices - startup_stm32f10x_xl.s: for STM32 XL density devices - startup_stm32f10x_cl.s: for STM32 Connectivity line devices
. l) ^' Q4 X% a* hcl:互联型产品,stm32f105/107系列
8 N7 o+ B |* u* W1 A+ z% u/ gvl:超值型产品,stm32f100系列
/ d( `, F* O. v- Q6 h, C6 Ixl:超高密度产品,stm32f101/103系列: Q' L. D0 U& f: }
ld:低密度产品,FLASH小于64K
6 i2 J% N3 E2 j& y' g$ s' {1 xmd:中等密度产品,FLASH=64 or 128
6 _8 q: t$ S! x5 u) E3 \! _" Ghd:高密度产品,FLASH大于128 9 K( d9 ]5 Y) O5 z' r) y& t
/* Tip: To avoid modifying this file each time you need to switch between these
% \; ]* X' e- i m5 P7 ^: e" G! v devices, you can define the device in your toolchain compiler preprocessor.
5 j2 W0 ^4 ~5 ?7 E提示:为了避免每次编译都要修改这些文件,意思是可以使用编译器的preprocessor选项来定义芯片型号等,免得反复更新这个文件。…
2 I/ q, r5 Z2 o/ S- Low-density devices are STM32F101xx, STM32F102xx and STM32F103xx microcontrollers
( f, Y; @. i2 Q; s* n where the Flash memory density ranges between 16 and 32 Kbytes.4 ]1 z# }( H+ S i
- Low-density value line devices are STM32F100xx microcontrollers where the Flash" [2 o' a8 C- O' [+ U
memory density ranges between 16 and 32 Kbytes.
! H- b1 Y9 h1 m3 H" l6 `% Y- Medium-density devices are STM32F101xx, STM32F102xx and STM32F103xx microcontrollers这里定义的是各种产品线的FLASH的大小。8 H8 c$ K% n: n6 o6 q% m# f
where the Flash memory density ranges between 64 and 128 Kbytes.! e3 ^6 _2 ~" T1 w
- Medium-density value line devices are STM32F100xx microcontrollers where the , e- p+ j% o; Z* u
Flash memory density ranges between 64 and 128 Kbytes. 6 M! r/ C" w6 A5 v% k+ H& q
- High-density devices are STM32F101xx and STM32F103xx microcontrollers where
+ Q2 R! d; c9 x) _3 C2 J, Y the Flash memory density ranges between 256 and 512 Kbytes.' c- f$ K) Y [& S _% S" J
- High-density value line devices are STM32F100xx microcontrollers where the
0 ]' m$ b! v" `; L Flash memory density ranges between 256 and 512 Kbytes.
. [5 @) C& w5 X% k8 C- XL-density devices are STM32F101xx and STM32F103xx microcontrollers where
) A& x3 N U. U7 p3 Y0 k6 s0 c' f the Flash memory density ranges between 512 and 1024 Kbytes.
5 B) d0 t' T0 `( o, u- Connectivity line devices are STM32F105xx and STM32F107xx microcontrollers.
( \3 @- V: G( |5 {" p3 G */
' Z, \; Z- V: P% k! c0 o0 y* r( x# Q9 A8 S$ ?+ J+ _
#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)3 [2 A4 w8 B7 m* V! z
#error “Please select first the target STM32F10x device used in your application (in stm32f10x.h file)”. T7 C' T) n1 i" n. X3 F. ~
#endif 如果设备类型选择不正确,这里会报错的。
$ i( w# S4 H) @# H; T4 ~& T e, U" ^8 o [" n
#if !defined USE_STDPERIPH_DRIVER
" E: `, |' h# L! p% U/**
: d0 [. H8 r y9 J2 g0 F. t* Q* @brief Comment the line below if you will not use the peripherals drivers.
; d- G! U8 n+ I6 o% Y" o8 c In this case, these drivers will not be included and the application code will r U+ C4 w! W: C0 W+ k0 r9 ?
be based on direct access to peripherals registers - L+ @5 m( g" S3 g' ~$ [6 w. c
*/
; ^# K1 e# K$ S. p# E" U0 ] /*#define USE_STDPERIPH_DRIVER*/; i# i, _3 F( G+ s, U4 | H
#endif
9 P7 i$ j1 I$ m3 P8 L. a/ X( K, s6 u' I M2 J l
/**( }1 K, g. `. {( F+ i
* @brief In the following line adjust the value of External High Speed oscillator (HSE)$ m8 T/ C0 q6 H, c
used in your application , u* g# f" b, M5 m9 U! M
/ h, d- z, h8 b, g+ |, m
Tip: To avoid modifying this file each time you need to use different HSE, you
1 |: A5 X$ q8 t! F5 B$ y9 v& P$ W can define the HSE value in your toolchain compiler preprocessor.
4 d1 w3 h/ v) \1 L# f5 ~- }这些提示:为了避免每次编译都要修改文件,意思是可以使用编译器的preprocessor选项来定义芯片型号等,免得反复更新这个文件。… $ p1 Q& `% d5 h/ `$ ^5 J3 v2 \
*/
2 A- o" l% b6 z& F! |#if !defined HSE_VALUE
$ R5 l$ Q. r8 @# f2 w) x3 y#ifdef STM32F10X_CL ; E9 _% f; i; I: {
#define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
9 M* [5 B A+ N _" ^- A+ B6 d#else 3 {* V6 I2 ~8 Z* T4 u" \# ^! M4 T
#define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */) i4 F. x8 |; a4 X+ S$ z6 y% a6 B
#endif /* STM32F10X_CL */" w& p I2 J% x1 b, e# P8 P1 w
#endif /* HSE_VALUE */7 O2 v* c% l- ]! Q9 X
. e& Z, F0 s1 |6 _: f! R, a/ n8 N% M7 K$ R
/**9 `5 G+ O2 M( d6 o" R) ~
* @brief In the following line adjust the External High Speed oscillator (HSE) Startup ) l# ~: ~( H$ P7 p2 [1 [
Timeout value w* w# s9 K$ S* p, ^8 N ]
*/①、HSI是高速内部时钟,RC振荡器,频率为8MHz。 ②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。
) Z! N4 I0 r& D' Z8 i& l4 Q ③、LSI是低速内部时钟,RC振荡器,频率为40kHz。% D. h) g& _2 t* D* F
④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。! V( t- E( X7 ~: W
⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。
* g/ Z: [% A+ T! S( B( X' F, i1 U |
0 T# d0 G! {/ H" g6 \% e2 d# J* K
5 o4 e g0 y1 n' k! Y#define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500) /*!< Time out for HSE start up */
2 ~) L" [6 G3 p) a. l" `高速外部时钟启动时间) q7 q' ~/ P$ t6 ^8 v T: ^5 k) k
#define HSI_VALUE ((uint32_t)8000000) /*!< Value of the Internal oscillator in Hz*/
6 v! {, s. X1 C3 s外部时钟设置的值
7 G& Y/ h+ D/ X9 f! r/**
$ K' ?4 F, b' @/ J) V6 |) _9 t* @brief STM32F10x Standard Peripheral Library version number标准外设库版本号的定义/ E8 n0 N4 M' D
*/
: G2 o# E& }+ K& ?' c5 ]9 \#define __STM32F10X_STDPERIPH_VERSION_MAIN (0x03) /*!< [31:24] main version */ / j1 L" H- Z! T& n. @
#define __STM32F10X_STDPERIPH_VERSION_SUB1 (0x05) /*!< [23:16] sub1 version */
( H; ]( R' b! H#define __STM32F10X_STDPERIPH_VERSION_SUB2 (0x00) /*!< [15:8] sub2 version */7 i% l; k3 K+ p* P- g& C
#define __STM32F10X_STDPERIPH_VERSION_RC (0x00) /*!< [7:0] release candidate */ # y' ?6 [* o* @3 X
#define __STM32F10X_STDPERIPH_VERSION ( (__STM32F10X_STDPERIPH_VERSION_MAIN << 24)\2 ]9 e1 N s9 S% K5 M7 F8 U
|(__STM32F10X_STDPERIPH_VERSION_SUB1 << 16)\, {/ q/ E- G1 V% P9 ^4 j0 {, \! ?
|(__STM32F10X_STDPERIPH_VERSION_SUB2 << 8)\5 R- d0 L9 w. q3 y! X) O
|(__STM32F10X_STDPERIPH_VERSION_RC))
: x/ I) p% O7 b+ w- m5 ~% B( O' J! Q+ y! N5 I
/**5 e) U$ F! j3 f& P) J2 t1 W1 T
* @}
+ p% ?$ _& o% ~* x */
% M! E) H, `# u" ^: U3 i& [
+ ^5 N! Q9 c6 L1 L' k9 _/** @addtogroup Configuration_section_for_CMSIS
* ?. Q! H m2 u( { * @{
8 R2 _1 b, y+ Y# J. t$ N */ f9 ^, L7 W- H' O. A/ y: E
' x) C2 S+ i- ]7 X$ G3 c# D
/**: E$ E5 \& C8 X
* @brief Configuration of the Cortex-M3 Processor and Core Peripherals 配置Cortex-M3处理器和核内外设
# l R3 u9 `# d( V9 R1 e*/& [% |7 t6 ?* s6 ~. G* V' y
#ifdef STM32F10X_XL; W# o: V/ S, \7 h
#define __MPU_PRESENT 1 /*!< STM32 XL-density devices provide an MPU */
! S+ p2 @; h6 v) F5 `#else
! v4 W+ l) t: b ?. T+ ^, d#define __MPU_PRESENT 0 /*!< Other STM32 devices does not provide an MPU */1 g& O) O. {! ]+ F0 ^
#endif /* STM32F10X_XL */' |; g4 M `# D
#define __NVIC_PRIO_BITS 4 /*!< STM32 uses 4 Bits for the Priority Levels */
j. M! a1 _' ?# V. W#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */
! d+ f, J) I2 |4 L/ Y3 H# y
2 v( ^$ \3 Y- W/**
" [; F9 V. _$ P4 r4 e+ Z1 |* @brief STM32F10x Interrupt Number Definition, according to the selected device
* S& f) j" \ K/ i& v* in @ref Library_configuration_section 中断线定义,前部分对于所有STM32F10x都有相同定义,后部分根据不同器件容量采用条件编译定义不同中断线。
) ~6 \; g3 u! I; Q$ ?+ L+ d- {*/% O3 Z$ W1 Q/ |9 e6 H
5 B& c" a% x- p3 f————————————————————————————————————————————– ————————————————————————————————————————————– 这里是STM32比较重要的头文件 # i, Y! V. v% ^. u. \) a) @
/ m2 J8 g# t. Z/ m v% A/ a* }typedef enum IRQn typedef enum表示定义了一个枚举型的数据结构,你可以用题目中的 IRQn 去定义变量; K( X+ I2 w' }: |; n
{系统异常ID:
* h2 g7 `0 U! e6 t" e( `; S j G3 k& |
标号 | 中断ID | 描述 | NonMaskableInt_IRQn | -14 | 不可屏蔽中断 | MemoryManagement_IRQn | -12 | Cortex-M3内存管理中断 | BusFault_IRQn | -11 | Cortex-M3 总线Fault中断 | UsageFault_IRQn | -10 | Cortex-M3 用法Fault 中断 | SVCall_IRQn | -5 | Cortex-M3 SV Call中断 | DebugMonitor_IRQn | -4 | Cortex-M3 调试监视中断 | PendSV_IRQn | -2 | Cortex-M3 Pend SV中断 | SysTick_IRQn | -1 | Cortex-M3 系统Tick中断 |
+ i3 L( k8 c% p( y# o6 ~% ~ 外设中断ID: 标号 | 中断ID | 描述 | 标号 | 中断ID | 描述 | WDT_IRQn | 0 | 看门狗 | EINT3_IRQn | 21 | 外中断3 | TIMER0_IRQn | 1 | 定时器0 | ADC_IRQn | 22 | AD转换 | TIMER1_IRQn | 2 | 定时器1 | BOD_IRQn | 23 | 欠压检测 | TIMER2_IRQn | 3 | 定时器2 | USB_IRQn | 24 | USB | TIMER3_IRQn | 4 | 定时器3 | CAN_IRQn | 25 | CAN | UART0_IRQn | 5 | UART0 | DMA_IRQn | 26 | 通用DMA | UART1_IRQn | 6 | UART1 | I2S_IRQn | 27 | I2S | UART2_IRQn | 7 | UART2 | ENET_IRQn | 28 | 以太网 | UART3_IRQn | 8 | UART3 | MCI_IRQn | 29 | SD/MMC卡I/F | PWM1_IRQn | 9 | PWM1 | MCPWM_IRQn | 30 | 电机控制PWM | I2C0_IRQn | 10 | I2C0 | QEI_IRQn | 31 | 正交编码接口 | I2C1_IRQn | 11 | I2C1 | PLL1_IRQn | 32 | PLL1锁存 | I2C2_IRQn | 12 | I2C2 | USBActivity_IRQn | 33 | USB活动 | Reserved0_IRQn | 13 | 保留 | CANActivity_IRQn | 34 | CAN活动 | SSP0_IRQn | 14 | SSP0 | UART4_IRQn | 35 | UART4 | SSP1_IRQn | 15 | SSP1 | SSP2_IRQn | 36 | SSP2 | PLL0_IRQn | 16 | PLL0锁存 | LCD_IRQn | 37 | LCD | RTC_IRQn | 17 | RTC | GPIO_IRQn | 38 | GPIO | EINT0_IRQn | 18 | 外中断0 | PWM0_IRQn | 39 | PWM0 | EINT1_IRQn | 19 | 外中断1 | EEPROM_IRQn | 40 | EEPROM | EINT2_IRQn | 20 | 外中断2 | : _9 q( u; r; s: A
/** Cortex-M3 Processor Exceptions Numbers
) E" O, E: B6 W- S/ A*****************************************/CMSIS中的中断定义 & f, D _7 J1 r0 }, y1 w; {2 x6 E
1 H: Z4 x4 `9 l, N% i( V; L NonMaskableInt_IRQn = -14, /*!<1 q4 {4 y- {7 X
2 Non Maskable Interrupt 非屏蔽中断 5 z4 i) k1 c5 p9 x4 g4 V
*// R3 o: i3 ]) R1 }8 ~" ?
: G& H) j( B& ]. r, ]" k MemoryManagement_IRQn = -12, /*!<
8 `! Z+ k8 k C J0 z4 Cortex-M3 Memory Management Interrupt Cortex-M3内存管理中断
" e" d8 T" ]5 v- N" Y5 q3 R */ r/ O0 s2 d1 y! j4 l* i2 H' a# M' O5 n) F
! n6 c- |1 q8 Z BusFault_IRQn = -11, /*!<
) r) S1 N8 W G; Z2 A5 Cortex-M3 Bus Fault Interrupt */
. K6 J% Q! N! n) f' u, g# ?1 ?( @# \) J0 f
UsageFault_IRQn = -10, /*!<# h9 e! L6 J2 H4 R
6 Cortex-M3 Usage Fault Interrupt */
$ Q5 N% b; X9 x6 l# t2 @1 h
( Z; ^" {; Y$ k9 l# g0 A SVCall_IRQn = -5, /*!<
! |9 Y# @7 n' w11 Cortex-M3 SV Call Interrupt */
( T# G7 u X% k! ?9 v# \9 n2 }. e, z1 d; l o
DebugMonitor_IRQn = -4, /*!<1 l* H- L2 L# }5 l4 w8 u+ h; k( L
12 Cortex-M3 Debug Monitor Interrupt */' e* Q) J9 s1 L) [- G( k* F5 f
/ i% L: b+ H N& G" \2 G& F& f4 G
PendSV_IRQn = -2, /*!<# [1 J& T, w2 ~) ^6 c& {
14 Cortex-M3 Pend SV Interrupt */! s6 K: h+ ?+ U! d! T9 `
" p, g# x2 K1 F2 z) @- e; f
SysTick_IRQn = -1, /*!<4 y6 u _8 h( u9 p3 H0 q2 }
15 Cortex-M3 System Tick Interrupt */
% V! ~' ]8 w* I* t0 {
, C: Q: T% S: ^, j; W! j7 j2 l% r4 J, E6 |
: c8 |3 Y9 U( c( e* p
/* STM32 specific Interrupt Numbers ************************************************/+ B: T( f+ N2 P% L
0 Y" Y1 `4 p5 @% n+ t% _5 L WWDG_IRQn = 0, /*!<: u) h, x" G6 W" _
Window WatchDog Interrupt */6 F" [7 V6 Q4 T9 z0 E- X) H
. ~# U$ ^- b& |1 Q1 J) X
PVD_IRQn = 1, /*!<
z& x. f9 f; LPVD through EXTI Line detection Interrupt */
9 S0 N$ d0 y% J' Q/ K) w+ I6 Y% T* R, [
TAMPER_IRQn = 2, /*!<
2 R/ W& W* w; ~5 d+ e/ uTamper Interrupt */
1 M5 i# I" `; K v; [) k. u
, \8 o* r; q% L9 |2 I# H RTC_IRQn = 3, /*!<1 I, c+ U0 s, J& c1 f* {" K
RTC global Interrupt */
: J- ]& k o& `" W6 T
2 G( ?0 Z6 R/ i( `! N9 s0 E0 w0 j6 ` FLASH_IRQn = 4, /*!<4 W2 X2 ?" Q( M6 z4 H9 g* L1 D
FLASH global Interrupt */
9 f1 Y$ r- ?3 t* |: c8 w' a( w, i2 x! R# q% }
RCC_IRQn = 5, /*!<4 h2 O- a. J8 B0 [, h
RCC global Interrupt */
0 z; O. J% c& D2 G, [6 p/ l( [: L+ |1 z
EXTI0_IRQn = 6, /*!<) n4 Q: t" t$ i U$ ]- [' R* H& `2 u
EXTI Line0 Interrupt */
) s1 A p! x' D/ b* T" Y, ~) U* z3 b& ~' }, d; z, [- A
EXTI1_IRQn = 7, /*!<
+ ?0 S ~2 F. [& Q% SEXTI Line1 Interrupt */1 K' [- Y I0 B: K* p) y
0 p3 i5 h+ Q" E: V8 s EXTI2_IRQn = 8, /*!<2 t# P& i Z1 F* S9 u1 I/ e
EXTI Line2 Interrupt */! `. {2 i, @3 q- e9 k- o! b
4 O" e$ b% k/ u7 F0 ^ EXTI3_IRQn = 9, /*!<$ o# u. ]1 X; l
EXTI Line3 Interrupt */+ a& s2 \) T) v" g
) s( w- r- F, d' B3 i9 `( g EXTI4_IRQn = 10, /*!<
9 ]1 H% u1 [4 {" E) x. t2 h1 CEXTI Line4 Interrupt */
/ b. H7 A2 C H
+ J; e6 T/ `+ ]8 b9 v( r DMA1_Channel1_IRQn = 11, /*!<
2 ^1 H- h0 H! s- N% ^& e$ @ {! aDMA1 Channel 1 global Interrupt */
$ |% Z K' `; u) A
1 L7 l9 t ^ T P; l. P DMA1_Channel2_IRQn = 12, /*!<
) G9 Y( J; \5 gDMA1 Channel 2 global Interrupt */
$ ~' [, f/ Q1 I# ]0 |4 z
0 n3 R4 T3 X$ D4 E+ j: z7 T! m DMA1_Channel3_IRQn = 13, /*!<
" r8 ]* l( @ u- e2 EDMA1 Channel 3 global Interrupt */
6 u" `1 Q3 Z6 P. S% L2 T" ^
! e9 q: K) u% Z | j% L$ P* p6 K DMA1_Channel4_IRQn = 14, /*!<
7 {3 H% X; \6 P. O, QDMA1 Channel 4 global Interrupt */4 |# b$ c, X" _! ?; l) s
5 C# N- M; l7 `9 U' i$ r2 n S. Z
DMA1_Channel5_IRQn = 15, /*!<
2 @# e2 \6 O3 d/ Z8 GDMA1 Channel 5 global Interrupt */
: g! _/ l. B# N# y' ]9 f3 E5 o7 c- L8 l( O: o' @0 n8 F
DMA1_Channel6_IRQn = 16, /*!<
& [( R; l( N4 W( TDMA1 Channel 6 global Interrupt */
8 G% ^+ ]0 `, a; ?4 y4 {- m8 [& O4 g
% G5 K. ~4 w' F DMA1_Channel7_IRQn = 17, /*!<
( |, v; e5 o: }DMA1 Channel 7 global Interrupt */
4 V' r2 M9 h9 m& ~% Z# S% U: Z9 E
( m* U# s3 a5 s: {: [# c; e: L& B: E
#ifdef STM32F10X_LD: K/ ?4 t; \# W( \
1 `. p7 Z7 O3 T/ K$ j- U
ADC1_2_IRQn = 18, /*!<# _5 v4 }& P# F' n2 q
ADC1 and ADC2 global Interrupt */5 r0 T! Q/ s2 m/ ]" G- A( b2 R
: k" O5 _' L0 N" a7 O2 V
USB_HP_CAN1_TX_IRQn = 19, /*!<4 \) R6 {% t* z9 P) c" ]# L8 P
USB Device High Priority or CAN1 TX Interrupts */
( Y+ H; J e' U6 ^% P; W( j5 m; z3 |6 W" [
USB_LP_CAN1_RX0_IRQn = 20, /*!<
8 t" A1 P( v1 r$ ~USB Device Low Priority or CAN1 RX0 Interrupts */
: z( n- v2 j5 X Q6 @( I, _, r# \, @5 t! H7 k5 P
CAN1_RX1_IRQn = 21, /*!<
P! x2 l5 T" u: u) K. j) U1 mCAN1 RX1 Interrupt */1 R; x7 u; X8 ?& \( ?
: X; i+ ?* E) i: r CAN1_SCE_IRQn = 22, /*!<! J1 L* A7 v$ u/ b
CAN1 SCE Interrupt */' j6 [# E H& {7 I; [0 T; B
' X. ?; Q" W# ^+ a) o
EXTI9_5_IRQn = 23, /*!<' y9 n" K$ I* T0 ~# G- s; z+ V
External Line[9:5] Interrupts */
$ M& |* g0 `: b; \% j/ a
- e$ H4 h+ n, e* ?$ @/ `" k/ d TIM1_BRK_IRQn = 24, /*!<
9 q3 M" K8 ^6 ?4 v+ ?% BTIM1 Break Interrupt */) T2 d5 r/ m0 q- Z# Z# o2 v6 ^' O
0 }5 g k! _$ n8 ?1 {8 n+ m
TIM1_UP_IRQn = 25, /*!<
9 m5 `& K( @, O6 b% XTIM1 Update Interrupt */% U, q6 I ]' d/ H; w
# x1 n# A! p4 _& J% G1 ^ TIM1_TRG_COM_IRQn = 26, /*!<
7 T \) d K H& o! JTIM1 Trigger and Commutation Interrupt */
# y2 v6 {7 ?! q! [- N+ S
* W; u2 @, w! G8 h$ M W7 W3 q% U1 H TIM1_CC_IRQn = 27, /*!<9 }. j$ L5 w9 W3 P
TIM1 Capture Compare Interrupt */6 [. q& V* c5 M/ \
8 N. F* s1 F& L2 _* g) F& y( o A" v TIM2_IRQn = 28, /*!<
9 ^# H" T3 S v: k% J' HTIM2 global Interrupt */' `% F+ e7 e4 l( y D3 S5 h1 c3 Q
$ T9 ~- j# R8 [' p$ D2 e TIM3_IRQn = 29, /*!<. o& `7 u6 ^& M! v" m. N5 p( \2 s
TIM3 global Interrupt */9 a+ G+ s( A$ E/ ~# v, K6 D0 M S
2 t: Y4 k! \* S1 z I2C1_EV_IRQn = 31, /*!</ k3 ^7 H: f" `( l- x6 r( K
I2C1 Event Interrupt */
) z* ?/ a. O* i$ `& s; n. y7 r+ C( K$ T4 A3 q% q4 Z
I2C1_ER_IRQn = 32, /*!<4 l8 i' h8 A7 X5 h d0 J
I2C1 Error Interrupt */! m" q$ q8 X! Q- A2 J; p- V
( u* D5 w3 Z, @ e0 V! `
SPI1_IRQn = 35, /*!<
6 l9 w. f/ O% NSPI1 global Interrupt */
y" k# m2 ?' r" v' h. @9 _( v% B3 T- m: i; w4 t( @
USART1_IRQn = 37, /*!<
5 q' @! d; K& {, N1 K- ?9 F1 gUSART1 global Interrupt */0 L! H7 P8 ?, l) T: U' [
, W& K* a1 G$ A" E( s1 y8 b
USART2_IRQn = 38, /*!<
- M+ U# a% c. XUSART2 global Interrupt */
5 W% c: r1 z9 _0 @/ \8 v
/ m2 w8 O0 }. O. g EXTI15_10_IRQn = 40, /*!<3 e; g! d9 [, ]7 O/ {, l
External Line[15:10] Interrupts */
# _0 J ]' d U! y% R0 v3 t: ^
3 V7 V0 ? i0 J/ E3 A8 X/ X1 Q RTCAlarm_IRQn = 41, /*!<
3 F: b& r4 c4 F3 U! e( sRTC Alarm through EXTI Line Interrupt */
" `& R2 X2 W7 } Z. f. z' G! l) W& s( V: Z
USBWakeUp_IRQn = 42 /*!<3 X# s+ e6 W! z6 L: Z
USB Device WakeUp from suspend through EXTI Line Interrupt */
- [2 z0 s/ `+ Z7 ]/ s- b K- A' R4 K! v7 U" v$ W# q
#endif /* STM32F10X_LD */ ) x2 n4 z- H, k5 |
# \' a2 {* o4 f) ~) E* ?. y
6 w& S+ L' ]2 T0 y0 x: c; K) {
, I7 w. Z6 O5 e2 n! }#ifdef STM32F10X_LD_VL5 i' M( a. \6 c7 Z( d
- }! H1 o0 s3 U- P: W; R b: W ADC1_IRQn = 18, /*!<
1 J2 Y0 e" {$ w( J6 b, IADC1 global Interrupt */9 E, z* o) y; Y/ M+ _
. K! D& i8 Z1 ^0 F+ u" r
EXTI9_5_IRQn = 23, /*!<$ H$ `$ ^. K! }
External Line[9:5] Interrupts */! W( ]* \6 O( j* L/ K2 P
; b3 E7 e6 d% f! C, F3 t' J, L+ i
TIM1_BRK_TIM15_IRQn = 24, /*!<, J8 k* i5 Y D/ Q: v- s V
TIM1 Break and TIM15 Interrupts */1 @3 e% w9 w7 P) g" ]
5 p2 H0 m( s: K TIM1_UP_TIM16_IRQn = 25, /*!<
1 t* C3 B# U5 z$ w, M) bTIM1 Update and TIM16 Interrupts */. Z1 ^5 V" a9 ]2 B. y% b _* N; P: [4 v
! G" N, M, J, C q/ P! G TIM1_TRG_COM_TIM17_IRQn = 26, /*!<- b" F7 P+ {8 \. G
TIM1 Trigger and Commutation and TIM17 Interrupt */2 r: @, L; l) T( q$ T& K
6 Y% N6 y" X7 t" X6 c) |, i
TIM1_CC_IRQn = 27, /*!<
6 N- ~' Q; y- K$ k7 @0 Q8 }! GTIM1 Capture Compare Interrupt */
) }9 L+ d' E0 @' B: \
; O$ `* {- C' M. Y, j3 \, ?- ~ TIM2_IRQn = 28, /*!<! i; S. ~* j0 m& [ m& L9 A
TIM2 global Interrupt */
! R0 r R% P7 i( H5 L5 B$ C
# ?9 O! B, w' V# ^, R% r6 m3 F TIM3_IRQn = 29, /*!<2 ^" x' I$ m V7 i
TIM3 global Interrupt */
8 t [# q- ?% L; l6 x$ j; ^1 L' N J; f3 Y/ n* @
I2C1_EV_IRQn = 31, /*!<8 p; x* b& i1 A- x
I2C1 Event Interrupt */4 N8 \& o V% j2 }- q' b
7 }) S; L! A; G; G7 L2 J
I2C1_ER_IRQn = 32, /*!<0 `1 r5 O' i2 {' m; w. c& M" @
I2C1 Error Interrupt */
! m% w' X; Z; l* D/ |0 w7 G2 j- f1 m, l
SPI1_IRQn = 35, /*!<" x, g# s: N) q `1 C- q
SPI1 global Interrupt */
7 y4 v$ t+ h$ [0 Z) p9 T* |2 { L7 _
USART1_IRQn = 37, /*!<
4 L& U# F. c* p. L7 PUSART1 global Interrupt */
1 o6 _" Q+ a1 S$ J& x" `( n+ ]" h. t8 M4 o |! m
USART2_IRQn = 38, /*!<& S" T h+ Q; R" Y: e" J- p
USART2 global Interrupt */8 i2 v/ s6 q8 m4 m! H. S# p
# m' Y9 J+ e% h6 E. u) ` EXTI15_10_IRQn = 40, /*!<9 @! }# [) p1 U! j
External Line[15:10] Interrupts */0 e$ O0 e% G( A1 w: b6 m+ l
4 `8 v0 G/ v4 {; s9 c4 R
RTCAlarm_IRQn = 41, /*!<' e: `/ F& R: Z7 M" |. O
RTC Alarm through EXTI Line Interrupt */" D- d0 U3 d/ ]2 V0 c/ z
/ S+ {+ K$ i! q; q CEC_IRQn = 42, /*!<* U" Y5 I% f# O" e' Y5 N( n j' J
HDMI-CEC Interrupt */
- q3 R* w) n [( d; I. {3 g8 D! ]) \5 h' s
TIM6_DAC_IRQn = 54, /*!<5 S; l$ s9 B5 |1 y% }
TIM6 and DAC underrun Interrupt */% h% @/ ]# X4 ~ ?$ {. U9 b5 P
, d& ~0 C6 J5 p7 {, ~) _
TIM7_IRQn = 55 /*!<
5 r* ~9 k- d& L8 |% u( J; A- }TIM7 Interrupt */ 6 E0 ~5 \9 }& e- e+ l6 C9 z
9 S7 k- h1 i+ T+ h& C) {1 ?#endif /* STM32F10X_LD_VL */# I. M/ Q2 \& }4 s& p' ?
F1 i4 j: f3 X8 c3 v
9 [! R1 M' a% f/ P
5 {: A2 ~ k7 P! I! w——————————————————————————————————————————-
& U, N! A9 R; q6 K1 \——————————————————————————————————————————- 这里是STM32比较重要的头文件
, E& C: m; M4 A* {# W5 r4 O 系统异常ID:
# w- [* R, I4 V( {8 N8 L! M * {4 A' T7 c) f5 y
7 j7 p" N5 w8 l6 p
标号 | 中断ID | 描述 | NonMaskableInt_IRQn | -14 | 不可屏蔽中断 | MemoryManagement_IRQn | -12 | Cortex-M3内存管理中断 | BusFault_IRQn | -11 | Cortex-M3 总线Fault中断 | UsageFault_IRQn | -10 | Cortex-M3 用法Fault 中断 | SVCall_IRQn | -5 | Cortex-M3 SV Call中断 | DebugMonitor_IRQn | -4 | Cortex-M3 调试监视中断 | PendSV_IRQn | -2 | Cortex-M3 Pend SV中断 | SysTick_IRQn | -1 | Cortex-M3 系统Tick中断 |
1 _6 O. D2 r1 Q7 z/ p5 w- A 外设中断ID: 标号 | 中断ID | 描述 | 标号 | 中断ID | 描述 | WDT_IRQn | 0 | 看门狗 | EINT3_IRQn | 21 | 外中断3 | TIMER0_IRQn | 1 | 定时器0 | ADC_IRQn | 22 | AD转换 | TIMER1_IRQn | 2 | 定时器1 | BOD_IRQn | 23 | 欠压检测 | TIMER2_IRQn | 3 | 定时器2 | USB_IRQn | 24 | USB | TIMER3_IRQn | 4 | 定时器3 | CAN_IRQn | 25 | CAN | UART0_IRQn | 5 | UART0 | DMA_IRQn | 26 | 通用DMA | UART1_IRQn | 6 | UART1 | I2S_IRQn | 27 | I2S | UART2_IRQn | 7 | UART2 | ENET_IRQn | 28 | 以太网 | UART3_IRQn | 8 | UART3 | MCI_IRQn | 29 | SD/MMC卡I/F | PWM1_IRQn | 9 | PWM1 | MCPWM_IRQn | 30 | 电机控制PWM | I2C0_IRQn | 10 | I2C0 | QEI_IRQn | 31 | 正交编码接口 | I2C1_IRQn | 11 | I2C1 | PLL1_IRQn | 32 | PLL1锁存 | I2C2_IRQn | 12 | I2C2 | USBActivity_IRQn | 33 | USB活动 | Reserved0_IRQn | 13 | 保留 | CANActivity_IRQn | 34 | CAN活动 | SSP0_IRQn | 14 | SSP0 | UART4_IRQn | 35 | UART4 | SSP1_IRQn | 15 | SSP1 | SSP2_IRQn | 36 | SSP2 | PLL0_IRQn | 16 | PLL0锁存 | LCD_IRQn | 37 | LCD | RTC_IRQn | 17 | RTC | GPIO_IRQn | 38 | GPIO | EINT0_IRQn | 18 | 外中断0 | PWM0_IRQn | 39 | PWM0 | EINT1_IRQn | 19 | 外中断1 | EEPROM_IRQn | 40 | EEPROM | EINT2_IRQn | 20 | 外中断2 |
( [ ]3 D' k4 w0 r2 X' H#ifdef STM32F10X_MD這是我們前面講過的不同的芯片型號,對應1 L% M( b- a; U9 a' ?9 n
著不同的中斷級別。請大家自行研究! # C( o: }! L" m2 l$ A/ W
, @9 p9 q' y" u; b ADC1_2_IRQn = 18, /*!<
1 w" a& s4 l! x& `ADC1 and ADC2 global Interrupt */
0 k& v6 G$ \7 R; m* d
; l: S2 r! b- X6 n1 [6 ]% q' U$ }( U USB_HP_CAN1_TX_IRQn = 19, /*!<
, J! X z& y7 cUSB Device High Priority or CAN1 TX Interrupts */
8 m8 G1 B8 q# y
7 i1 ^9 T; j G4 k, k USB_LP_CAN1_RX0_IRQn = 20, /*!<
1 w \- M( G" V( `/ ~5 k: dUSB Device Low Priority or CAN1 RX0 Interrupts */1 N5 P& n, [( w8 U
2 S8 M) Y0 x9 m1 y/ W* H' X1 O& {) O CAN1_RX1_IRQn = 21, /*!<
( |4 b T6 T& V- p6 ~: n: ZCAN1 RX1 Interrupt */
0 o) j0 `* ?2 ~$ i) z
% _; I3 @/ x2 z$ \ CAN1_SCE_IRQn = 22, /*!<
1 O& z& z9 V, T$ b1 ?0 aCAN1 SCE Interrupt */, E8 J: W0 Q# C
/ r$ X3 J) e! f3 G. O1 M
EXTI9_5_IRQn = 23, /*!<
! X0 V8 L) ?5 \6 U4 wExternal Line[9:5] Interrupts */
. r2 ]& U- z+ c. t- [5 L6 \' L, t) T6 r. L' `
TIM1_BRK_IRQn = 24, /*!<
- H+ j6 ~+ w2 GTIM1 Break Interrupt */
( x+ Q2 Y. z% C/ K" ?& u
% t) M, i, P* w" t9 H- Y TIM1_UP_IRQn = 25, /*!<
/ h/ L0 A, c2 tTIM1 Update Interrupt */
# \' i3 r8 @2 w3 w6 z1 z% j, H. A$ A" m& m0 ] [! D3 s2 q0 K$ T
TIM1_TRG_COM_IRQn = 26, /*!<
3 m. Q' I- }, `9 A8 K# ~ j& X6 \TIM1 Trigger and Commutation Interrupt */+ t( _* i( d: C8 w7 X" m- }1 b# |
1 \1 B" a: R! [& ^6 B; \" n3 u/ Y TIM1_CC_IRQn = 27, /*!<
* ^! L: c( E( b7 d8 A) zTIM1 Capture Compare Interrupt */
; k* L D" P: d$ ^; p4 q2 h. `; G6 \ g& C' O/ `1 Z
TIM2_IRQn = 28, /*!<
2 u2 I, Y* m& p e+ rTIM2 global Interrupt */
+ H) n( R# d& Z4 D& X8 X/ S* n4 M: T! F/ T$ [& t) ?
TIM3_IRQn = 29, /*!<6 y5 l+ d! N5 F n) D. p) T
TIM3 global Interrupt */
* j" M; {9 k, @* C' A( c! C. o6 b6 i+ n7 W! U1 S: J
TIM4_IRQn = 30, /*!<& }6 n% `7 Q5 L& Q" q/ O9 h9 J
TIM4 global Interrupt */" Q# v$ C/ x5 X9 ~4 [1 R, v/ I
* K1 ~$ A, g! W5 b P I2C1_EV_IRQn = 31, /*!<
; p! c, i. L1 L; kI2C1 Event Interrupt */( [' w2 Z+ s, W) U- Z
3 n7 G* ^: M: S3 Q9 m% N. T7 m& H
I2C1_ER_IRQn = 32, /*!<0 V$ a5 Y, T* {! B
I2C1 Error Interrupt */; Q* f) j Z- G( V0 c9 L" [6 L
" { l4 A$ S5 X6 W/ c
I2C2_EV_IRQn = 33, /*!<
! X+ P! @6 J5 `# d4 vI2C2 Event Interrupt */
$ a' ^- Y5 N# v
1 e+ k- w. \0 p6 Q8 k I2C2_ER_IRQn = 34, /*!<
* h7 g8 [ s, F" c5 hI2C2 Error Interrupt */
5 `. A) J5 I7 [% _. J3 e2 @0 x& l. c* W7 ^7 O
SPI1_IRQn = 35, /*!<
' l4 C+ M" J! v5 f. D0 ]SPI1 global Interrupt */
6 h& d% N; z; G$ d) H
2 S6 {! b5 |8 @/ b3 @ SPI2_IRQn = 36, /*!<2 f! s$ `8 e/ ^6 P8 w
SPI2 global Interrupt */0 f: A4 U% y2 A) ~2 z U
% F( q. T5 Y' c) }2 V& s USART1_IRQn = 37, /*!<# r* n3 T. i, z! g+ R6 p
USART1 global Interrupt */
6 j" p; R3 y" G4 t' |5 M" |
$ ~9 {! b: T$ U2 H0 m3 ^ USART2_IRQn = 38, /*!<
* P8 L0 R; `3 ?0 J; Y. aUSART2 global Interrupt */! B# b7 i1 U/ \# f% \" P" p7 G' e
0 u. a* f1 o; t8 T) K+ w
USART3_IRQn = 39, /*!<4 A* G" ?0 q1 E8 P, b/ w7 F
USART3 global Interrupt */
# b: ~2 H7 C- m: C8 D: X: u- s( U
EXTI15_10_IRQn = 40, /*!<
9 }/ e! y$ Y% t" TExternal Line[15:10] Interrupts */& S2 b. k, e3 M5 {5 {
" d8 o; F" U4 m
RTCAlarm_IRQn = 41, /*!<, L7 X) l3 a8 x* m
RTC Alarm through EXTI Line Interrupt */2 z4 u* ]! h- c2 Y. F6 Y* C
2 m h" d: w |1 a; b o9 m7 Y
USBWakeUp_IRQn = 42 /*!<
4 U, @! x F# _4 p1 F2 u! OUSB Device WakeUp from suspend through EXTI Line Interrupt */
# ^( A, y- T1 |5 D
& j; A% s# N5 V2 l#endif /* STM32F10X_MD */
1 H, V; |; O; g9 B# J+ d# z a8 K" |+ y) W: i, i" }
W, T% ~4 F4 t, [! S# S: E. H1 s+ S' \& c5 {5 n' N5 h
#ifdef STM32F10X_MD_VL這是我們前面講過的不同的芯片型號,對應$ o$ m+ `0 t# u3 W" o- C! D
著不同的中斷級別。請大家自行研究!
( G3 c Y; ^' Y. i" l7 K r1 e5 o: J: B' T8 R0 K2 I& ^
ADC1_IRQn = 18, /*!<6 `5 f1 l3 H- T7 [* j% v7 k3 s
ADC1 global Interrupt */
! D9 M: C5 `2 M( {7 Z7 `6 I, x7 u5 p: A* t6 G
EXTI9_5_IRQn = 23, /*!<
/ F ~6 x0 O, T/ s0 s+ J% uExternal Line[9:5] Interrupts */
. T3 O1 J! F% R( I; T5 y
8 }0 m( \ W/ m: [5 R" ^ TIM1_BRK_TIM15_IRQn = 24, /*!<
2 c- q; `# X5 l/ ^0 RTIM1 Break and TIM15 Interrupts */' H2 `1 Z% u3 ^( g- g
: A) a6 `3 H8 k+ I
TIM1_UP_TIM16_IRQn = 25, /*!</ }- b$ y/ v* {7 O
TIM1 Update and TIM16 Interrupts */
6 a( K6 c* c3 ~( d% v
$ }* x1 L7 L' H' p0 T1 n- F TIM1_TRG_COM_TIM17_IRQn = 26, /*!<9 |5 S g' a6 r
TIM1 Trigger and Commutation and TIM17 Interrupt */ T5 Y- ]5 S# E) x; n/ ?
5 p0 t, M2 Q8 `) M
TIM1_CC_IRQn = 27, /*!<" \% |& U6 }2 g9 R2 u, q$ A! E
TIM1 Capture Compare Interrupt */# A' O4 `4 m: Z Y9 j5 ?
) ?. T0 b; ~7 w
TIM2_IRQn = 28, /*!<9 ~* o' p/ K& M1 P
TIM2 global Interrupt */
?+ L# j: n s
- h& n1 T! f) U TIM3_IRQn = 29, /*!<8 f g$ H% ~% q+ P/ r
TIM3 global Interrupt */( M g) k5 m0 b2 X$ h4 T' R, W
6 y. X% e9 c' z x TIM4_IRQn = 30, /*!<$ y2 V+ \8 s# _/ E. r% h
TIM4 global Interrupt */
9 A' @; p& S* S" C- Y7 r. _2 w d& ?' {$ D
I2C1_EV_IRQn = 31, /*!<( ~. A; F4 W: o& q$ P& V
I2C1 Event Interrupt */
% ~, m5 ]7 O7 v' r% t7 o' T) M4 @% J7 \8 e1 e. I( z+ e1 E
I2C1_ER_IRQn = 32, /*!<
* z3 B- i. [$ _0 c) {/ I" v5 nI2C1 Error Interrupt */6 ]4 `. H4 f/ [
, p* D: z+ m+ x, g( W% R
I2C2_EV_IRQn = 33, /*!<
, I& K: Z. v$ g _$ GI2C2 Event Interrupt */( _5 W( k9 z5 H& e: n
: u/ Y* U4 J+ F; w+ N I2C2_ER_IRQn = 34, /*!<0 b/ i' X9 b+ T; O; ~
I2C2 Error Interrupt */, C2 U" H9 X; `! ]# n, ?* N+ R0 y
% ]% m0 {3 d2 B% v SPI1_IRQn = 35, /*!<& q2 ~- i" {! G. u) Q
SPI1 global Interrupt */
, t9 h0 ]9 r& z4 I7 w! \ R0 V- i7 f" }' K. P% Y& S
SPI2_IRQn = 36, /*!<
+ l( u+ X! w2 g# ]SPI2 global Interrupt */
+ Q+ A3 F* S# g! B$ Q6 ^
/ }' _3 Y' m1 n* R& d USART1_IRQn = 37, /*!<
% x- C( `# T: s- MUSART1 global Interrupt *// ^7 ]8 I4 F, w
9 I- a8 M% X! ^9 f1 `5 y
USART2_IRQn = 38, /*!<
1 [! I) J' P" `* ~USART2 global Interrupt */
' M2 g, O4 R; q+ \8 J3 b9 S! c6 F, E* m! Y
USART3_IRQn = 39, /*!<
* I/ {, n* c( m2 K+ @USART3 global Interrupt */
; ]9 `6 n0 {* R
4 M: y8 k* j! B EXTI15_10_IRQn = 40, /*!<- R2 g L3 A: f6 B, s0 Q
External Line[15:10] Interrupts */- L s" g& M* X; W i( j4 X
1 ~$ Q/ R- s9 N0 @% S RTCAlarm_IRQn = 41, /*!<6 K/ b+ C- Z! _
RTC Alarm through EXTI Line Interrupt */3 r5 _5 @; P7 A8 t' K3 a
o$ Z1 d* ?- D8 g+ Z CEC_IRQn = 42, /*!<. R: z1 X, D/ N8 s' \
HDMI-CEC Interrupt */
; @3 _+ F; ?( f, F! `( U
. a1 a7 }7 ` H! w) k1 m$ K( ?2 Y TIM6_DAC_IRQn = 54, /*!<
N% `: n8 k3 f: GTIM6 and DAC underrun Interrupt */
5 c1 E+ k( c @9 H. f' v2 V2 k5 ?% e7 K( k) U+ C
TIM7_IRQn = 55 /*!<4 T, K$ y: k/ x* R) P& f
TIM7 Interrupt */
1 t4 x5 V4 T+ y h2 ]- V; S; D- e+ N$ H% b0 Z! O& T9 a8 f
#endif /* STM32F10X_MD_VL */' @ y! } X) i7 z: } }9 Q+ |
+ _) o$ S# [% l0 Z% X; Y
3 ~2 w3 ~0 z2 i9 F& I. ^& F+ S/ n s! o, l: \! w& ?% i
我們通過這個枚舉類型,可以知道系統所有的中斷都在里面,而且可以了解它們的ID,這就代表了它們的中斷級別。* ?) l" h$ M( ^
7 ~7 |9 ?* l& W* {* L5 p! w+ m
! }+ @% L j* q 0 t: V, F$ J0 G" T0 Q ^
———————————————————————————– ———————————————————————————– #include “core_cm3.h”STM32的内核是ARM CORTEX-M3,这个core_cm3.h包含的是一些内核相关的函数和宏定义,例如核内寄存器定义、部分核内外设的地址等等,其对应的是core_cm3.c文件。初学可以不管他,只要把它包含进工程里就行了,这里都是非常底层的函数,上层的一些函数直接调用它们了。如果对CORTEX-M3内核有兴趣或者基础较高,想深入了解这些函数,可以仔细研读一下,我们在后续的开讲中会仔细讲解这一个文件的内容。: `( W" B$ q8 a6 ?
#include “system_stm32f10x.h”这个文件就是我们现在所讲的文件了。4 m" D! I6 n$ Z5 r. b
#include <stdint.h><stdint.h> 定义了 int16_t 、 uint32_t 、 int64_t 等整型,在需要确定大小的整型时可以使用它们代替 short 、 unsigned long long 等,在 C 整型中,只使用 int 。
: o( F* u' U4 Z& Q- a+ M, Z% e; s
) w' a% y, M/ _& S% N/** @addtogroup Exported_types
5 j9 @ {- Q/ {! q$ @: B5 ^# [ * @{1 G: F1 C, ^4 |8 w# D& |4 k5 W: ]! P
*/
5 L! c9 s4 C; d* |9 q2 d1 w- s3 G8 N6 ?
/*!< STM32F10x Standard Peripheral Library old types (maintained for legacy purpose) */由于新的文件与老的文件会有不兼容问题,所以要转换变量类型。; @$ \ n) h, Y; [
typedef int32_t s32; typedef 在计算机编程语言中用来为复杂的声明定义简单的别名,与宏定义有些差异。它本身是一种存储类的关键字,与auto、extern、mutable、static、register等关键字不能出现在同一个表达式中。
' H% N ?2 C1 b9 S9 @6 r# y* V8 z《变量类型》,3.0以后的版本中使用了CMSIS数据类型,变量的定义有所不同,但是出于兼容旧版本的目的,以上的数据类型仍然兼容。
! T! x- r! ^. f' rCMSIS IO类型限定词 IO类限定词2 H% V( i. Y3 G0 K; q! R7 C
| #define/ B( C0 ^3 D; X# H" F
| 描述( c' B1 v& O8 }# F5 t+ |! [
| _I% e* D! t5 u! @$ \4 s
| volatile const
' z1 j; y4 c. E4 S6 u3 X7 ^ | 只读访问2 E: h" C" y/ a* G4 i$ N4 M
| _O
7 j8 N9 z: ?5 X1 U | volatile; B" M0 u7 }1 Z
| 只写访问/ C5 x: V! ~# n; i
| _IO' L) Z" {, O+ O( S1 O9 _2 C
| volatile& X' W% l4 F: o1 W% g
| 读和写访问
M$ |/ V& a0 j" B! \ z | ! @4 l" Q$ x" T# J0 y9 E
件库与CMSIS数据类型对比固件库类型 w- c6 D5 t8 u# c0 |8 {& J3 R
| CMSIS类型6 K* z9 |5 U5 W6 w1 r
| 描述- h: E5 p# o& ~) V, S2 B1 j
| s32
( d" Y) R( ]0 M2 ^# Y | int32_t/ y7 Q* q& `+ M0 a
| 易挥发只读有符号32位数据1 k8 Z# }, u7 J0 M4 K
| s16; F# d [) O7 G4 d; q
| int16_t# D2 \: q! Y! @( F- e
| 易挥发只读有符号16位数据
& ]/ ~: U! k# {6 K | s8. j" z% T4 n# }* L9 \- V
| int8_t9 W, Q5 }0 Y# b5 N* k1 \ F; J/ a
| 易挥发只读有符号8位数据0 K/ c0 M" Y0 E* h3 H4 @! c# j% }8 G
| sc32
4 r8 d- N1 o9 d8 { | const int32_t
. u! [; h3 ?( R' P V. P | 只读有符号32位数据4 a# u* d4 d$ c: h6 L. D
| sc161 }: q, M5 z+ e2 m" X
| const int16_t
: c$ ]) P2 m, a, H( a: {8 n1 [ | 只读有符号16位数据1 v: P$ T- Q3 g, n
| sc8- j( w/ X% ?' ?) q- I% \ @% i* `
| const int8_t3 m4 a8 G! ?1 f/ m* {
| 只读有符号8位数据
. s9 Y, {* l _1 I0 U2 } | vs328 w0 V2 k, o+ l' a( k1 a. A
| _IO int32_t0 X" b6 J! C k0 S+ P5 R1 V0 E( R
| 易挥发读写访问有符号32位数据1 r9 B8 t: S! Z+ J
| vs16 i* p) O6 `' x$ Q# }
| _IO int16_t. `9 }5 q8 |. m6 X) T0 V+ y
| 易挥发读写访问有符号16位数据. f8 m/ ~( E2 K& A* i
| vs8
4 _9 j4 ^+ T& X5 N | _IO int8_t0 z0 M# V( n- c9 x
| 易挥发读写访问有符号8位数据
7 _" f' Z4 |: p6 V: q/ Z! T- P: x | vsc32( v9 A- l- K" ]9 S* b' r8 k' i
| _I int32_t% Z% j8 j" C) U, ]' w
| 易挥发只读有符号32位数据2 u1 c6 k: o; C) |$ y+ C
| vsc16
; u# I% }( H1 p1 R. r9 |# y. y+ O | _I int16_t
/ C `' i* N: r; Q) C I | 易挥发只读有符号16位数据+ [, P0 \/ L7 A
| vsc8
4 p% ?/ V. F2 K0 T. ?4 h | _I int8_t
6 K( _! d6 X4 k: X | 易挥发只读有符号8位数据) M+ ]* k; Z3 ?/ V6 D
| u32
2 c8 _5 e" G5 h; z | uint32_t
4 F5 D: F4 |9 a2 p- h | 无符号32位数据3 G- @- A2 N% `. G# ]4 r
| u16
5 D# Q% {6 R* @. t3 b' }2 A ? | uint16_t2 Q! \; D( P; [/ `5 g
| 无符号16位数据/ m J1 L- t6 @. `( {% A" |
| u8( Q' x! j% d) `, y; a+ Y/ b2 d
| uint8_t
/ c/ N. }5 A4 Y9 s | 无符号8位数据1 m5 ^% M6 ?. e, {; [
| uc32/ ]4 @+ a }1 _: Y1 W9 F" t9 ?8 B
| const uint32_t: X2 ]5 o7 L, I" m: ]$ S6 |
| 只读无符号32位数据
/ k# C/ r6 k8 m, v& ]9 ` | uc167 {6 h. H; ?8 X: H9 i+ F3 o
| const uint16_t
* ~6 l$ x" h0 ^1 `# { | 只读无符号16位数据
7 U& Q# F Y( m+ w1 _. a | uc8. s# U9 y& b1 R+ P5 C
| const uint8_t: X* @" q+ R) m, _& U& P
| 只读无符号8位数据6 x, A0 @: x; r& B
| vu32
/ W% l( |2 s* S: a | _IO uint32_t* m( A1 Z1 [7 E: d- y
| 易挥发读写访问无符号32位数据: h; v' s0 x4 Q9 {4 m
| vu167 r7 @% l( U9 X8 e2 z
| _IO uint16_t( I: u) ]1 s0 V$ j& D9 q$ @ A0 d
| 易挥发读写访问无符号16位数据; v' X$ E5 O9 g* f7 [4 t/ b7 R2 l& \
| vu8
( Q2 W! R0 z0 J- t! r# @ | _IO uint8_t
( K8 F! `. O6 e& q | 易挥发读写访问无符号8位数据7 J0 x$ r- m1 {! D8 P1 }
| vuc32
4 J. I- w4 }, B) f- s' C- H/ O | _I uint32_t: n, n) X- Y( r8 o5 U- @% n
| 易挥发只读无符号32位数据 D6 _$ o: `" e/ a/ o# R; L7 U5 b
| vuc16) y+ Z6 u8 ^( B* {) g, ~0 N; M
| _I uint16_t6 q$ U; R5 C! ^/ X) ~: `
| 易挥发只读无符号16位数据
! a7 L2 y( a$ f# J" Z | vuc8" B0 A5 G& @) [3 {* _) i9 h: b
| _I uint8_t! ~" a* Z% z9 r( B
| 易挥发只读无符号8位数据* [) |2 W; |/ p" i/ V4 p( l2 G
| . { d1 e" U+ b$ ?' ~
- p8 x6 ?" N, t; H
n: y+ b& _4 U& V' @ stm32f10x.h文件中还包含了常用的布尔形变量定义,如:8 b; d% c; q0 |$ B8 S- o7 `5 G
1 typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;- w7 ?+ s; w; `' B; w( ]' o
2
0 E; f1 p2 A/ c2 _9 v1 Y& r3 typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;
3 ?. k- k; D5 d/ Q. k4 3 J; a u, I9 m+ x) z0 Y
5 #define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE))
% M# ~0 V4 c+ q# t/ _! h6 . P; i, N' {* `( ]: F& ]' [4 U) \
7 typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus;. N5 X+ M+ Q' P& D
不同版本的标准外设库的变量定义略有不同,如3.4版本中就没有之前版本的TRUE和FALSE的定义,用户也可以根据自己的需求按照上面的格式定义自己的布尔形变量。在使用标准外设库进行开发遇到相关的定义问题时应首先找到对应的头文件定义 。" b* {7 c3 y9 S5 o
* ]& i+ @) {7 U. p2 x* m* q: Y0 j
* M8 N5 B& K7 G$ }4 i8 ttypedef int16_t s16;
0 u7 N) p# S" M/ i. m& y3 \typedef int8_t s8;, I/ L& W4 c# N7 x# h' h$ L
typedef const int32_t sc32; /*!< Read Only */. t6 y* E; U0 {7 m- I8 W
const是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性。另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助。另外CONST在其他编程语言中也有出现,如C++、PHP5、C#.net、HC08 C。
9 m& i" Y4 U$ z9 s! Etypedef const int16_t sc16; /*!< Read Only */5 V# H! V; ]6 |: w( E. D/ u" E
typedef const int8_t sc8; /*!< Read Only */
& F2 o# u9 h# W& m/ O6 A* `9 n; D& J/ m) q* R3 `' ~5 J9 p N1 [+ d
typedef __IO int32_t vs32;
1 e/ A* B* a& c% u; Htypedef __IO int16_t vs16;
4 ^: p% E- @7 K1 Dtypedef __IO int8_t vs8;
% \( ~+ K8 i. c$ f
) e6 F y# I6 U6 h# ~typedef __I int32_t vsc32; /*!< Read Only */
6 P# k9 @# l% D; ^2 f. Vtypedef __I int16_t vsc16; /*!< Read Only */
: o) |7 f( V1 H4 Ptypedef __I int8_t vsc8; /*!< Read Only */3 L! Z2 m# \7 X1 G/ D. M$ ~
7 K7 p- H, B: i/ v; w
typedef uint32_t u32;( |9 v( w. b$ D5 b2 b1 f
typedef uint16_t u16;' J6 A) f: C+ F- l
typedef uint8_t u8;* \7 b; K9 P# H, b, g+ X
: \) r7 Y$ O8 ?( t3 ^3 G6 a
typedef const uint32_t uc32; /*!< Read Only */
+ b! c; y) }3 a9 r% C; ^# Ktypedef const uint16_t uc16; /*!< Read Only */
& {- N8 g$ M$ I& P7 d' k" i" ntypedef const uint8_t uc8; /*!< Read Only */
# ~$ ], U8 K7 G/ H' X5 V4 T" z% B
typedef __IO uint32_t vu32;
( P6 C# I2 E/ B: F- `" {2 n* ytypedef __IO uint16_t vu16;
5 I6 C# a% X& r, {& r, Vtypedef __IO uint8_t vu8;/ D2 Q2 b9 d* D: C. y3 A5 e
% G" F0 z; r% o8 S0 ?* Ntypedef __I uint32_t vuc32; /*!< Read Only */$ Q9 S: U- i, v% a& @# a8 h
typedef __I uint16_t vuc16; /*!< Read Only */& D- h& v f. x6 c$ ^" d
typedef __I uint8_t vuc8; /*!< Read Only */
4 O6 o8 G/ m8 y1 W e6 l) a- c; f+ {
typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;
8 W& S" k j9 ~& P, Y& v, L* G1 d" P# d m9 U8 G; g1 {/ c6 F
typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;
. L7 {0 Y, I. H. _0 ~#define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE))" j' y8 H D) \; T/ k- A Q; w
. y/ ], }% [0 G9 htypedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus;
( `1 W% i0 |; a" i; C% X$ ?( c) P4 S
/*!< STM32F10x Standard Peripheral Library old definitions (maintained for legacy purpose) */4 P7 R) ?5 y& } f
由于新的文件与老的文件会有不兼容问题,所以要转换变量类型。 % w* {, j& F8 [( B) _
#define HSEStartUp_TimeOut HSE_STARTUP_TIMEOUT 请大家注意这里的定义,高速外设时钟的启动时间。! |7 @' ~, m3 f
#define HSE_Value HSE_VALUE. G* M7 N- Z( G$ i
#define HSI_Value HSI_VALUE, n) f1 `' X: z1 Y
/**
9 j5 u; E& d* H3 K7 g1 i: z6 k * @}
1 G d* M4 j7 A% D# o9 t+ _ */9 X8 e2 {" [9 A1 O4 l
. w& a) L" z b$ }$ O
/** @addtogroup Peripheral_registers_structures
( J! v. P, V# R$ v; d4 ^ * @{+ X, a2 [+ s) n4 G8 _
*/ 2 W5 U3 O' x3 @: h4 Q% }; w
& Q4 D. k9 W! f& y" M: Y6 j/**
& @+ B8 x- m5 a/ F# ]2 F6 o" e * @brief Analog to Digital Converter $ G. K2 {# H6 j) |* R1 z
*/0 }& m) o% \( H `0 h# `
. u" L- u; j2 h6 D# G; [5 T: Vtypedef struct ADC_TypeDef结构体的声名,看看它内部都有哪些内容。请读者注意。
; V% p2 l( ?* V. B) O8 S ADC_TypeDef,看起来是一个结构类型,是对ADC寄存器各地址的一个定义。
' e) H$ a f! Q" ?2 C& v/ J0 K# o8 V% {: N{ __IO就是volatile uint32_t就是32位无符号整形数。# {1 ^5 M$ X) }! o, M( m& E) B( K
这都是ARM公司无聊滴在CMSIS库里面定义的。STM32库1.x 2.x都没有这玩意,到了3.0以后引入了CMSIS就有了。 __IO uint32_t SR;6 J) g" t: M* q& x
__IO uint32_t CR1;
5 V3 u0 H/ a/ @( X __IO uint32_t CR2;$ k! [* A8 K V) p# e
__IO uint32_t SMPR1;
0 D3 L Q8 s. h5 @) @7 u __IO uint32_t SMPR2;" }& t1 \5 [9 N3 |
__IO uint32_t JOFR1;
0 ^# l& G8 T. v2 ` __IO uint32_t JOFR2;9 c5 w. H, S! E) t" ~
__IO uint32_t JOFR3;
S4 v+ \9 q. | __IO uint32_t JOFR4;
" S, X; m4 \4 i9 J# \ G __IO uint32_t HTR; d' V0 ]( e& R
__IO uint32_t LTR;2 v2 i$ y2 q! m J$ Z, h# t( ~
__IO uint32_t SQR1;
( l1 d0 ^# Y8 d/ O2 N8 L8 }5 v# G __IO uint32_t SQR2;! C+ V& `1 i- ?
__IO uint32_t SQR3;
, y4 t$ I, R `- X7 C, ?: ] __IO uint32_t JSQR;
5 F! ~9 p9 m8 h0 {& _) z __IO uint32_t JDR1;" C# R+ r( s' C2 T9 N" o% b% f2 c
__IO uint32_t JDR2;. i1 s! R( K1 i( P/ C h
__IO uint32_t JDR3;
0 r: Q$ x8 m, K+ g2 A7 d4 L __IO uint32_t JDR4;4 u* L# K( ~6 _, i {6 |
__IO uint32_t DR;
6 f" L9 u2 d/ o} ADC_TypeDef;% G* {3 G; ^6 a! _
8 R _1 i6 T# @$ J1 u; O$ I9 A/** * d# z- r- P' R; A7 y/ B
* @brief Backup Registers
% [' l0 a" _. Z9 F1 ?) j */
+ y# O4 M* D! f. I8 W
1 W' r% P2 n: c1 _typedef struct 这个结构体声明的是数据备份寄存器,它们是16位的。它可以管理防范入侵,可以存储RTC检验值,可以做数据备份。& R) b; @% M9 c# s
{
/ H5 V& |4 s* u* ]+ `$ L uint32_t RESERVED0;" R; o% t; f+ A+ N7 n
__IO uint16_t DR1; DR代表数据备份1—45- w& e; S) r3 k( s- T
uint16_t RESERVED1;6 i, q/ G, z( V
__IO uint16_t DR2;
1 P! K O5 K6 n' m3 L3 Y4 d! m uint16_t RESERVED2;
* y, L* j! R7 U9 N, B __IO uint16_t DR3;
' b7 z1 u V* w. s$ P0 F uint16_t RESERVED3;, o6 V! ]5 D; K3 w. z" v
__IO uint16_t DR4;& _ V' `9 }* U, c$ u
uint16_t RESERVED4;
8 P8 r( I: o1 d y1 ^ __IO uint16_t DR5;. y3 j! N! u" {
uint16_t RESERVED5;
t3 z3 ]. _+ n* i( x% M P, v __IO uint16_t DR6;
6 z( @! A" y: g$ L$ l3 ~; \/ ^' n uint16_t RESERVED6;! f: J5 ]5 t/ B6 b# j
__IO uint16_t DR7;! Z) c6 c' @/ ?, ^9 \5 y* P
uint16_t RESERVED7;
+ r$ `& i1 k% X# g __IO uint16_t DR8;
5 u9 N5 h+ D1 `5 o+ I) ] uint16_t RESERVED8;
$ j. \9 U- V: }+ R9 T __IO uint16_t DR9;
, ~1 o8 D; U5 U$ U$ k, `0 ]( B uint16_t RESERVED9;
: J- A% p y% U: N" |' {; O __IO uint16_t DR10;
3 o, h w, }. `: Z7 j3 l8 j0 v7 x( } uint16_t RESERVED10;
$ f# E, v( |- j ] __IO uint16_t RTCCR; RTC时钟校准寄存器
9 }9 D( q- G- G' d- g uint16_t RESERVED11;
* [# ]8 w n. s __IO uint16_t CR; CR备份控制寄存器
5 T; @+ d# F2 z1 {: [7 N uint16_t RESERVED12;, N+ }" C' U8 p6 B
__IO uint16_t CSR; CSR 备份控制状态寄存器 ; h, I+ S" c; P! {$ [- H
uint16_t RESERVED13[5];, `* |- C, f4 T% O; K( T
__IO uint16_t DR11;
|6 s% n9 S9 E7 v3 y3 @3 M uint16_t RESERVED14;; P% _2 S- G2 K# p
__IO uint16_t DR12;
* N. N; d. w: d" y4 f uint16_t RESERVED15;: Y/ b. g) {! Y9 w, m
__IO uint16_t DR13;# q& c: U2 \! Q7 ]
uint16_t RESERVED16;' ^, f# Z! w8 ?$ T% u- g1 ]& \
__IO uint16_t DR14;
* j: U. n* V9 n0 n2 E uint16_t RESERVED17;
1 p: a) Z& I7 X( h# @ __IO uint16_t DR15;0 b c0 } q% M e7 m) e( j" Z/ l
uint16_t RESERVED18;. r3 X; Q9 m5 c
__IO uint16_t DR16;) A0 i: g3 H* \3 v- {: }( x2 \* s
uint16_t RESERVED19;
+ @4 h$ j) v% ~2 H$ R) Y! F __IO uint16_t DR17;- o6 M& j; ^* f' b
uint16_t RESERVED20;
5 ?) c5 K. A1 N& e8 A# W6 U __IO uint16_t DR18;' A6 V4 k% O/ g. L! C! V7 `, J% W
uint16_t RESERVED21;
8 m* h- G/ @2 o- t7 F! Q# f __IO uint16_t DR19;) }) C9 r4 n, g& d# W/ d
uint16_t RESERVED22;
/ P, o. T$ Y" ~- z3 I# I; W- [1 x6 z __IO uint16_t DR20;
1 j; `7 a+ [# t% Y uint16_t RESERVED23;
- U" v* l& B) p* L8 } __IO uint16_t DR21;
4 O, z* C; X9 G3 | uint16_t RESERVED24;2 q& O( c5 h7 |8 i
__IO uint16_t DR22;* Z/ W* q/ s: ^0 o/ f
uint16_t RESERVED25;
C2 ?+ r& ~" L0 X2 K4 A __IO uint16_t DR23;. t, t4 M3 Z) e# |1 \4 b
uint16_t RESERVED26;5 f% s' `& j* s* \- r7 F5 H4 u
__IO uint16_t DR24;) s4 r7 ^9 k$ U( s3 f4 R
uint16_t RESERVED27;
! K( Q: j7 H9 h: T __IO uint16_t DR25;
* m- S7 R$ ?1 ]8 H7 K% Z uint16_t RESERVED28;
9 V, \9 v/ w$ `- D __IO uint16_t DR26;
5 u% p3 f9 Q) Z* w5 M/ \; ? uint16_t RESERVED29;
- A3 J' y7 g& d4 i. e% K __IO uint16_t DR27;
: @" R. z" X+ } uint16_t RESERVED30;
! G( Q4 m( B. C* U" y __IO uint16_t DR28;
! o& O; y$ h& Q! w* g uint16_t RESERVED31;
& C+ u, s2 ~* }9 ^: X. k) v- w+ e __IO uint16_t DR29;
^6 O9 _; z$ `" q' Y uint16_t RESERVED32;
. A' n7 H3 G' R __IO uint16_t DR30;# J$ c) j. \4 b1 S. S( o
uint16_t RESERVED33;
% l- Q' \- [; H __IO uint16_t DR31;3 A5 z: _% Z' Z n5 I0 |8 I
uint16_t RESERVED34;
! q9 b* X1 W" O __IO uint16_t DR32;$ l2 H- s* Z- Z
uint16_t RESERVED35;
- u9 B2 {8 O4 [. Y __IO uint16_t DR33;5 G: C# k& x! c9 U6 M: i8 ?( X
uint16_t RESERVED36;
5 } D2 k7 g. r; S% ]& k9 C& _/ P __IO uint16_t DR34;* i% I s* Z* g6 P0 m" H4 ~3 x" O$ v! Q
uint16_t RESERVED37;; l0 T3 |2 J4 ~+ g9 a7 w
__IO uint16_t DR35;
, @4 U/ \( P. _. N3 z: u4 N5 H7 [ uint16_t RESERVED38;5 Z* ?' B7 ?" N2 b2 v( G
__IO uint16_t DR36;9 Z7 {; F8 d2 C! d5 h5 J$ m
uint16_t RESERVED39;
* l+ {. R# V( ] __IO uint16_t DR37;
) O& ?" n% x" B/ y' y9 [7 A uint16_t RESERVED40;3 r" ^# W8 \' W- R) I& j* Y: P `* m
__IO uint16_t DR38;% k6 a- h3 t! L, _+ s, J
uint16_t RESERVED41;8 t, g( r% t5 b% R# Q# p. o
__IO uint16_t DR39;
& G% b5 ]2 ]& | uint16_t RESERVED42;
; _4 Z# d& O* p __IO uint16_t DR40;
! d/ S/ V: h) g: h5 F- p uint16_t RESERVED43;" E4 Q& B" G+ s9 n# `5 J
__IO uint16_t DR41;4 b/ h6 w" Y7 W' p* h2 }3 u
uint16_t RESERVED44;2 h) h3 f% v+ e a! y; I3 W D) B
__IO uint16_t DR42;* d* e" E$ f. S
uint16_t RESERVED45; 1 `7 ~! y4 {6 G# U, B
} BKP_TypeDef;4 G* U2 S. ~, ]9 _5 g
# p/ T- f- _9 N, ?: R2 Y2 p/**
3 b: a J" r0 m) j, T% o7 B V5 W6 f * @brief Controller Area Network TxMailBox 0 n F" {- ~# `0 A" X1 c6 N
*/
4 O* o0 d( T. \ k2 }1 s& @5 R) ~4 s
typedef struct
$ e) O0 z' [& c4 ]0 r! s, y% M% g{
3 |/ \, _* `# h6 Y' C __IO uint32_t TIR;; Q O8 [5 S5 f' k; l2 ^ t3 B
__IO uint32_t TDTR;% C2 K/ W9 m( r8 q
__IO uint32_t TDLR;# `" b5 z2 ?% d( u7 u8 w
__IO uint32_t TDHR;
k% @; ~ D: Q3 ~: P* g} CAN_TxMailBox_TypeDef; CAN的发送邮箱寄存器的结构体定义。
% T! e0 t F$ N' Y, ~
( K) H% ]& i6 z6 h/** $ |" p9 h7 D @0 ~/ C' F: x, ?
* @brief Controller Area Network FIFOMailBox
: G( T( Y; g+ q2 H$ X5 } */, ^$ W4 h9 Q# N) @
a' G2 R6 h: J' L! Ntypedef struct3 W1 W, B3 A) T/ Q3 d/ {- G
{& E6 U1 }" F1 n0 P3 G
__IO uint32_t RIR;% r3 P1 p9 U& [& D1 _2 _# j
__IO uint32_t RDTR;; e |# q5 ^0 G3 |; s \* X
__IO uint32_t RDLR;
' ~: D; m; e y4 b __IO uint32_t RDHR;
) m8 h1 L& A, O} CAN_FIFOMailBox_TypeDef; 先进先出(FIFO)缓冲器,是一种寄存器。在这个头文件里定义了它的结构体类型。1 o) ? Q/ ]8 x0 i+ _
, M0 w1 e, b) l, f3 {
/**
$ s z4 T7 y+ r) E9 j * @brief Controller Area Network FilterRegister
, x" w7 H' }, S2 n( B2 g1 V; [ */( `1 z1 b9 {8 D R4 V9 ]# ?# U
: q; v0 Y# z# ^6 a+ Utypedef struct
" o+ e9 {4 n. u# F% K{" ]+ z$ u. g4 _6 s
__IO uint32_t FR1;8 Y- d7 R; j9 r& m
__IO uint32_t FR2;3 Q4 _" i1 Y* g: ]. r9 c! u+ }
}CAN_Filter Register_TypeDef; CAN硬件过滤器工作模式、访问码和访问码掩码。通过设置CAN过滤器,可以使CAN端口只接收符合规定的的CAN数据包,这样就能将CAN总线划分成若干网段用于支持不同应用。 ) ^% b h6 z5 H) `2 J9 T
/**
1 q# I! [' h4 S& |' [ * @brief Controller Area Network
+ }0 ?) |7 I3 a4 n& R. w0 r- q- s */
* A1 Q& j8 @+ K! w2 X3 S5 r
[8 G! j+ X4 |7 Utypedef struct
+ @1 Y2 u; C9 U- `9 {' C* Z8 w{/ z8 Z5 D' n4 {* i/ x. D" }5 ?
__IO uint32_t MCR;/ m& A% q0 p0 Q+ x1 Z
__IO uint32_t MSR;
, P( {" y) L9 p' u2 v" e __IO uint32_t TSR;/ V! i. x; H* N. B) o. u
__IO uint32_t RF0R;' `' z. r; N) e. X6 N. o
__IO uint32_t RF1R;' l, F: ]& _$ g4 g+ S2 n9 I; C& L+ {
__IO uint32_t IER;
6 R8 G3 h6 t' W* r x, `. @: T __IO uint32_t ESR;
2 x! c; o1 B% b1 w' Z. O, |+ B8 p$ ~6 Z __IO uint32_t BTR;& n# V5 f% R- k* ~# g; ?
uint32_t RESERVED0[88];) E4 ?5 E+ J. y1 j" j7 l
CAN_TxMailBox_TypeDef sTxMailBox[3];2 D- {! i" F) `7 k" ?: g0 G
CAN_FIFOMailBox_TypeDef sFIFOMailBox[2];
( G8 i' [0 p1 `# ]3 V0 m& @7 ], D. b uint32_t RESERVED1[12];8 d- S4 f$ P7 `& t5 |8 x
__IO uint32_t FMR;# n' h! t5 x/ V! N1 N; A \2 J. p* D
__IO uint32_t FM1R;
$ n* w; N1 Y5 S/ k uint32_t RESERVED2;; [+ j: F# O9 m
__IO uint32_t FS1R;
3 l# ^4 g: h4 p% `- r. U uint32_t RESERVED3;
" I9 R% G7 u6 l0 \7 a& \8 S __IO uint32_t FFA1R;
" Q% c2 d( @% }" R2 E# T4 Y uint32_t RESERVED4;# M/ d# f! I2 t6 C& t: ~" ?0 ~
__IO uint32_t FA1R;: d* m* W$ y$ ^* w0 r0 L
uint32_t RESERVED5[8];7 Y$ ?1 k; Y3 w2 a
#ifndef STM32F10X_CL4 [6 k$ D- A: y, ^ t- N% s
CAN_FilterRegister_TypeDef sFilterRegister[14];
% k' x9 y7 j0 `% v#else- b+ G1 g, s0 G" z
CAN_FilterRegister_TypeDef sFilterRegister[28];9 W+ o! u8 ?. S$ T9 w
#endif /* STM32F10X_CL */
. f5 H! g# q$ @* O3 g' B! h4 s. B} CAN_TypeDef;
5 z6 \ u+ Z+ Y u% h$ N* E! T) d
5 `4 c+ V9 Q7 D- N- b' c/**
+ C( }+ H3 x* F * @brief Consumer Electronics Control (CEC)1 z: \, u) Z4 d2 o8 s. y
*/4 F$ o" b* \) u5 i( Q: J! U( y% p
typedef struct
1 a, `) u; G& F3 x! M8 S3 u{1 J7 M7 L/ X( s6 E% Q e
__IO uint32_t CFGR;# M% j+ i! U' N! I" B0 A
__IO uint32_t OAR;
2 a0 ?: Z' c5 `' ~+ d# f# Y8 f __IO uint32_t PRES;
' |/ F* [2 N# H5 B __IO uint32_t ESR;
5 F* l" Y" i4 F. v% N __IO uint32_t CSR;3 D( i4 b6 D: W) P/ W7 ?
__IO uint32_t TXD;4 h3 A' _% V" ?( z/ {0 w
__IO uint32_t RXD; 9 a' e! f; N4 c. g) W- D8 b
} CEC_TypeDef; CEC用于记录CAN总线发送数据错误的计数器
b4 ]1 _0 L: T1 w0 R% C* N5 L2 L$ H# w- V2 T6 V
/**
' v* l8 a) ~5 z7 R% M * @brief CRC calculation unit ) v1 h7 u4 W( G% j: j9 j
*/) Z1 A" p! D# n- M$ `6 F$ N: B
" u h* G3 U" w+ F# I$ gtypedef struct+ ?& j: `) Q: b, v8 i Z* D
{
; q3 {6 r0 y0 x J8 c __IO uint32_t DR;
8 b- W( t, ?. [' C3 u9 r y+ W3 y __IO uint8_t IDR;$ c. ` a. W0 c1 |! h
uint8_t RESERVED0;
0 U9 O; T! f/ x4 M0 i( v uint16_t RESERVED1;
* @7 `" C n5 j9 b __IO uint32_t CR;
- ?- J U/ d2 w" I} CRC_TypeDe CRC校验9 r0 X9 C1 e' k I! T- |- ^$ o
1 P+ x$ B2 O& I! }0 }' }$ \* ?
/** 9 d: v# N3 `1 ~! b
* @brief Digital to Analog Converter 数模转换相应的结构体,DAC相关寄存器啊
& u# a' ~$ t+ W+ D0 x" N4 s8 E */; p# p* C" t) c+ }* l$ H- I8 @
" I* v. t5 D; \9 M- B5 q* Stypedef struct
' Q+ z% k S% \' F3 ~{
/ }4 W, b$ W6 r5 @. @2 E __IO uint32_t CR;9 H) u$ m# e: O* g
__IO uint32_t SWTRIGR; SWTRIGR 这个DAC软件触发寄存器 ^0 m& i5 F' O
__IO uint32_t DHR12R1; DAC 通道 1 的 12 位右对 齐数据保持寄存器:DAC_DHR12R1。这个我只讲一个,这里面全部是关于DAC转换的相关寄存器。请大家自行对照硬件手册查找。& U0 I+ {& v k7 d* U# h
__IO uint32_t DHR12L1;
2 `1 ~1 X' U) @+ @$ L, V' ^4 m __IO uint32_t DHR8R1;& t8 J1 P. y9 a# a& F- [
__IO uint32_t DHR12R2;# H' o# _7 M# _6 O2 h, h
__IO uint32_t DHR12L2;
$ Y p: S, I" b6 Q __IO uint32_t DHR8R2;
% `. f. w8 S! [- O __IO uint32_t DHR12RD;. X$ ^1 Y8 R7 u
__IO uint32_t DHR12LD;
: E2 v$ Q. P2 s5 P9 X% D __IO uint32_t DHR8RD;
* l- i5 s2 n/ w, E* j __IO uint32_t DOR1;+ `; t: F. @& c
__IO uint32_t DOR2;9 J& Y+ `2 B. B/ A
#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL)) W! D: w7 A$ {3 V
__IO uint32_t SR;, o, L: V- p( ]
#endif* d9 |2 V0 e" o ~0 x
} DAC_TypeDef;
$ ^( |8 }% D3 I- C5 O. \, B' o: }# {9 L6 g3 q9 g' X
4 \# o& I" t; U. e5 H1 D1 l
————————————————————————————- ————————————————————————————-
0 n1 @3 s+ z, T5 z/** + s) _9 Z; u! h5 u
* @brief DMA Controller DMA 传输将数据从一个地址空间复制到另外一个地址空间。当CPU 初始化这个传输动作,传输动作本身是由 DMA 控制器来实行和完成。典型的例子就是移动一个外部内存的区块到芯片内部更快的内存区。像是这样的操作并没有让 处理器工作拖延,反而可以被重新排程去处理其他的工作。DMA 传输对于高效能 嵌入式系统算法和网络是很重要的。 6 f! b6 |' L8 \$ ^
DMA 在实现DMA传输时,是由DMA控制器直接掌管总线,因此,存在着一个总线控制权转移问题。即DMA传输前,CPU要把总线控制权交给DMA控制器,而在结束DMA传输后,DMA控制器应立即把总线控制权再交回给CPU。一个完整的DMA传输过程必须经过DMA请求、DMA响应、DMA传输、DMA结束4个步骤。 */ 1 W" x: o3 d9 s! b0 h
6 B: S% h, T$ l$ C' S
typedef struct 这里就是直接内存寻址寄存器相关定义,我想DMA大家应该不是太陌生。
! l0 c2 }0 Y) [# Y{
7 H7 P; J4 Y, z __IO uint32_t CCR;
2 G( M' Y M! J8 ^7 N __IO uint32_t CNDTR; ' S, _2 W- Y5 S. ^3 N0 J& a; Q/ }
__IO uint32_t CPAR; 7 J& v/ r1 s( Z8 n4 u$ ]) D
__IO uint32_t CMAR; " u& J% C* ?) I
} DMA_Channel_TypeDef;
3 R3 X t! F- q2 c/ u9 Y
( F0 t9 Q" P. c' d# @9 q8 qtypedef struct ' |9 F1 N0 N+ e- k$ u/ Z
{
* P8 M4 h! h/ E# W v4 J __IO uint32_t ISR; : ^1 X3 R* s+ w% u3 d
__IO uint32_t IFCR;
2 Y: C r! I% k: H} DMA_TypeDef;
7 r0 A* P" J8 C: s8 O: @" T' v; M+ k* h. r
/** 3 E! s0 L5 q6 C
* @brief Ethernet MAC
4 w$ \4 z7 s- Z( v. r" m$ H. w9 j */ MAC(Medium Access Control)模块,实现符合 IEEE 802.3 标准的 MAC 逻辑。 这个结构体是网络模块的相关定义。 7 ~: G. w$ @! j4 w
* w4 l+ x8 b2 \: i7 ]* X; w4 {$ u
typedef struct 6 ?4 @2 }, k# C: D
{ 8 ^* G! a7 |8 W9 w8 }( A9 P* C
__IO uint32_t MACCR; - X& _4 c, | t' {- s0 d% ?% Y
__IO uint32_t MACFFR; ( k6 L# D2 z8 s$ z% m b$ B
__IO uint32_t MACHTHR;
3 m; y5 Q' `! {3 \ __IO uint32_t MACHTLR; $ |7 g- e- V) Q8 t( @( \
__IO uint32_t MACMIIAR;
, v1 F4 p U( T0 E9 U __IO uint32_t MACMIIDR;
. E& Z/ o' \0 _7 p3 S __IO uint32_t MACFCR;
+ B' _. ?. s$ o, s* w __IO uint32_t MACVLANTR; /* 8 */ : s* J9 z7 T. ?. p1 Z7 i7 ]( ?
uint32_t RESERVED0[2];
! t) w. y* p$ w3 n* m+ P$ s __IO uint32_t MACRWUFFR; /* 11 */ d2 E' {1 b4 Q; j
__IO uint32_t MACPMTCSR; 2 I! p7 E4 f( w3 v& H
uint32_t RESERVED1[2];
0 j: @ Q) b3 l0 l4 `# Y* } __IO uint32_t MACSR; /* 15 */
+ T: U4 N j5 Y' \( j q4 Q __IO uint32_t MACIMR; 3 F3 q6 g! x- T
__IO uint32_t MACA0HR;
* S1 _% m! |& Y# g% J __IO uint32_t MACA0LR;
; s% Y/ i0 \: c __IO uint32_t MACA1HR;
0 Z# F$ Q6 l6 j" b# \ __IO uint32_t MACA1LR; % `- Y* M2 ]0 [* w
__IO uint32_t MACA2HR;
# y) {+ w K0 G; k5 Q* V __IO uint32_t MACA2LR;
6 [+ i e0 i( C- Y2 N0 V __IO uint32_t MACA3HR; % a( A6 A6 H( W
__IO uint32_t MACA3LR; /* 24 */
' `' w" L! W: k V$ c# R3 W uint32_t RESERVED2[40];
& G( ~8 M0 h- e2 G- Q6 c __IO uint32_t MMCCR; /* 65 */ # z W0 c8 z& K Y
__IO uint32_t MMCRIR;
, \) e" b1 T8 [ R% G3 f __IO uint32_t MMCTIR; 3 p5 o& z+ F& M8 x
__IO uint32_t MMCRIMR; ) e, K1 r% x# c* e" r+ L! w# m
__IO uint32_t MMCTIMR; /* 69 */
8 d }: X* w, u3 n' k uint32_t RESERVED3[14]; ) {& E: c( Y5 t0 I4 G
__IO uint32_t MMCTGFSCCR; /* 84 */
2 q3 ~9 @! j! D* X __IO uint32_t MMCTGFMSCCR; % F! _% a- ]" g$ O
uint32_t RESERVED4[5];
6 I3 b/ W- d1 Y" E( E __IO uint32_t MMCTGFCR;
8 z1 B6 \. X* n/ l( f uint32_t RESERVED5[10]; v$ g/ p: S" ?; w/ R( c2 |$ K
__IO uint32_t MMCRFCECR;
6 H7 r% b5 z$ i% i A( v __IO uint32_t MMCRFAECR; 4 D, W0 i! t! A! {3 ~- q. X
uint32_t RESERVED6[10]; 1 A' M+ z" X: K. [4 w5 G
__IO uint32_t MMCRGUFCR; & I4 I2 I) j n' ?$ I. s
uint32_t RESERVED7[334];
# @7 ?9 E( }+ N* C9 a1 h5 @' U0 o __IO uint32_t PTPTSCR;
3 z2 D* G1 @: b& b+ c, f& e! A/ R __IO uint32_t PTPSSIR;
! K8 c+ B; U. Y __IO uint32_t PTPTSHR; _0 E$ y# f- K$ Q) _
__IO uint32_t PTPTSLR; 3 l7 y/ O. K }8 ~
__IO uint32_t PTPTSHUR; 8 E- M( Z4 b) o) d3 P+ q
__IO uint32_t PTPTSLUR;
8 s! g, S( M# X; f __IO uint32_t PTPTSAR;
+ H2 H( O, v5 ]$ b; W$ \( C9 q' n/ W __IO uint32_t PTPTTHR;
8 A; B& D2 d4 D& P) l1 k! l __IO uint32_t PTPTTLR;
6 Z: E# r+ q5 U# Y2 H uint32_t RESERVED8[567];
/ v; |$ X; M' W$ F' y, y __IO uint32_t DMABMR;
) v# V. X# H3 s+ o __IO uint32_t DMATPDR; - R' {. T" M4 W' p' R
__IO uint32_t DMARPDR;
8 @$ O$ L" I6 P3 _! i, W9 b5 ~& a. L9 p __IO uint32_t DMARDLAR; ; ` @5 U; [0 _- i
__IO uint32_t DMATDLAR; 6 j4 {6 {/ Y" l- d. l
__IO uint32_t DMASR;
* K S. P& f2 ~; y __IO uint32_t DMAOMR; , K6 S3 b5 q( S/ \1 F: q
__IO uint32_t DMAIER;
) j: x& Q7 f7 @- x! ]& n __IO uint32_t DMAMFBOCR; ) @, \/ n) [& ^; ]% h0 q$ P' x
uint32_t RESERVED9[9];
( j. {& `! D& m% i9 x __IO uint32_t DMACHTDR;
8 p* u& g; x* Q8 h; D, P __IO uint32_t DMACHRDR; , u. B6 } ]: ^- ~* @
__IO uint32_t DMACHTBAR; & R# D8 o2 F8 i- z, v% _5 B! ^
__IO uint32_t DMACHRBAR; % T% z* [, g2 K8 f# h
} ETH_TypeDef;
Q6 d# Q% L3 S. E, b! r- k
[ }. N! W( j/**
: H3 g3 I. T8 J" W& Q) P# E3 W1 P * @brief External Interrupt/Event Controller & C9 v1 Z/ A; y/ T/ i3 u: r
*/ EXTI寄存器结构
' s5 @6 u% B* }7 @! d$ |EXTI 寄存器结构,EXTI_TypeDef,在文件stm2f10x_map.h中定义如下: typedef struct { vu32 IMR; vu32 EMR; vu32 RTSR; vu32 FTSR; vu32 SWIER; vu32 PR; }EXTI_TypeDef; Table 128. 例举了EXTI 所有寄存器 Table 128. EXTI寄存器 寄存器 描述 IMR 中断屏蔽寄存器 EMR 事件屏蔽寄存器 RTSR 上升沿触发选择寄存器 FTSR 下降沿触发选择寄存器 SWIR 软件中断事件寄存器 PR 挂起寄存器
' G. v$ p0 @! ` `7 M9 t. \8 ktypedef struct
" ^$ u6 D: F+ l$ q' ^{ ! I5 S5 _9 ~% L- W: H# M2 d
__IO uint32_t IMR;% `( _9 O" e* }) h
__IO uint32_t EMR;9 O% F! {5 H0 O- H4 V
__IO uint32_t RTSR;( \ t5 U& ] {
__IO uint32_t FTSR;3 H& _7 O6 x h: P
__IO uint32_t SWIER;
8 O) d' q/ n5 W$ K! n: e j6 v' G __IO uint32_t PR;
4 i O+ X# |3 F6 Z- L m& X} EXTI_TypeDef;. q: G8 P" x. T- q
! A( `, M; W% }" F5 r, V; B! v
/**
# s" S( z. B5 ^0 L1 B, q * @brief FLASH Registers9 w" |7 V o# D5 a( ~
*/ FLASH寄存器 寄存器 描述 ACR FLASH访问控制寄存器 KEYR FPEC密钥寄存器 OPTKEYR 选择字节密钥寄存器 SR FLASH状态寄存器 CR FLASH控制寄存器 AR FLASH地址寄存器 OBR 选择字节和状态寄存器 WRPR 选择字节写保护寄存器 typedef struct& E$ d4 T/ F* c3 t* f! P% [$ Z
{
! j; x4 ?7 x4 Q* f: r __IO uint32_t ACR;
8 |* x9 Z, T. E0 ~5 E; q+ Y' Y __IO uint32_t KEYR;4 B1 t3 @: U5 W \
__IO uint32_t OPTKEYR;. B7 E/ M7 g7 N" V/ [, f4 f4 T
__IO uint32_t SR;! \- j! F- g' d9 x9 Z1 w, ~: n' I' {
__IO uint32_t CR;
+ `* ^. Z' k% @. \ __IO uint32_t AR;+ q: h- P; t6 F& U
__IO uint32_t RESERVED;
) a7 P& `; {$ P/ |2 t( B __IO uint32_t OBR;
8 j4 O% [7 v8 H9 Q __IO uint32_t WRPR;* X. `' @9 z. N4 }1 G8 T% X4 \
#ifdef STM32F10X_XL
. C# ^7 ^, [3 s' g uint32_t RESERVED1[8];
* A- b+ d- n5 E/ ]% Q8 N __IO uint32_t KEYR2;
2 }# f0 |$ S1 j' r# Z uint32_t RESERVED2; 9 z# T v) E9 z
__IO uint32_t SR2;) P" J/ P$ B! k) f* E
__IO uint32_t CR2;
9 v- ]7 q4 @0 z3 O$ Q5 L __IO uint32_t AR2;
6 W' y$ N% H! T4 w6 M#endif /* STM32F10X_XL */ ! P1 ?) ]; J, G' p% j
} FLASH_TypeDef;& \7 X% ]3 h7 g! I& S
4 j4 D+ o! h0 e, r( \————————————————————————————4 m+ H3 x4 k. W/ j1 J* ?& v
———————————————————————————— //本程序只供学习使用,如果用于工程应用,请仔细检查! a+ q& ` g, q# N! m
//主要对于ST公司的库存文件stm32f10x.h进行解析; c" r$ G7 m- U) T" E
//修改日期:2014/6
6 H0 {0 x$ f% e+ Y//Copyright(C) 2014-2025# L6 i( g8 M B
//All rights reserved. X# `% [9 j4 i- [" r
//******************************************************************************** */9 A5 R+ l/ A+ K7 v+ O* {2 `* a4 e4 q
/ y' _5 g5 S, @" n
/** : l7 Q1 ]/ ?' D& E0 f1 b- K
* @brief Option Bytes Registers! z: B8 b5 \5 \" T% H; n
*/选项字节寄存器
+ t5 R; X6 G9 J4 e, a! x2 \- a( J6 W s) l. h' s
typedef struct
3 R0 G7 W: J0 u4 v) g( A' E{
% v, L+ ]+ a$ w' h* e% U. p2 t9 T __IO uint16_t RDP;RDP 为 读出选项字节 ,USER 为 用户选项字节 , Data0 为 数据 0 选项字节,Data1 为 数据 1 选项字节,WRP0 为 写保护 0的先项字节。依此类推
2 [" \) N/ ]! o! f: t1 Y, S% y __IO uint16_t USER;" i3 c- }; O- t0 k9 R
__IO uint16_t Data0;; r V0 ~* l. O. o
__IO uint16_t Data1;
+ w+ v; P) S/ K2 ?1 W __IO uint16_t WRP0;
$ \4 t5 L+ n* ^6 O+ F2 k$ y q __IO uint16_t WRP1;
- K3 w6 n- U2 V O __IO uint16_t WRP2;' B% Y. T) Y+ z/ ~
__IO uint16_t WRP3;
9 i( E- ^1 f- {9 c- w; y} OB_TypeDef;
) W8 [7 z% \8 i h# z
0 _; P# x! `* u4 k* ^/**
' ~: x# ?- \" n! ] * @brief Flexible Static Memory Controller
7 s9 Z- X; i/ Y5 u. {: y */灵活的静态存储器控制器
1 s, R$ {: B( m' [FSMC(Flexible Static Memory Controller,可变静态存储控制器)是STM32系列采用一种新型的存储器扩展技术。在外部存储器扩展方面具有独特的优势,可根据系统的应用需要,方便地进行不同类型大容量静态存储器的扩展。
; L8 a" ]3 l7 L8 g
% Z: T- \" e8 ~2 t" Q( w1 aFSMC技术优势①支持多种静态存储器类型。STM32通过FSMC可以与SRAM、ROM、PSRAM、NOR Flash和NANDFlash存储器的引脚直接相连。& v4 V$ x3 z3 j; v! c
②支持丰富的存储操作方法。FSMC不仅支持多种数据宽度的异步读/写操作,而且支持对NOR/PSRAM/NAND存储器的同步突发访问方式。+ j7 i( o; q- B5 ^7 z
③支持同时扩展多种存储器。FSMC的映射地址空间中,不同的BANK是独立的,可用于扩展不同类型的存储器。当系统中扩展和使用多个外部存储器时,FSMC会通过总线悬空延迟时间参数的设置,防止各存储器对总线的访问冲突。
8 a: f6 W, O! _2 G④支持更为广泛的存储器型号。通过对FSMC的时间参数设置,扩大了系统中可用存储器的速度范围,为用户提供了灵活的存储芯片选择空间。9 g \$ E5 w6 ^0 N! M
⑤支持代码从FSMC扩展的外部存储器中直接运行,而不需要首先调入内部SRAM。
/ Y8 R# J. Z7 f2 J: z$ a
* c. `# L& a9 P1 B# t% M
% K7 T1 H8 ` L' B$ T2 g
5 J* e% d' _1 ^! b! T9 @( dtypedef struct0 }( @2 m/ R/ t. N
{5 b1 N4 X& C* j/ }5 N$ s& N
__IO uint32_t BTCR[8];
2 Q. A0 l: o9 D} FSMC_Bank1_TypeDef;
3 T8 O2 b2 |! K# Z' U3 m t g" J2 [9 V
/**
- p7 t+ y, h. x * @brief Flexible Static Memory Controller Bank1E' i+ t* O% {" _" ^
*/
# R0 i$ B; z# c6 SFSMC映射地址空间FSMC管理1 GB的映射地址空间。该空间划分为4个大小为256 MB的BANK,每个BANK又划分为4个64 MB的子BANK,如表1所列。FSMC的2个控制器管理的映射地址空间不同。NOR Flash控制器管理第1个BANK,NAND/PC Card控制器管理第2~4个BANK。由于两个控制器管理的存储器类型不同,扩展时应根据选用的存储设备类型确定其映射位置。其中,BANK1的4个子BANK拥有独立的片选线和控制寄存器,可分别扩展一个独立的存储设备,而BANK2~BANK4只有一组控制寄存器。
, A$ g; k8 e4 ]0 f4 h7 wtypedef struct
+ d! i! o( i2 t" W% h c+ ^{4 X4 c% S3 w7 C' ^- p8 h+ B
__IO uint32_t BWTR[7];
+ E/ G% }, A: [' W9 u} FSMC_Bank1E_TypeDef;那么这里就是FSMC的BANK1的结构体定义& ~7 I \! F$ N# H# \
2 V K* E# ]8 G5 y v
/**
8 U# L0 h+ ]' R! r' m! Q6 h * @brief Flexible Static Memory Controller Bank2+ }8 i) A" @! L- P$ K+ d1 o% P. B
*/
9 q& m& D1 @$ J: {/ U6 _+ ~& [3 P. V# d: }/ k
typedef struct
0 d0 S% P6 y9 v- x/ F{- ^) r- P6 N( w) \9 L: u w9 u
__IO uint32_t PCR2;* f* F- |6 U$ k' s3 {
__IO uint32_t SR2;
( W0 t: e O7 n, `2 d3 c __IO uint32_t PMEM2;& K7 T+ z/ w" _6 `
__IO uint32_t PATT2;
- n8 X* h) R5 R5 S uint32_t RESERVED0; & o9 J" t0 u4 ]
__IO uint32_t ECCR2;
% @% @# \7 `' }} FSMC_Bank2_TypeDef; , Y1 ~& u% D6 u# i m* b
" @6 J0 f5 H; M; A
/**
; \ c5 \* i, x) g9 b4 r" @: z * @brief Flexible Static Memory Controller Bank31 u5 ]. c, k2 ~/ X" {5 y, }
*/$ G- U- n& A( s, V O# V M' ?4 Q
( H! F1 P2 K, m0 ]( J% a8 F
typedef struct( B4 l' f, e E. I
{1 s. Z' x j- _# c
__IO uint32_t PCR3;; m" J' ?8 g9 C( i4 v' Y
__IO uint32_t SR3;7 h$ T& _, X/ V. M# i& o
__IO uint32_t PMEM3;
a5 e# |# Y* B# i: P, _2 z( [ __IO uint32_t PATT3;
' H- d; u! @+ ?- W uint32_t RESERVED0; * }( R$ O# A; o7 t+ W$ k
__IO uint32_t ECCR3;
. h* a0 l% C! d) H% v0 t0 p4 N} FSMC_Bank3_TypeDef;
0 T5 x) e: U& ]
# g% ?* m% [; g) Y5 {0 \/**
4 L- Q2 ^& F, }% P# K * @brief Flexible Static Memory Controller Bank4
& v7 q$ M( i: u1 S1 I6 b" m */
8 m# @, {, Q! ^' B, K# I. J3 a1 x, }' X
# z6 c6 {2 m0 q6 j) e* C
————————————————————————————————————————————————————— —————————————————————————————————————————————————————- 9 h/ Q1 S3 ^7 G( s, A7 u
typedef struct ( R* E/ ~7 |2 r: }9 s0 z
{ 1 }6 R) E2 ]9 M- r% A( m) |
__IO uint32_t PCR4; ; E$ d8 p. K+ b2 F
__IO uint32_t SR4; " g0 D. O* M! e g% R, R
__IO uint32_t PMEM4; ) _( P; ^6 K3 B( Q3 ?
__IO uint32_t PATT4;
8 n* ~3 s" O/ N* R- i __IO uint32_t PIO4;
9 ~* ~3 v* U. @9 k} FSMC_Bank4_TypeDef; 0 I1 n$ O9 X! J" U) ~; C: A% {
! d n0 e/ F Q; O+ ]' |) Q
/**
+ `) c3 }) A2 E4 L/ Y * @brief General Purpose I/O 2 K# z! n) \/ @5 j5 H/ d
*/
/ t* v! G" C) N4 C2 |
8 ?8 N4 B2 B% k. X8 C& R: T# B& vtypedef struct
P' N: c: C' B% F- { K{
5 d0 B( j1 r; v3 @8 k1 p __IO uint32_t CRL; 6 B# X+ w6 q( ?3 A c$ a
__IO uint32_t CRH; 8 u; D9 r* [. |( G) [: s: u
__IO uint32_t IDR; 9 S9 e- u/ ^. l
__IO uint32_t ODR;
% t) J8 A+ }* O6 V! O/ ? __IO uint32_t BSRR; + Y. ?5 G5 F; M% x+ R' z7 }4 }* G
__IO uint32_t BRR;
5 b, R) D7 _, A. b% v __IO uint32_t LCKR;
% v: L( G; f' ]' Y& F/ W2 y} GPIO_TypeDef; CRL、 CRH、IDR、ODR等都是一个端口中的 寄存器,对寄存器的读写操作实现你需要的功能。STM32 的每个 IO 端口都有 7 个寄存器来控制。他们分别是:配置模式的 2 个 32 位的端口 配置寄存器 CRL 和 CRH;2 个 32 位的数据寄存器 IDR 和 ODR;1 个 32 位的置位/复位寄存器 BSRR;一个 16 位的复位寄存器 BRR; 1 个 32 位的锁存寄存器 LCKR ! H* t# e9 M0 m- J
GPIO_Pin 该参数选择待设置的GPIO管脚,使用操作符“|”可以一次选中多个管脚。可以使用下表中的任意组合。 GPIO_Pin_None:无管脚被选中 GPIO_Pin_x:选中管脚x(0–15) GPIO_Pin_All:选中全部管脚
# [, p7 t2 [8 G6 e: Y7 O! UGPIO_Speed GPIO_Speed:用以设置选中管脚的速率。 GPIO_Speed_10MHz:最高输出速率10MHz GPIO_Speed_2MHz:最高输出速率2MHz GPIO_Speed_50MHz:最高输出速率50MHz 4 W" {( M. U0 y ?$ t4 e
GPIO_Mode GPIO_Mode:用以设置选中管脚的工作状态。 GPIO_Mode_AIN:模拟输入 GPIO_Mode_IN_FLOATING:浮空输入 GPIO_Mode_IPD:下拉输入 GPIO_Mode_IPU:上拉输入 GPIO_Mode_Out_OD:开漏输出 GPIO_Mode_Out_PP:推挽输出 GPIO_Mode_AF_OD:复用开漏输出 GPIO_Mode_AF_PP:复用推挽输出 & `, _- I$ {# l+ v
函数GPIO_StructInit 功能描述:把GPIO_InitStruct中的每一个参数按缺省值填入 例: GPIO_InitTypeDef GPIO_InitStructure; GPIO_StructInit(&GPIO_InitStructure); GPIO_InitStruct: GPIO_Pin:GPIO_Pin_All GPIO_Speed:GPIO_Speed_2MHz GPIO_Mode:GPIO_Mode_IN_FLOATING
X( P; k# w% A3 K) H/ p函数GPIO_ReadInputDataBit 功能描述:读取指定端口管脚的输入 例: u8 ReadValue; ReadValue = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7);
1 X! b0 P9 g: R. p函数GPIO_ReadInputData 功能描述:读取指定的GPIO端口输入 例: u16 ReadValue; ReadValue = GPIO_ReadInputData(GPIOC);
. R0 s6 A" F0 C5 \/ q/ @' s7 q7 V# O+ `
函数GPIO_ReadOutputDataBit 功能描述:读取指定端口管脚的输出 例: u8 ReadValue; ReadValue = GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_7);
2 @7 H* {8 ~2 ?9 h6 w. Z
: J9 Z7 _# C, Y函数GPIO_ReadOutputData 功能描述:读取指定的GPIO端口输出 例: u16 ReadValue; ReadValue = GPIO_ReadOutputData(GPIOC); 3 C' a; |3 N8 k; I5 H; }' S. k
函数GPIO_SetBits 功能描述:置位指定的数据端口位 例: GPIO_SetBits(GPIOA, GPIO_Pin_10 | GPIO_Pin_15);
9 I9 Q. ]& ]5 P! o5 T) M" K, Q9 q4 e3 Y. u
函数GPIO_ResetBits 功能描述:清除指定的数据端口位 例: GPIO_ResetBits(GPIOA, GPIO_Pin_10 | GPIO_Pin_15); # Y; C; v8 `. g/ n3 F/ {; q" H, U
- I5 r) r1 `" R, T% Y
函数GPIO_WriteBit 功能描述:设置或者清除指定的数据端口位 例: GPIO_WriteBit(GPIOA, GPIO_Pin_15, Bit_SET);
( Q4 B a/ K3 H+ c& y
, l: J: G( t) @! U
2 a: q1 t! K( {( r! a5 w函数GPIO_Write 功能描述:向指定GPIO数据端口写入数据 例: GPIO_Write(GPIOA, 0x1101);
$ \/ C% `5 `. m, c$ x/ V; p$ {" [2 N
函数GPIO_PinLockConfig 功能描述:锁定GPIO管脚设置寄存器 例: GPIO_PinLockConfig(GPIOA, GPIO_Pin_0 | GPIO_Pin_1); 2 j$ }3 |% L3 ]7 S. U1 u
& D, l+ @* E% Y; p0 x4 A# J9 |" V3 S
函数GPIO_EventOutputConfig 功能描述:选择GPIO管脚用作事件输出 例: GPIO_EventOutputConfig(GPIO_PortSourceGPIOE, GPIO_PinSource5); ) U9 d- c# J& J+ {' {
GPIO_PortSource GPIO_PortSource用以选择用作事件输出的GPIO端口。
/ y! O$ u; S" v0 r5 ZGPIO_PinSource GPIO_PinSource用以选择用作事件输出的GPIO管脚。 " I* j' N2 G$ e* m* ^: T
8 d, n8 S; I; V2 A4 Q
函数GPIO_EventOutputCmd 功能描述:使能或者失能事件输出 % U9 T E5 T& U; U
例: GPIO_EventOutputConfig(GPIO_PortSourceGPIOC, GPIO_PinSource6); GPIO_EventOutputCmd(ENABLE); 7 `; Y4 O# N: N q4 t
z4 }. z+ P o; F8 l6 k
函数GPIO_PinRemapConfig 功能描述:改变指定管脚的映射 例: GPIO_PinRemapConfig(GPIO_Remap_I2C1, ENABLE); * p0 R d( b: k; z% L4 q$ v
& @1 \# p/ U" v7 C1 U) q% M' FGPIO_Remap GPIO_Remap用以选择用作事件输出的GPIO端口。 GPIO_Remap_SPI1:SPI1复用功能映射 GPIO_Remap_I2C1:I2C1复用功能映射 GPIO_Remap_USART1:USART1复用功能映射 GPIO_PartialRemap_USART3:USART2复用功能映射 GPIO_FullRemap_USART3:USART3复用功能完全映射 GPIO_PartialRemap_TIM1:USART3复用功能部分映射 GPIO_FullRemap_TIM1:TIM1复用功能完全映射 GPIO_PartialRemap1_TIM2:TIM2复用功能部分映射1 GPIO_PartialRemap2_TIM2:TIM2复用功能部分映射2 GPIO_FullRemap_TIM2:TIM2复用功能完全映射 GPIO_PartialRemap_TIM3:TIM3复用功能部分映射 GPIO_FullRemap_TIM3:TIM3复用功能完全映射 GPIO_Remap_TIM4:TIM4复用功能映射 GPIO_Remap1_CAN:CAN复用功能映射1 GPIO_Remap2_CAN:CAN复用功能映射2 GPIO_Remap_PD01:PD01复用功能映射 GPIO_Remap_SWJ_NoJTRST:除JTRST外SWJ完全使能(JTAG+SW-DP) GPIO_Remap_SWJ_JTAGDisable:JTAG-DP失能 + SW-DP使能 GPIO_Remap_SWJ_Disable:SWJ完全失能(JTAG+SW-DP) ) A1 o. s9 B0 c6 M7 l9 k' k) y) u0 K5 N
) c3 e1 J9 _% n: V% X3 G; {函数GPIO_EXTILineConfig 功能描述:选择GPIO管脚用作外部中断线路 例: GPIO_EXTILineConfig(GPIO_PortSource_GPIOB, GPIO_PinSource8); /** ; ~5 N* p" j3 l/ q$ y/ T
* @brief Alternate Function I/O
o! M2 u( r* Y- ~ */
" E2 z5 m! P. o* v' N: m. O" q' X' _9 P
typedef struct
- z9 v9 k9 p7 y3 r{
: f$ B4 ^6 p( m+ T5 | __IO uint32_t EVCR; ) V0 S+ g' L" I% ^2 s7 y `
__IO uint32_t MAPR;
- e- K# P( ?% W- @" { __IO uint32_t EXTICR[4]; ; G$ \- G4 H4 ~/ D: H8 D' U
uint32_t RESERVED0;
/ T+ |2 f; R0 N$ ^9 b5 ~+ @ __IO uint32_t MAPR2; - C3 I) K0 R2 y/ }. j9 z
} AFIO_TypeDef; 复用功能寄存器结构,也就是说这里可以把IO做复用。
1 @- s8 E8 |" B9 Q5 j' r0 k/** 1 Q; O& g4 w/ g7 t7 R& i! p2 m# `! m
* @brief Inter Integrated Circuit Interface
7 F+ Q0 i6 Q h- g- h */ 6 J X- u8 p. ]0 z1 p8 v4 V
, ?3 @, O: @7 c1 s; g. j7 ~
typedef struct I2C 结构体类型,这里面的全部是数据寄存器。 : D6 P: M% j* V" F: M
{ ' S6 R& q0 B6 G8 [9 \! V( K; i
__IO uint16_t CR1; 1 l3 ?6 }% v9 Z7 N( j1 ?" L, E
uint16_t RESERVED0;
& J8 a$ \: K' y8 E __IO uint16_t CR2; + \0 |2 {0 ^, [, {: C$ E! G( n
uint16_t RESERVED 1; 8 A; i% l' G( p7 g
__IO uint16_t OAR1; * \9 |( L1 P+ C5 ~, h7 [
uint16_t RESERVED2;
" F% Q9 f m7 [; ] __IO uint16_t OAR2;
9 }$ H2 ~' [7 S; |3 @' l, k uint16_t RESERVED3; 6 ^# ~$ e+ } Y3 q3 Y! C" S. A
__IO uint16_t DR;
) W7 V# N5 l9 ?+ ^) V6 ` uint16_t RESERVED4;
1 m4 J; V) b! `0 p; R0 F, ?! X# g __IO uint16_t SR1; - d, c/ Z3 H9 |% Y q' ^
uint16_t RESERVED5;
6 x1 ~/ T2 P% O __IO uint16_t SR2; + `/ b, C/ O# x) e+ b2 O7 [
uint16_t RESERVED6;
! x( h* X3 E N4 i w: Z __IO uint16_t CCR;
5 s& T0 V# ^9 Y$ n9 ~9 r5 F ^ uint16_t RESERVED7; " D; ] D$ H f
__IO uint16_t TRISE;
5 u" A: G( \- }# x uint16_t RESERVED8;
5 J* X+ c1 }. N6 c- w} I2C_TypeDef;
2 p' A# v% R/ v T
, @7 c% Z7 [$ H2 I4 G/** 5 V) `: m% W1 D( A# S: T; N: h
* @brief Independent WATCHDOG
2 W7 m5 c* [ v4 @8 P$ G% \! @7 F */
, m$ h/ Y4 X: l6 {( v在键值寄存器(IWDG_KR)中写入 0xCCCC,开始启用独立看门狗;此时计数器开始从其复 位值 0xFFF 递减计数。当计数器计数到末尾 0x000 时,会产生一个复位信号(IWDG_RESET)。 无论何时,只要键寄存器 IWDG_KR 中被写入 0xAAAA, IWDG_RLR 中的值就会被重新加载 到计数器中从而避免产生看门狗复位 。 IWDG_PR 和 IWDG_RLR 寄存器具有写保护功能。要修改这两个寄存器的值,必须先向 IWDG_KR 寄存器中写入 0x5555。将其他值写入这个寄存器将会打乱操作顺序,寄存器将重新 被保护。重装载操作(即写入 0xAAAA)也会启动写保护功能。 还有两个寄存器,一个预分频寄存器(IWDG_PR),该寄存器用来设置看门狗时钟的分频 系数。另一个重装载寄存器。该寄存器用来保存重装载到计数器中的值。该寄存器也是一个 32 位寄存器,但是只有低 12 位是有效的。 只要对以上三个寄存器进行相应的设置,我们就可以启动 STM32 的独立看门狗。 那么这个就是看门狗定义的 结构体类型。 typedef struct / c/ M* D0 c/ N9 L' f8 V
{
% i1 B R5 ~$ {0 T" u) P9 x9 o __IO uint32_t KR;$ z/ r) Q9 e. G1 m7 O5 y- F1 ?
__IO uint32_t PR;5 E* R# v- a: \$ [. S9 w
__IO uint32_t RLR;
0 y: G6 P4 w4 p2 B$ x __IO uint32_t SR;8 N. Q3 W. L+ k( ]2 Z. O4 h8 n
} IWDG_TypeDef;; r) [ j6 f4 v' b9 {( a
e3 u, U* X" s
/**
6 O; {) C' |1 P7 \1 g * @brief Power Control* i5 L0 j5 o9 M
*/
% I4 ^/ J% h: V" d6 S, q; z
# S7 A; ^$ l* U2 W4 H( w1 xtypedef struct
/ i) ]! B" _0 T0 u{$ j6 o. H. K2 H( I# D9 K) @
__IO uint32_t CR;
% w& h. o+ d! V" x __IO uint32_t CSR;! P" B, R3 q" C b( W- o; o, ~# e
} PWR_TypeDef; CR; //电源控制寄存器 vu32 CSR; //电源控制状态寄存器
; t! R" T4 z0 Q9 S! a+ D5 c" r" s, a+ l1 t. f# M
/** . P; x: h, {7 L$ N+ y2 @0 Q! h: Q
* @brief Reset and Clock Control6 N s0 o; G2 M9 ]: q
*/
5 y% |* F* E' I2 A( m6 T5 |# }2 h/ E6 a9 k
typedef struct% w5 x6 a: c0 R
{
- |/ U; l5 W$ r3 f __IO uint32_t CR;+ x' \, @ w- G& A; j ~5 B
__IO uint32_t CFGR;
- ], y* P* a; t' t4 N/ B1 A6 w __IO uint32_t CIR;
) i L/ V9 p8 L. b X __IO uint32_t APB2RSTR;
+ @& M& \/ h8 |6 j/ M __IO uint32_t APB1RSTR;: x* X4 h, ~; [0 S) U
__IO uint32_t AHBENR;; V( O+ P# e$ q0 `" y2 K
__IO uint32_t APB2ENR;
) Z: T# w' P" Z( z __IO uint32_t APB1ENR;
7 q, `+ t/ Y# |1 N __IO uint32_t BDCR;
, L4 t! Z$ M$ ?" y: G& Z __IO uint32_t CSR;1 q* s& ~: y7 u; Q
/ u- p! d, M3 b. n! S; N' n
#ifdef STM32F10X_CL
- k" i% ~# P% ]( `" V; D __IO uint32_t AHBRSTR;& U" y/ V% _, T+ ~& Y
__IO uint32_t CFGR2;
- o3 d* Z/ M: w( U9 u. ?6 W#endif /* STM32F10X_CL */
. s! R& | j5 L1 R8 z; P. {( y$ x' Z7 G) a
#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL)
3 s5 U( |; D* K G4 F1 U5 i$ A5 y uint32_t RESERVED0;7 Q& V" q6 C) L# `( i) f
__IO uint32_t CFGR2;7 k5 I1 o+ T; w6 {" n# R8 l
#endif /* STM32F10X_LD_VL || STM32F10X_MD_VL || STM32F10X_HD_VL */ * m _. t ]2 i$ b. U! \7 j
} RCC_TypeDef; . 这个宏定义是把RCC宏定义到stm32RCC寄存器的分配的存储器单元的首地址上,其中RCC_TypeDef是stm32f10x_map.h中定义的结构体,用来表述RCC所有寄存器构成的 1 q( k# `5 [- q
% {. Z3 @; q; L0 X0 y6 r# s5 k
———————————————————————————————————————————————————9 E8 n% _# V6 R
——————————————————————————————————————————————————— //本程序只供学习使用,如果用于工程应用,请仔细检查* \' J9 W) X% b! P
//主要对于ST公司的库存文件stm32f10x.h进行解析
h5 b; R7 C/ t. u9 @* o! M//修改日期:2014/6
+ j7 j" B% j/ E1 O, w% V//Copyright(C) 2014-20251 M" Y# t5 w% B& W* u
//All rights reserved
) v) f0 |) F7 L& x! d1 T//******************************************************************************** */, ] |) W3 v: U) O' H+ k4 V
/** 4 M! _7 k0 }% @+ f- w5 w) X
* @brief Real-Time Clock" z* E. Z0 F/ O- D8 y" T
*/
; l) c+ Z8 h+ O- F: {RTC预分频器余数寄存器高位(RTC_DIVH)
) H% J: b4 o5 b B/ G3 bRTC预分频器余数寄存器低位(RTC_DIVL)
) Z9 B# Y/ Y0 b+ XRTC控制寄存器高位(RTC_CRH)
]5 m' A6 u# P+ ]5 ?& H5 \4 yRTC控制寄存器低位(RTC_CRL)( N0 F6 C' A4 H- ]) J
RTC预分频装载寄存器高位(RTC_PRLH)
+ {: o L8 [6 E' [RTC预分频装载寄存器低位(RTC_PRLL)
$ [2 A3 r; {# IRTC计数器寄存器高位(RTC_CNTH)
% Z6 w3 x) S7 A+ X9 dRTC计数器寄存器低位(RTC_CNTL)
5 Q5 e+ ]# ~& ]0 v7 c! RRTC闹钟寄存器高位(RTC_ALRH)
v* d) \0 Y* f* DRTC闹钟寄存器低位(RTC_ALRL) . G3 y; p- L3 V( k
/ ]" x- b! `' u$ C6 O. G. V$ U
typedef struct: z' Y3 b' X& ?- w2 E
{
6 i: ~) H( Q8 A. ?% V __IO uint16_t CRH;
4 h @, b$ l8 o, G! P uint16_t RESERVED0; RTC寄存器是16位可寻址寄存器,这是定义它的数据类型为16位的。0 k1 G: K" [) w8 w# ?; g2 u9 J/ Q
__IO uint16_t CRL;
$ i& Y8 j5 P0 w uint16_t RESERVED1;
j0 p4 I: Z' s& ] __IO uint16_t PRLH;
" V; H# V: v% o' o/ Z: D uint16_t RESERVED2;* R) z- S' B3 x* H% O7 s1 C
__IO uint16_t PRLL;
& |& V+ G" p1 F( d9 f4 k* L uint16_t RESERVED3;
* E$ E6 W: [" C3 i, X, {0 Y% E; M __IO uint16_t DIVH;
+ J. R2 P+ W F) [. f' {1 S/ m. ] uint16_t RESERVED4;- v( x d3 e8 B" Z
__IO uint16_t DIVL;7 a8 I, E& |8 w, L7 b8 u9 \. B/ P
uint16_t RESERVED5;# l! ^& C: q, O, a o# ^* G a `
__IO uint16_t CNTH;/ B3 v+ U( s; F/ J) X
uint16_t RESERVED6;
+ y J8 r2 `4 e, o __IO uint16_t CNTL;
- G8 D0 z% o9 s6 V" }: ^8 V; O uint16_t RESERVED7;# C( t4 x, a! u+ F* P
__IO uint16_t ALRH;) y! A7 u. x! _- Z
uint16_t RESERVED8;
, T, b9 A" Z$ d9 o8 y4 ]( E( b2 I* W __IO uint16_t ALRL;
% l: @& N: G5 y( W. t1 B i" V/ ^ uint16_t RESERVED9;
7 ]. A( f1 |5 N$ `# Q& P- i. U}
7 ~/ T1 Y( A* y5 u+ ?; ^RTC_TypeDef; / h2 t1 E0 ]1 J5 Q
/** # ^; o/ x% u. ?/ ^7 l- D6 w8 q% d
* @brief SD host Interface SD卡接口4 S, S% l" j! Q. Z; B
*/
" X3 U( X$ m P% d7 w7 JSDIO电源控制寄存器(SDIO_POWER)
I5 A" [8 E. L# Z/ u1 NSDIO时钟控制寄存器(SDIO_CLKCR)
2 y/ k U8 h K( `SDIO参数寄存器(SDIO_ARG)
" m# N% D2 d8 \2 l: ^( p9 ASDIO命令寄存器(SDIO_CMD) 1 G/ ?& r9 @% R( [4 F# V/ \
SDIO命令响应寄存器(SDIO_RESPCMD)! a5 p$ S8 q% M+ o! u5 q7 F9 m
SDIO响应1..4寄存器(SDIO_RESPx)
% X8 y f; h; a1 F( y6 {; C/ W7 a. ASDIO数据定时器寄存器(SDIO_DTIMER)
2 Q1 s+ V# \, m0 ~1 CSDIO数据长度寄存器(SDIO_DLEN)
( x; w. m0 n% Y8 g. ESDIO数据控制寄存器(SDIO_DCTRL)
8 r5 N# X4 G, R* _9 r1 hSDIO数据计数器寄存器(SDIO_DCOUNT) 7 O/ ~& a5 ~: ]5 |2 R
SDIO状态寄存器(SDIO_STA)
; c% {0 O( w6 l, Z4 b8 F4 DSDIO清除中断寄存器(SDIO_ICR)
5 F! j* i* g2 S, v) Y% Q' A% E! J9 JSDIO中断屏蔽寄存器(SDIO_MASK)8 [7 d4 j$ v# |( q, P
SDIO FIFO计数器寄存器(SDIO_FIFOCNT) _8 n& t( Y) H. o; u7 S! i: J7 X; t
SDIO数据FIFO寄存器(SDIO_FIFO)
5 X* P4 Q, W5 Vtypedef struct
- V+ Q& q( r# E{
/ H" Q2 ], J/ o* s2 Z6 S __IO uint32_t POWER;' }, u$ o6 M% Q. A: W3 G0 q: Q. K
__IO uint32_t CLKCR;7 T+ H% Y9 h3 f7 H. m) [3 x
__IO uint32_t ARG; C2 B' {- _5 V. E9 w: o+ M
__IO uint32_t CMD;1 R# C* I5 B* h: d
__I uint32_t RESPCMD;
8 K W8 M4 \7 L- i" c __I uint32_t RESP1;* F; M, a. p) ?$ S% e
__I uint32_t RESP2;
) c& R# Y& \ b __I uint32_t RESP3;
1 {2 I: K2 D: Q) }1 h v __I uint32_t RESP4;# i. [4 |: |+ T6 d4 u
__IO uint32_t DTIMER;( S: G! P$ H1 E3 C+ I; e. @
__IO uint32_t DLEN;, S" k7 H9 k/ x1 e3 o
__IO uint32_t DCTRL;
* H! B7 B9 C# p7 p% \ __I uint32_t DCOUNT;
' z* F8 \* b2 ^& S/ J: o+ X5 u! j __I uint32_t STA;( }. R/ k$ s$ `5 p6 T& X* j0 ?; x
__IO uint32_t ICR;9 e$ h9 A3 z* Z( z* {" @0 H' b+ f
__IO uint32_t MASK;; \ N& M- f) A( A8 |' B
uint32_t RESERVED0[2];. m) {% L7 d W" D! O! ~" X
__I uint32_t FIFOCNT;
: c$ K" q$ V: h5 i( C h uint32_t RESERVED1[13];
- s$ @6 q$ U& k! q __IO uint32_t FIFO;* {3 [; K5 K* Q5 ~$ q; w6 I
} SDIO_TypeDef;7 k' L9 U5 s5 s7 K
0 U; k' G( x, C; _: _8 [ \/**
& h% w$ L/ z! C% v * @brief Serial Peripheral Interface————-SPI串行总线% ~+ w: \1 c4 M1 M
*/" F7 X: Y" f" \/ J
SPI控制寄存器1(SPI_CR1)3 @3 R6 Q' R" @! o
SPI控制寄存器2(SPI_CR2) 4 z2 S- b; B' @7 \. V6 z
SPI 状态寄存器(SPI_SR) ' A; \/ Z4 A# u2 I
SPI 数据寄存器(SPI_DR)) Y; ? l/ |4 i+ e/ y
SPI CRC多项式寄存器(SPI_CRCPR)
0 {% C# a* s4 V+ n7 }8 FSPI Rx CRC寄存器(SPI_RXCRCR)- G( h" @- N s+ x
SPI Tx CRC寄存器(SPI_TXCRCR) s9 u' O, P$ ?8 S, M; J/ r5 F
SPI_I2S配置寄存器(SPI_I2S_CFGR)
" K5 i8 _" p6 g5 h9 N) FSPI_I2S预分频寄存器(SPI_I2SPR) " ?2 ]( x7 u9 H- }0 q/ P4 h4 J
, \, i$ W+ |) n @7 S& Z, C
% f1 j* H* q# {+ W1 K/ w* l% h
typedef struct
; R) W, q6 h9 A- \3 d{
}; q& @, n' Z; L, ` __IO uint16_t CR1;* u7 N, _: g: G% F
uint16_t RESERVED0;! ?! j* c$ R q& \5 Y8 S5 i
__IO uint16_t CR2;+ {5 ]4 F. x# Q
uint16_t RESERVED1;( l' I, L$ g8 F: F9 J Q
__IO uint16_t SR;
' F$ ?) T% z3 m uint16_t RESERVED2;
6 ?0 ` x. F" F/ C __IO uint16_t DR;
# J# p3 e" j8 E, A6 Q0 h2 d uint16_t RESERVED3;
9 \3 e& o/ Y0 t) |& ]- f- H __IO uint16_t CRCPR;" C3 k0 J, s. e( ]- a$ G S6 ]1 P
uint16_t RESERVED4;, [3 ^( c2 q" V" {
__IO uint16_t RXCRCR;
9 q1 j9 H" T$ R& d( C uint16_t RESERVED5;8 r: ^- H% V8 m r; |9 D! `
__IO uint16_t TXCRCR;! V- K% n+ N# a5 k8 i+ n+ I
uint16_t RESERVED6;) q$ R/ p# I* `( m6 {
__IO uint16_t I2SCFGR;
+ J+ W* c ^- q' U3 R uint16_t RESERVED7;. t% v( E$ f' ]
__IO uint16_t I2SPR;
1 k5 j# ?# M2 V uint16_t RESERVED8;
" `0 x( f0 t; {3 v; c} SPI_TypeDef;
' R1 I% M- B7 e3 Q8 P) C1 o" `" E9 u0 B3 D4 Z, x
/**
* h n4 X% l8 S$ z; H * @brief TIM
0 y$ G; U, p0 a$ c" S# H 高级控制定时器(TIM1和TIM8)由一个16位的自动装载计数器组成,它由一个可编程的预分频器驱动。, V7 {; e+ m! H% `# ?
它适合多种用途,包含测量输入信号的脉冲宽度(输入捕获),或者产生输出波形(输出比较、
( S% G1 D1 b$ t( R P$ \9 m' jPWM、嵌入死区时间的互补PWM等)。 N! H* `& l& l7 M
使用定时器预分频器和RCC时钟控制预分频器,可以实现脉冲宽度和波形周期从几个微秒到几& k1 C! W. z6 x+ L F1 T& s
个毫秒的调节。, _( D4 u) e; h% i8 d5 Z+ c; w
高级控制定时器(TIM1和TIM8)和通用定时器(TIMx)是完全独立的,它们不共享任何资源。它们4 \! @0 M, j$ i* q- d$ q
可以同步操作.
3 T A# z7 }+ n7 ]$ j s4 C' K# `% ^4 \9 v. Y% c
控制寄存器1(TIMx_CR1) # t" U, r: N. @. k+ z+ j6 c
控制寄存器2(TIMx_CR2)
; ?) L) s; i: e- w) E! P从模式控制寄存器(TIMx_SMCR) 9 w& U$ l' K6 Z* A6 f
DMA/中断使能寄存器(TIMx_DIER)/ i( w, f2 I% {& l9 _, c
状态寄存器(TIMx_SR)
2 F9 Q( y+ a. d2 p5 M" @) `+ N, D# K0 h事件产生寄存器(TIMx_EGR)
& |' F q8 R% K& h捕获/比较模式寄存器1(TIMx_CCMR1)
; W, t4 K; R: H捕获/比较模式寄存器2(TIMx_CCMR2) + V! K6 e& ^3 O. x0 ?. N
捕获/比较使能寄存器(TIMx_CCER) ( a+ @( Y, j, t' ^" x$ b8 d
计数器(TIMx_CNT)9 L+ g" J/ O4 E0 w- a
预分频器(TIMx_PSC)( y+ U9 }- C% N$ M/ N
自动重装载寄存器(TIMx_ARR) # t3 ]6 G, s1 d* O! m: v
重复计数寄存器(TIMx_RCR)
/ Z5 r# U1 ~ x. G* N* {捕获/比较寄存器1(TIMx_CCR1)0 f U5 ~' H+ B) i, E& \1 _: G/ X! r, P
捕获/比较寄存器2(TIMx_CCR2)# ^' l4 ^( R( x* L
捕获/比较寄存器3(TIMx_CCR3)
) K! f! N3 I6 r& W! V/ |5 X% {捕获/比较寄存器(TIMx_CCR4)8 B6 D1 s8 C+ p7 Q! @
刹车和死区寄存器(TIMx_BDTR)
8 l- A. z1 g" ^# l TDMA控制寄存器(TIMx_DCR)
7 Q- A8 u# t, P. E6 T连续模式的DMA地址(TIMx_DMAR)
2 _7 b* M+ m' U3 k+ [1 o* P7 P
$ j; G. B' S' a7 B2 [4 Z0 [这个结构体就是以上这些寄存器的类型定义。
+ M5 [/ F. W8 s; g8 b7 y" m2 f4 A8 r6 L* Y
*/
2 F6 Z2 g1 S4 p9 W0 E, `
2 p' }- a; B9 g0 wtypedef struct' k4 X9 L8 |+ f) ? |5 p# M6 b
{
: L! R5 m- J( G* h, E __IO uint16_t CR1;" O; y* I1 q. S8 |
uint16_t RESERVED0;9 ^! u) `# H' q1 _
__IO uint16_t CR2;9 S) ?4 }2 R/ h- b7 p" \
uint16_t RESERVED1;
( r3 w$ f# q& @! C __IO uint16_t SMCR;. j5 [5 B5 Z! }% s* A; T, n
uint16_t RESERVED2;2 n& v$ q* y1 w' C/ Y7 h {& u5 P
__IO uint16_t DIER;
$ X- g% h- Y7 b0 w uint16_t RESERVED3;
. j- S9 ]8 j# e% \% B __IO uint16_t SR;
9 m! f N% R1 `- h. [ uint16_t RESERVED4;1 P$ p2 H1 I4 |
__IO uint16_t EGR;9 R. e$ ?. F1 W* U# J2 A
uint16_t RESERVED5;; _9 x! R* s3 w- C7 q' L4 y i
__IO uint16_t CCMR1;) P- m( d* B" V6 _( A
uint16_t RESERVED6;. E% W8 e5 [1 g8 k
__IO uint16_t CCMR2;
# M2 E8 d" H# X% X6 R" @7 F uint16_t RESERVED7;
) f! }. |. f/ l+ n3 _+ c3 B$ x, ` __IO uint16_t CCER;. R7 g9 t% ^% F% ~
uint16_t RESERVED8;
G- O# M d$ z' m% \* | __IO uint16_t CNT;! }! z0 v7 Q: T- o
uint16_t RESERVED9;
`5 S( q4 [) X; Q" M __IO uint16_t PSC;- s! W; G: m% P, ]6 C1 U) V
uint16_t RESERVED10;1 G; Y4 Q4 o0 p* J0 `, K
__IO uint16_t ARR;. Z+ |; T4 {* Z+ C& R8 l
uint16_t RESERVED11;: k1 \+ x7 I. u* y
__IO uint16_t RCR;
4 B" K% v/ k; F4 J1 C& g* C1 o/ Z uint16_t RESERVED12;
& _ Q# |* C5 Q/ H( u __IO uint16_t CCR1;
. X# q" Y# r) l+ ?0 M4 F uint16_t RESERVED13;% G+ O* k$ g) e! N6 ^
__IO uint16_t CCR2;4 m# S! c. G3 u6 W2 z1 _
uint16_t RESERVED14;/ U x2 [1 G' n3 }
__IO uint16_t CCR3;; O; d/ B1 T1 G* _
uint16_t RESERVED15;1 e! m4 T. o' J9 K1 P. c- C" Q" L0 U
__IO uint16_t CCR4;+ g' j/ z! T/ ^3 i
uint16_t RESERVED16;7 ^7 Y/ S$ E6 J$ i0 ?
__IO uint16_t BDTR;
) p3 H6 l/ P/ i `1 O! ^# B uint16_t RESERVED17;
9 h" H8 {! h/ J: k! ]! \4 _& g __IO uint16_t DCR;% M' E& l7 @( I9 J
uint16_t RESERVED18;
7 v S( Q; j5 M( e4 T __IO uint16_t DMAR;0 o2 I* W( s0 x0 c: n; u
uint16_t RESERVED19;! Z( \8 a4 u' p5 h
} TIM_TypeDef;
0 D/ k% C5 B5 A6 V
- T9 d* L( e3 G0 I9 O) o4 C- j/**
% `3 c f2 \! y1 r * @brief Universal Synchronous Asynchronous Receiver Transmitter. t6 z. s2 _! O! T( Z2 g
*/在UART上追加同步方式的序列信号变换电路的产品,被称为USART(Universal Synchronous Asynchronous Receiver Transmitter)。: f5 h* @) L7 A+ l2 n/ o
状态寄存器(USART_SR) 5 q6 I: g# A$ y) X' O1 p+ x
数据寄存器(USART_DR)1 \4 l; ^5 @: G- [9 C/ j* U
波特比率寄存器(USART_BRR)
8 ~+ Q5 O3 u1 o; @/ p4 R7 y. X控制寄存器1(USART_CR1), U- S; k) @2 K
控制寄存器2(USART_CR2) * j% F, N+ x' l
控制寄存器3(USART_CR3) 1 J* m' F2 m* R; Z5 l
保护时间和预分频寄存器(USART_GTPR) $ M8 B# ?- N$ U1 ^% p( k2 `" g$ [$ M
' s$ T3 ?. u. t- R6 Y
typedef struct! F9 j5 H4 V7 _% p( h* s6 ]
{
" k# p7 n3 I$ v$ H h3 ~ __IO uint16_t SR;
# p$ U, t( W0 T! o2 C1 h5 w uint16_t RESERVED0;0 c$ O7 E# @; m: k6 A
__IO uint16_t DR;* y* w5 T F) a$ N0 P: W+ s7 N
uint16_t RESERVED1;
9 Z% w( K2 `- S0 o __IO uint16_t BRR;2 B1 H0 C& Q' m. k$ p( ?8 p
uint16_t RESERVED2;
$ o$ W- K# m; i __IO uint16_t CR1;1 q4 d3 W9 j" S3 U1 S
uint16_t RESERVED3;
K3 v% S" H3 F* A) B# K1 y+ y) `4 E __IO uint16_t CR2;
- o4 v, U2 l6 O8 O uint16_t RESERVED4;
& V. U3 j! L; D* d9 Y/ F- h __IO uint16_t CR3;3 W" [& c" }6 O0 x: {! \& [7 o0 {
uint16_t RESERVED5;! i2 e1 ~2 `' ?* P. }4 T1 A
__IO uint16_t GTPR;
1 j3 p; A$ T% n3 J* f/ z; _$ q uint16_t RESERVED6;$ e3 {5 X( ]9 O/ Y& W0 Q
} USART_TypeDef;
0 ^9 O: ?+ T1 k% x: |4 k. u- T9 C' C/ p* ?
/** ( ?4 x6 k( ]" ?* q
* @brief Window WATCHDOG
: ?; p8 t7 q2 \( C" _ */
. I. v; y3 y4 z2 K# o* w( ?! A3 I/ K8 `
typedef struct
) I* K: _. P- e( v- ~7 \ B& D& J( x{. _$ h2 z( G5 i) T" r
__IO uint32_t CR;
4 t* R9 Q* f* K/ q, x: F/ q* Q. p( n& k __IO uint32_t CFR;6 p7 E1 y) A2 P9 y3 j9 r
__IO uint32_t SR;# g5 T: O" r2 L
} WWDG_TypeDef;
, }' r% ~! ~/ c+ \
$ N! H; g# }) f3 D7 d3 ]/**
# V- I* f7 [8 P; a& R/ t * @}
' b B a4 g8 b& o2 Q0 G2 k. c, G */" l A2 F( ^8 E7 V, }5 M8 r5 o
, g9 P6 T: }; P$ O2 p9 S/** @addtogroup Peripheral_memory_map$ M! Y; f0 m( w& g* l
* @{! _3 D2 s: v, {7 K5 v
*/
# C$ }0 ]2 ~- A8 e
% l8 H6 F7 \) h9 }8 X7 o1 M3 O. Q" t! j- r6 x) |+ J% o5 I
#define FLASH_BASE ((uint32_t)0x08000000) /*!< FLASH base address in the alias region 0 i! E7 M/ H- T
在Alias地区Flash基址*/5 b- K4 c5 l* j& s
#define SRAM_BASE ((uint32_t)0x20000000) /*!< SRAM base address in the alias region */
! x+ y8 X$ o3 _: h; X! E#define PERIPH_BASE ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */
8 t" R8 Z1 j! ^/ Z9 k/ Q) x% D: Y& p- o0 B. p& ?( z
#define SRAM_BB_BASE ((uint32_t)0x22000000) /*!< SRAM base address in the bit-band region */
, D; k& c" b* w8 o! m#define PERIPH_BB_BASE ((uint32_t)0x42000000) /*!< Peripheral base address in the bit-band region */' h$ B/ Y4 }! V+ y' L
7 V( h( E+ ?+ J$ O/ l' k0 q#define FSMC_R_BASE ((uint32_t)0xA0000000) /*!< FSMC registers base address */2 @7 Y0 l6 c9 C6 K
3 _; r! S! Y7 x7 v/*!< Peripheral memory map */
' T# y/ w! E, g1 b* V, ~#define APB1PERIPH_BASE PERIPH_BASE
. s5 ^, {) T8 q( p7 z0 ~6 @1 L5 r#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)& z+ Q @) C) L$ F
#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000)* r* \$ D' f- U! U" e
4 X- F1 \0 a" M; e: f$ u0 J
#define TIM2_BASE (APB1PERIPH_BASE + 0x0000)/ \4 D; C2 a; L
#define TIM3_BASE (APB1PERIPH_BASE + 0x0400)1 q. @6 d* ?( a6 A6 T
#define TIM4_BASE (APB1PERIPH_BASE + 0x0800)
1 Q2 k* e5 p' X/ ]* V( j#define TIM5_BASE (APB1PERIPH_BASE + 0x0C00)
# ^2 S$ E" L* y( }1 J/ A6 }$ i#define TIM6_BASE (APB1PERIPH_BASE + 0x1000)- X/ [0 R0 Z) g+ s4 X1 D& f5 D( r
#define TIM7_BASE (APB1PERIPH_BASE + 0x1400)
' G9 h0 i6 B6 X4 `#define TIM12_BASE (APB1PERIPH_BASE + 0x1800)5 F; @- A8 U$ U- M1 X
#define TIM13_BASE (APB1PERIPH_BASE + 0x1C00)
6 `7 X) [! c2 I& ^0 F2 _& `#define TIM14_BASE (APB1PERIPH_BASE + 0x2000) h( u+ k/ N! u& m- o6 | O. o1 X
#define RTC_BASE (APB1PERIPH_BASE + 0x2800), W+ G$ I7 ?9 Y4 p. r! @( d$ R
#define WWDG_BASE (APB1PERIPH_BASE + 0x2C00)
7 N6 S- z9 I4 `& A#define IWDG_BASE (APB1PERIPH_BASE + 0x3000)
. O: H9 [2 P* t4 s; P, ~#define SPI2_BASE (APB1PERIPH_BASE + 0x3800)
' [% p' g. L, p2 _7 K& R) n#define SPI3_BASE (APB1PERIPH_BASE + 0x3C00)5 ]# ^' l) ~4 I, ?
#define USART2_BASE (APB1PERIPH_BASE + 0x4400)# w* |( R' s( i0 h
#define USART3_BASE (APB1PERIPH_BASE + 0x4800)- E! I+ G8 u, O+ c
#define UART4_BASE (APB1PERIPH_BASE + 0x4C00)
; k4 p* E- F% r2 |/ C; R#define UART5_BASE (APB1PERIPH_BASE + 0x5000)
2 i' O( c8 P% }# S#define I2C1_BASE (APB1PERIPH_BASE + 0x5400)
' \" S8 U( {6 e. f; T* d9 H- C. y+ {#define I2C2_BASE (APB1PERIPH_BASE + 0x5800)0 g/ z( ]9 ^& D7 g+ f
#define CAN1_BASE (APB1PERIPH_BASE + 0x6400)
# X2 k0 A: ]. [+ \- C. l2 [* s. F9 f#define CAN2_BASE (APB1PERIPH_BASE + 0x6800)# k Z" N& Y2 f `
#define BKP_BASE (APB1PERIPH_BASE + 0x6C00)
; P! q {" Y( x# P x j- o# s#define PWR_BASE (APB1PERIPH_BASE + 0x7000)! q1 t0 B# i) E0 ~! O! k6 ?. S
#define DAC_BASE (APB1PERIPH_BASE + 0x7400)* {' }6 K& X- B' J4 X6 Z
#define CEC_BASE (APB1PERIPH_BASE + 0x7800)
% Q, h' F6 i, k6 N
: \! X3 w$ Z( K6 k4 p#define AFIO_BASE (APB2PERIPH_BASE + 0x0000)
* |) J R9 _0 F9 Q+ }; C) `+ }#define EXTI_BASE (APB2PERIPH_BASE + 0x0400)2 O1 F9 Y" J6 ?
#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)7 |, R5 {( D8 J7 Y$ h+ f! J2 g
#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00)% Y8 g' F, `& P1 v; V# p" v3 {
#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)
& d: O# y3 o: b3 c3 K#define GPIOD_BASE (APB2PERIPH_BASE + 0x1400)
9 l9 p) w) p) f( \/ m) A' x#define GPIOE_BASE (APB2PERIPH_BASE + 0x1800)
9 J. |+ X% U3 K5 x+ ?#define GPIOF_BASE (APB2PERIPH_BASE + 0x1C00)
; a0 G6 D" s5 G6 ?7 @( O#define GPIOG_BASE (APB2PERIPH_BASE + 0x2000)
/ w' Y" l+ x, h# V a# c) u! D#define ADC1_BASE (APB2PERIPH_BASE + 0x2400)
* H- M; O7 b! o6 H7 Z. p! X# z#define ADC2_BASE (APB2PERIPH_BASE + 0x2800)! o/ C" j" T% P$ _6 h/ v4 z
#define TIM1_BASE (APB2PERIPH_BASE + 0x2C00)3 J) {: k m+ c! g- ~
#define SPI1_BASE (APB2PERIPH_BASE + 0x3000)8 h5 q9 }6 X; C. x
#define TIM8_BASE (APB2PERIPH_BASE + 0x3400)
5 z$ s1 B R* M f/ x#define USART1_BASE (APB2PERIPH_BASE + 0x3800)
& E2 x& V! [. n; b: q% A; ^7 [2 ?#define ADC3_BASE (APB2PERIPH_BASE + 0x3C00)8 U+ ~9 a+ ~- P
#define TIM15_BASE (APB2PERIPH_BASE + 0x4000)
# T. x. C4 k0 l4 b. @#define TIM16_BASE (APB2PERIPH_BASE + 0x4400): r' O6 v$ [/ D
#define TIM17_BASE (APB2PERIPH_BASE + 0x4800); v6 \! l* N" m$ s* N# g! o
#define TIM9_BASE (APB2PERIPH_BASE + 0x4C00)
7 }) v9 d, ~/ G+ x3 a. B#define TIM10_BASE (APB2PERIPH_BASE + 0x5000)
7 _6 E8 }2 _: K( ]4 W: r6 q#define TIM11_BASE (APB2PERIPH_BASE + 0x5400)8 Q( O7 U8 I/ q T( w3 E2 R
6 h4 a3 u) T. R( M2 W#define SDIO_BASE (PERIPH_BASE + 0x18000)
7 L/ d# { b5 R2 `3 }% i+ p1 S2 L" S' b( }0 W; }- u5 f
#define DMA1_BASE (AHBPERIPH_BASE + 0x0000)
3 z; H7 A& a( J1 w+ S* E! a1 L$ I#define DMA1_Channel1_BASE (AHBPERIPH_BASE + 0x0008)
3 m. _. t) U* j$ L+ \2 X* E#define DMA1_Channel2_BASE (AHBPERIPH_BASE + 0x001C)/ B5 r* l( c& s" @7 U, f& `1 ]
#define DMA1_Channel3_BASE (AHBPERIPH_BASE + 0x0030)5 e v9 Q& D4 D( O) c% L6 v8 i) K
#define DMA1_Channel4_BASE (AHBPERIPH_BASE + 0x0044)
- z+ G) ~# C6 h: R9 ~7 Q#define DMA1_Channel5_BASE (AHBPERIPH_BASE + 0x0058)
% V4 d8 m, _- ]- f' [( k#define DMA1_Channel6_BASE (AHBPERIPH_BASE + 0x006C); Z( s9 U6 t6 m5 I7 k; c- G
#define DMA1_Channel7_BASE (AHBPERIPH_BASE + 0x0080)
( J. `# q& x& `3 o8 e6 T5 q#define DMA2_BASE (AHBPERIPH_BASE + 0x0400)
O: i4 l n+ @/ ~; S! {#define DMA2_Channel1_BASE (AHBPERIPH_BASE + 0x0408)
) D% h2 X; }, G) K' k#define DMA2_Channel2_BASE (AHBPERIPH_BASE + 0x041C)1 N; L @; ~" W
#define DMA2_Channel3_BASE (AHBPERIPH_BASE + 0x0430)
" @ y( u6 h& R( s#define DMA2_Channel4_BASE (AHBPERIPH_BASE + 0x0444)5 \; z3 s/ _& k# h: E
#define DMA2_Channel5_BASE (AHBPERIPH_BASE + 0x0458)* R) R6 ~2 n- J+ H3 u. a
#define RCC_BASE (AHBPERIPH_BASE + 0x1000)
; j. O# P- L* U$ C: o. o( q5 _#define CRC_BASE (AHBPERIPH_BASE + 0x3000)' X& ?5 B7 ^$ v. b' e
3 L/ E! L8 e7 i, z
#define FLASH_R_BASE (AHBPERIPH_BASE + 0x2000) /*!< Flash registers base address */$ \! }3 E; N1 g" `7 W z
#define OB_BASE ((uint32_t)0x1FFFF800) /*!< Flash Option Bytes base address */
: t3 c( f8 E1 i1 Y/ d O2 N+ ~) w7 B/ g* Y; K1 S
#define ETH_BASE (AHBPERIPH_BASE + 0x8000)
, w, I. @- ^, u$ W0 e#define ETH_MAC_BASE (ETH_BASE)
8 w' O5 G N2 P* `+ [, K: R#define ETH_MMC_BASE (ETH_BASE + 0x0100)
) [9 a* n- }/ ]2 A5 Q. R( G+ R#define ETH_PTP_BASE (ETH_BASE + 0x0700)/ L' g3 x# d8 C2 ^! y' G- b4 X
#define ETH_DMA_BASE (ETH_BASE + 0x1000)) y4 F, k$ D+ K" v" ?+ S
8 U0 q ~6 t4 N; W" ^3 c
#define FSMC_Bank1_R_BASE (FSMC_R_BASE + 0x0000) /*!< FSMC Bank1 registers base address */
+ J1 u% w4 n8 {* Z9 p2 h) m#define FSMC_Bank1E_R_BASE (FSMC_R_BASE + 0x0104) /*!< FSMC Bank1E registers base address */
2 G4 Q8 d0 v) v; r7 Y#define FSMC_Bank2_R_BASE (FSMC_R_BASE + 0x0060) /*!< FSMC Bank2 registers base address */
; c" B" j& u3 ^1 M; q8 m8 X#define FSMC_Bank3_R_BASE (FSMC_R_BASE + 0x0080) /*!< FSMC Bank3 registers base address */8 ]9 o# B( N8 B( D/ f
#define FSMC_Bank4_R_BASE (FSMC_R_BASE + 0x00A0) /*!< FSMC Bank4 registers base address */
. Z, B0 [: B% J
% S) B4 [$ X$ a! u#define DBGMCU_BASE ((uint32_t)0xE0042000) /*!< Debug MCU registers base address */+ e8 ^" \3 I* L; ~- o2 }6 ~
: M: Y" g8 C* x# _) ]0 ^( o6 X
) s4 F0 A/ k# m) D5 i8 j" I6 W
——————————————————————————————————————————————————— ——————————————————————————————————————————————————— /******************************************************************************/
7 w3 Q/ c( s7 u) @0 t2 q /* Peripheral Registers_Bits_Definition
8 [0 S5 ] T4 Y3 u$ w6 t、 串行寄存器位定义 */% J0 |0 L- D( P
/******************************************************************************/4 v5 s, w' I* H, Z
( H6 {4 y- D* r7 h& W3 ^
/******************************************************************************/3 ^$ L3 T* Y7 L1 m) E1 n% r. g
/* */
: D$ b5 b! c j$ X. F1 l/* CRC calculation unit */2 U! C: d5 c) W
/* CRC 校验单元 */( y; M$ D! `5 l8 R
/******************************************************************************/
8 ?, E: g& C2 L5 C6 T% K7 H' ?
; N3 c g/ ?0 K/******************* Bit definition for CRC_DR register *********************/: v- t- A9 @' G8 M' \% f. l
#define CRC_DR_DR ((uint32_t)0xFFFFFFFF) /*!< Data register bits数据寄存器位 */; B; Y5 ]7 J0 { I9 Y* n3 B: ]
数据寄存器(CRC_DR)$ _" q+ q( z- u8 d# ^
" ~7 _( f, ?' K, b* ?$ S# H. |7 B/******************* Bit definition for CRC_IDR register ********************/' g- O& T; Q) v5 g% n8 P( I# O I$ ^
#define CRC_IDR_IDR ((uint8_t)0xFF) /*!< General-purpose 8-bit data register bits 通用8位寄存器*/
5 u1 a' c( A5 Y( |, p独立数据寄存器(CRC_IDR) q1 q; B' F/ H. \
控制寄存器(CRC_CR) 7 D- S. e: I+ `4 A
/******************** Bit definition for CRC_CR register ********************/
) ]$ D3 X/ h4 w8 v. p! y5 ^#define CRC_CR_RESET ((uint8_t)0x01) /*!< RESET bit 重启位*/8 c1 {1 [; R5 @2 y2 d! }
% y3 U; _: E" H# x) [" J/******************************************************************************/
# ~% r0 \/ B Q+ t/* */
* D1 a7 z; T" K/* Power Control */$ [ Z' r: s# | z" h
/* */& N! [- ?4 y& K* y7 n
/******************************************************************************/. B& ?( [; d, ]" Z+ q# O1 V1 Q
" n( `8 H" f+ X# h ^* s/******************** Bit definition for PWR_CR register ********************/' S; _* \$ s3 } a) U! ~
#define PWR_CR_LPDS ((uint16_t)0x0001) /*!< Low-Power Deepsleep */; Y7 X& Q' y, O
#define PWR_CR_PDDS ((uint16_t)0x0002) /*!< Power Down Deepsleep */
& M% o2 b, u! y- Y- M. A#define PWR_CR_CWUF ((uint16_t)0x0004) /*!< Clear Wakeup Flag */. \0 l: G( z: O. w/ l: \: g
#define PWR_CR_CSBF ((uint16_t)0x0008) /*!< Clear Standby Flag */5 O8 y7 {0 ^# R4 c1 A" o
#define PWR_CR_PVDE ((uint16_t)0x0010) /*!< Power Voltage Detector Enable */$ v$ x0 C9 v% B5 g
: P: f! L Q$ {- o/ F" _: b#define PWR_CR_PLS ((uint16_t)0x00E0) /*!< PLS[2:0] bits (PVD Level Selection) */
. V6 {4 @5 `9 k9 l6 e, g" k7 a#define PWR_CR_PLS_0 ((uint16_t)0x0020) /*!< Bit 0 */
! d' _+ ?6 `7 _" W, V k7 z. b#define PWR_CR_PLS_1 ((uint16_t)0x0040) /*!< Bit 1 */4 g9 m" Y' o4 {/ \- A( U
#define PWR_CR_PLS_2 ((uint16_t)0x0080) /*!< Bit 2 */1 n" O$ H6 e6 O( e0 W( ^) N
) A* p- Q* L" A
/*!< PVD level configuration */
5 f5 l) f8 a$ q0 X& a- ?#define PWR_CR_PLS_2V2 ((uint16_t)0x0000) /*!< PVD level 2.2V */ ~* @% E0 R9 y$ g9 Y/ G4 q6 j$ O
#define PWR_CR_PLS_2V3 ((uint16_t)0x0020) /*!< PVD level 2.3V */
: i# I/ Y! c1 A3 ~( l3 N#define PWR_CR_PLS_2V4 ((uint16_t)0x0040) /*!< PVD level 2.4V */4 D$ h3 Y2 p. M. X
#define PWR_CR_PLS_2V5 ((uint16_t)0x0060) /*!< PVD level 2.5V */
2 z6 Q. q' T0 h3 e8 w/ x/ N#define PWR_CR_PLS_2V6 ((uint16_t)0x0080) /*!< PVD level 2.6V */: p8 q7 U# N, N" M) U* Z
#define PWR_CR_PLS_2V7 ((uint16_t)0x00A0) /*!< PVD level 2.7V */5 m- K" V9 K' J M3 l7 R
#define PWR_CR_PLS_2V8 ((uint16_t)0x00C0) /*!< PVD level 2.8V */
& D( k- c. O5 ]2 J6 N/ `% x6 t#define PWR_CR_PLS_2V9 ((uint16_t)0x00E0) /*!< PVD level 2.9V */
|; T& Y) g2 Y7 ]/ e) P4 `& J1 L' l) G
#define PWR_CR_DBP ((uint16_t)0x0100) /*!< Disable Backup Domain write protection */* u4 }: \7 W+ Y( [3 q& `
, j5 c! q: ^8 j9 @0 n9 [& Z0 u2 f% Y3 h( \6 T- x# e& T- |
/******************* Bit definition for PWR_CSR register ********************/
; a% H) F* h3 |0 }+ y#define PWR_CSR_WUF ((uint16_t)0x0001) /*!< Wakeup Flag */2 D$ h# M: Y+ n! S' R/ \+ D* u
#define PWR_CSR_SBF ((uint16_t)0x0002) /*!< Standby Flag */- a2 y+ U0 D* |3 G( ]
#define PWR_CSR_PVDO ((uint16_t)0x0004) /*!< PVD Output */
- p5 @* u1 P g- n. q& Q#define PWR_CSR_EWUP ((uint16_t)0x0100) /*!< Enable WKUP pin */0 }. Z1 ^. L. {! H. P8 U
$ D/ x/ z; C) @) J: k2 d( h
/******************************************************************************/
, P* t F( s5 u7 x- b4 U3 F2 [/ C/* */6 Z4 e' i5 _, v# [, D
/* Backup registers */
) W: U r- @% ]2 q( c/* */
/ X5 V$ z5 H0 c/******************************************************************************/- J1 J4 ]. { n. R! o
' r9 T' ]1 d- s* `) m3 w/******************* Bit definition for BKP_DR1 register ********************/$ J0 Q, ^7 @1 i- A7 C
#define BKP_DR1_D ((uint16_t)0xFFFF) /*!< Backup data */4 V; ~9 C$ r- b g! G8 L9 p
9 L# q- i/ e% I+ N) {/******************* Bit definition for BKP_DR2 register ********************/5 Z1 S% L1 u9 _' d2 J
#define BKP_DR2_D ((uint16_t)0xFFFF) /*!< Backup data */
9 G* f6 i* ?. G# `* A \$ l1 |6 i% J2 L
/******************* Bit definition for BKP_DR3 register ********************/' T; U5 m5 o# R1 h( N6 e
#define BKP_DR3_D ((uint16_t)0xFFFF) /*!< Backup data */6 I$ i5 R7 F% I" f; l' o
1 \3 y; f" r) u& T/ h/ b' v/******************* Bit definition for BKP_DR4 register ********************/ s% q1 ^' \( _8 N7 c* ?1 _
#define BKP_DR4_D ((uint16_t)0xFFFF) /*!< Backup data */2 ^- L! U2 O- i4 E3 A9 }: Z% `
: ^- u7 |* a' o5 a
/******************* Bit definition for BKP_DR5 register ********************/: r6 m( `/ T X' @, [ B9 w$ m4 O
#define BKP_DR5_D ((uint16_t)0xFFFF) /*!< Backup data */, q; v8 O7 Q n
0 B9 T2 i3 M. x
/******************* Bit definition for BKP_DR6 register ********************/
. n8 H. H) I$ b5 L, _+ d#define BKP_DR6_D ((uint16_t)0xFFFF) /*!< Backup data */- X+ z; h0 Y3 C( m+ F+ Y3 D
- I1 n9 l6 Q/ A+ Y( d- F/******************* Bit definition for BKP_DR7 register ********************/
% ?+ c4 t, U8 W6 e8 M& w; Q#define BKP_DR7_D ((uint16_t)0xFFFF) /*!< Backup data */
2 q- D/ g, |, Q0 ~# L+ d0 ~7 y
6 a7 d1 z7 V3 m/******************* Bit definition for BKP_DR8 register ********************/
& c7 ]) E+ W# g' w& x ` i#define BKP_DR8_D ((uint16_t)0xFFFF) /*!< Backup data */
& a; e `8 C- W) H0 o
! @7 C* S+ F% ~7 S2 ?3 l/******************* Bit definition for BKP_DR9 register ********************/
( {7 o% p5 [$ A. R2 `; ^- W* _# ^#define BKP_DR9_D ((uint16_t)0xFFFF) /*!< Backup data */7 M) L* p B. ]/ O, a( K% h8 z
0 Z, L- j; T# y+ L7 W! j/******************* Bit definition for BKP_DR10 register *******************/
* X$ R* F6 I. J; d#define BKP_DR10_D ((uint16_t)0xFFFF) /*!< Backup data */ x1 s6 w$ ]7 I, ~% P
" S+ @3 f: Z2 S8 P/ K5 o
/******************* Bit definition for BKP_DR11 register *******************/7 k' e2 g+ n' ~# \4 w8 n3 V/ F
#define BKP_DR11_D ((uint16_t)0xFFFF) /*!< Backup data */- P+ B ~3 Y% b: Q
' r: m/ E' a3 S! r5 ?/******************* Bit definition for BKP_DR12 register *******************/1 c! R) I0 y$ c
#define BKP_DR12_D ((uint16_t)0xFFFF) /*!< Backup data */
' n/ M! `7 U' c _4 p3 q. m
: `. X6 z+ ~( @; z2 U/******************* Bit definition for BKP_DR13 register *******************/# w; ?8 c) q0 ^7 s8 C( a
#define BKP_DR13_D ((uint16_t)0xFFFF) /*!< Backup data */2 J4 D' @ H- F. ]6 C& Z5 \
7 G7 {- d4 q: x7 O) H/******************* Bit definition for BKP_DR14 register *******************/
/ b2 _# }7 y* z0 o- P1 {" x6 F#define BKP_DR14_D ((uint16_t)0xFFFF) /*!< Backup data */
8 Q0 q/ H1 s$ i/ m7 o
8 ? ^1 J7 h/ U/******************* Bit definition for BKP_DR15 register *******************/
0 \' }! D3 M# p6 {. m& |+ C#define BKP_DR15_D ((uint16_t)0xFFFF) /*!< Backup data */$ ^0 j& c9 S6 r3 r3 Z; v O6 R
! M J/ o3 U9 g8 S3 c/******************* Bit definition for BKP_DR16 register *******************/
: M5 ]* g, ?/ t5 F1 ~1 W/ z& I$ m' z#define BKP_DR16_D ((uint16_t)0xFFFF) /*!< Backup data */
8 M ~- T+ ^0 N# n/ F, n
4 ~! m2 x: u' F& u2 \' g- P/******************* Bit definition for BKP_DR17 register *******************/: e$ F: H8 }. b) Y
#define BKP_DR17_D ((uint16_t)0xFFFF) /*!< Backup data */4 u/ D% m- s) H, `. O8 A3 B
4 y6 T$ n# L$ u/ m9 b/****************** Bit definition for BKP_DR18 register ********************/
% r2 k5 M X; n4 B2 H: }0 J#define BKP_DR18_D ((uint16_t)0xFFFF) /*!< Backup data */
; d) ^! i! K: }
5 ^; R+ s) ~* g! B9 |3 b/******************* Bit definition for BKP_DR19 register *******************/; F0 k* u( t! c# S; A2 {( ]
#define BKP_DR19_D ((uint16_t)0xFFFF) /*!< Backup data */
* A5 K8 r; n- p* G) l# r
* D. a! K( z* H) {( }/******************* Bit definition for BKP_DR20 register *******************/* n8 s, y/ {7 t* f
#define BKP_DR20_D ((uint16_t)0xFFFF) /*!< Backup data */
# [& G" z9 l9 f" f7 M' k% H2 r. p+ G* b, r' `5 `+ Q6 i# [5 T& T
/******************* Bit definition for BKP_DR21 register *******************/. P5 J8 o0 l3 j a6 m9 b
#define BKP_DR21_D ((uint16_t)0xFFFF) /*!< Backup data */
$ d( {$ e |* t
* T2 R* p4 g3 p: R" z) b2 A/******************* Bit definition for BKP_DR22 register *******************/
1 k5 e4 e' U0 q#define BKP_DR22_D ((uint16_t)0xFFFF) /*!< Backup data */% K5 @' J6 `, O, j1 ?! } p
1 h6 P' H9 f4 j- k$ H/******************* Bit definition for BKP_DR23 register *******************/2 T# o0 J) s* a
#define BKP_DR23_D ((uint16_t)0xFFFF) /*!< Backup data */
( P' E' [" n0 Y9 @, F" W
1 @9 M0 M6 T& }3 N$ L7 I/******************* Bit definition for BKP_DR24 register *******************/
4 s0 s: K( K1 N# }) `#define BKP_DR24_D ((uint16_t)0xFFFF) /*!< Backup data */
1 ^4 ~2 v& o, ` c7 X5 Y
' Y8 o0 X n a; [/ q! ^0 O r! } {/******************* Bit definition for BKP_DR25 register *******************/
6 W- b! Q; W9 B#define BKP_DR25_D ((uint16_t)0xFFFF) /*!< Backup data */) g: }9 o; P- e
* S$ V4 j* ^# M) ` F/******************* Bit definition for BKP_DR26 register *******************/0 m2 P% o# s H* ^6 _5 v: X
#define BKP_DR26_D ((uint16_t)0xFFFF) /*!< Backup data */) }9 P+ b3 G) U' |' x# \! X) d
$ j. j4 i2 b( T# B
/******************* Bit definition for BKP_DR27 register *******************/
/ t$ F, e# j; T8 ^#define BKP_DR27_D ((uint16_t)0xFFFF) /*!< Backup data */
( j/ ~9 W! |( D9 @4 b# }# Q" k! U5 ?; o" P* D
/******************* Bit definition for BKP_DR28 register *******************/
* x2 X, _8 ]' b% M0 G1 s2 l#define BKP_DR28_D ((uint16_t)0xFFFF) /*!< Backup data */6 U8 ^" f/ l4 }+ B6 m& M
" k1 W; f# K- X# @2 B0 |, T/******************* Bit definition for BKP_DR29 register *******************/7 d& e1 w5 U" Z8 W3 f1 I
#define BKP_DR29_D ((uint16_t)0xFFFF) /*!< Backup data */
; j' N9 P. I6 b: e: }
: ]: d- x" t+ s8 B! \1 J8 E/******************* Bit definition for BKP_DR30 register *******************/
; m) t) B7 J! V#define BKP_DR30_D ((uint16_t)0xFFFF) /*!< Backup data */5 v* i9 n; ^8 g& b3 ^% w. n, \
0 z @8 }8 j/ g( ^7 H/******************* Bit definition for BKP_DR31 register *******************/8 a$ p- ]& J4 j% H
#define BKP_DR31_D ((uint16_t)0xFFFF) /*!< Backup data */1 [5 r% q. S/ z1 `7 a8 h
( j2 O/ K. |: n: ^/******************* Bit definition for BKP_DR32 register *******************/3 l. G7 S1 R* }' S& Q8 ?! X/ U
#define BKP_DR32_D ((uint16_t)0xFFFF) /*!< Backup data */
% h) z2 \/ B% Z u- d }6 _8 E3 \8 s3 r6 }5 v
/******************* Bit definition for BKP_DR33 register *******************/
+ {* g5 @. U1 r; |/ N1 R#define BKP_DR33_D ((uint16_t)0xFFFF) /*!< Backup data */" E7 W7 p8 d; E: p8 J4 U
. O7 G- Y5 L' l5 t p7 K' ?3 v% `" ^/******************* Bit definition for BKP_DR34 register *******************/
$ g$ l1 h) }, u5 o6 D% j3 k#define BKP_DR34_D ((uint16_t)0xFFFF) /*!< Backup data */# ~+ W, k3 o. O
: O' t) p# ^0 k% Q
/******************* Bit definition for BKP_DR35 register *******************/
, q' g1 F3 P" r L$ K' u& @#define BKP_DR35_D ((uint16_t)0xFFFF) /*!< Backup data */9 D& U; R/ x) k6 O* H7 ]2 I
: w4 l- d& Z& R1 Y/******************* Bit definition for BKP_DR36 register *******************/0 @4 u7 x* O& ~ V; E- d
#define BKP_DR36_D ((uint16_t)0xFFFF) /*!< Backup data */
+ n# o/ j, c7 V' S8 z, L
1 W+ v2 h! T% b+ y$ y8 b2 X' a0 I a/******************* Bit definition for BKP_DR37 register *******************/6 E' M6 F! r. T$ M9 ~3 _
#define BKP_DR37_D ((uint16_t)0xFFFF) /*!< Backup data */5 x5 b( B4 e$ C7 k
5 s7 o/ _8 ^- J6 O( }) ^ \
/******************* Bit definition for BKP_DR38 register *******************/
1 w& m4 `) y' N2 ?+ p4 h#define BKP_DR38_D ((uint16_t)0xFFFF) /*!< Backup data */ w g# k* y% a' Q% g
2 r; V5 h; u7 [" f) q: ^; I
/******************* Bit definition for BKP_DR39 register *******************/
. ]' u% i. H9 y4 x7 a& l8 E ]2 m2 g#define BKP_DR39_D ((uint16_t)0xFFFF) /*!< Backup data *// l( K% j/ T& X* [5 n& i9 p0 q0 ?" m, k! Q
8 ~: V# y- e% }% y% Q' T/******************* Bit definition for BKP_DR40 register *******************/ v# O; G7 L0 _# u G
#define BKP_DR40_D ((uint16_t)0xFFFF) /*!< Backup data */
. [$ J9 i& m! P4 r F: F) O, m5 n2 N% I9 s
/******************* Bit definition for BKP_DR41 register *******************/
; T1 p, D4 S/ V; I# ]: B$ @/ ` t#define BKP_DR41_D ((uint16_t)0xFFFF) /*!< Backup data */
" v; e; H0 k0 a. F7 h- v i T6 g" @3 F4 X. e9 U, q& D& s
/******************* Bit definition for BKP_DR42 register *******************/5 E. A* q2 V0 `6 ?1 ^1 k# V0 s
#define BKP_DR42_D ((uint16_t)0xFFFF) /*!< Backup data */7 l: B2 e4 m5 x6 p8 k& ~
1 f( |% q. A3 K+ B+ Y& _2 u
/****************** Bit definition for BKP_RTCCR register *******************/
5 i7 z4 w! \4 z, h8 c7 ?! x# T* J/ C#define BKP_RTCCR_CAL ((uint16_t)0x007F) /*!< Calibration value */0 a1 E9 j2 N2 c* ^
#define BKP_RTCCR_CCO ((uint16_t)0x0080) /*!< Calibration Clock Output */
- H. D `2 b; R3 H$ q3 O% J# k5 I#define BKP_RTCCR_ASOE ((uint16_t)0x0100) /*!< Alarm or Second Output Enable */: {) D$ Q: |1 `: M$ k4 b% e: I
#define BKP_RTCCR_ASOS ((uint16_t)0x0200) /*!< Alarm or Second Output Selection */
. O& M# y+ D0 x: `8 ]5 b# R6 j: {. \' r' n3 f
/******************** Bit definition for BKP_CR register ********************// t0 J" Y {: J9 a/ B
#define BKP_CR_TPE ((uint8_t)0x01) /*!< TAMPER pin enable */0 ? O: n' t( ~' M
#define BKP_CR_TPAL ((uint8_t)0x02) /*!< TAMPER pin active level */0 Z2 y. F5 a1 a1 H6 I4 _: j1 A
+ c* q: m& F" k+ k+ d$ j0 x
/******************* Bit definition for BKP_CSR register ********************/ F O2 V4 L4 g& c4 P. a6 f6 @! |
#define BKP_CSR_CTE ((uint16_t)0x0001) /*!< Clear Tamper event */
& c2 w1 X- G, \* z; E2 d#define BKP_CSR_CTI ((uint16_t)0x0002) /*!< Clear Tamper Interrupt */
! Z9 i( k4 a" j. S1 m#define BKP_CSR_TPIE ((uint16_t)0x0004) /*!< TAMPER Pin interrupt enable */
5 D! D% I+ {' w0 f, G0 ?8 j$ q#define BKP_CSR_TEF ((uint16_t)0x0100) /*!< Tamper Event Flag */: L" @1 D% J- y9 M0 n( x& C: l
#define BKP_CSR_TIF ((uint16_t)0x0200) /*!< Tamper Interrupt Flag */
* ^* v1 r* i/ \7 d5 g4 I& a; u4 J0 l7 _3 B5 _: S2 c
/******************************************************************************/- ?0 W# @6 |) K- ^( `
/* */
# a1 H0 @4 j5 S/* Reset and Clock Control */
3 g; L7 D. `8 C4 I0 o7 V7 W9 F/* */1 R9 d+ f. E/ g0 Z4 h: V5 S! @% m7 T
/******************************************************************************/
0 G5 n. C& d- ^" g8 N& [8 y L2 B* P6 h8 ] Q, }# O
/******************** Bit definition for RCC_CR register ********************/
& L% } B7 g4 K, ]; `#define RCC_CR_HSION ((uint32_t)0x00000001) /*!< Internal High Speed clock enable */$ N) J, x& i6 L; p3 ~2 J m
#define RCC_CR_HSIRDY ((uint32_t)0x00000002) /*!< Internal High Speed clock ready flag */: G9 t% r/ X$ |( @9 n/ A, v1 Y
#define RCC_CR_HSITRIM ((uint32_t)0x000000F8) /*!< Internal High Speed clock trimming */
" i& a i/ O! N6 F, v4 u1 E" I6 q: M#define RCC_CR_HSICAL ((uint32_t)0x0000FF00) /*!< Internal High Speed clock Calibration */
, D9 a3 G! w' b#define RCC_CR_HSEON ((uint32_t)0x00010000) /*!< External High Speed clock enable */8 }5 W! R. X/ h
#define RCC_CR_HSERDY ((uint32_t)0x00020000) /*!< External High Speed clock ready flag */
* Q# [4 [9 u1 l2 ?#define RCC_CR_HSEBYP ((uint32_t)0x00040000) /*!< External High Speed clock Bypass */1 W9 G D& J. n" D
#define RCC_CR_CSSON ((uint32_t)0x00080000) /*!< Clock Security System enable */
% F0 k, Y( k; j* w( ?* N#define RCC_CR_PLLON ((uint32_t)0x01000000) /*!< PLL enable */
1 w x( `" i; C0 B# S* b0 K; M#define RCC_CR_PLLRDY ((uint32_t)0x02000000) /*!< PLL clock ready flag */
7 f% E) k3 S; R: O$ V# x9 f& X: g3 n) x" b: v% W0 s
#ifdef STM32F10X_CL: n* o, O" R0 I/ C9 i4 ~
#define RCC_CR_PLL2ON ((uint32_t)0x04000000) /*!< PLL2 enable */' l H3 j7 `8 F) a& s, k
#define RCC_CR_PLL2RDY ((uint32_t)0x08000000) /*!< PLL2 clock ready flag *// N# G! b& |# j9 L0 z( ^0 @
#define RCC_CR_PLL3ON ((uint32_t)0x10000000) /*!< PLL3 enable *// ?+ X! t" ~) m
#define RCC_CR_PLL3RDY ((uint32_t)0x20000000) /*!< PLL3 clock ready flag */
9 F j: @; f5 V7 I. T+ T: Q#endif /* STM32F10X_CL */
. f& Q! G, F O7 \3 A) u& @2 c3 c/ {% ]6 S5 L* C
/ i$ {; p, Y6 m
5 }; ~! {7 ]7 B. j1 O ——————————————————————————————————————————————————— ——————————————————————————————————————————————————— 截止到目前为止。这个头文件应该注意的都已经解析完毕,剩下的就是相关控制位的定义了。! k; W& B2 J% x8 N
|