外设设置规则:
+ z1 ]8 G# }* E4 o" f% ]8 T$ _7 s在配置之前必须添加外设的.c文件,以及相应包含的.h。.h文件在stm32f2xx_conf.h中添加。. g: @% O& V Q. J" d, q. J$ a
4 G) ^( k! ~$ P$ i0 Q9 X% \$ z
1、 时钟设置:包括引脚时钟和外设时钟:; u% v6 v, {, C
; V) y' [0 Y- e4 Q2 ?6 w
RCC_XXXPeriphClockCmd();
) R# u% V! j* e) ?0 Z# a$ \ w# Z/ j: I" i: a, a$ [ S
2、 引脚连接:即把引脚和外设功能进行连接;% k0 a# R% f+ C; H7 B
0 @& {% t: d+ W
GPIO_PinAFConfig();
+ p" p ^7 Q% R! I$ V) @+ h4 d
2 ?5 E4 e; s3 c' y5 J& v! X如下功能需要引脚与外设连接。) k$ S+ K2 ~; j. F
4 o' G9 ?* } n" v# e6 b3 k
* @arg GPIO_AF_RTC_50Hz$ X- Z: m. Q; `- v% q
& o- |; e8 D& ^* n: d" V0 O" p
* @arg GPIO_AF_MCO* A# s; h' D9 c" @& ^. b
; K+ i1 f* H, {, k9 U. Q' j * @arg GPIO_AF_TAMPER
' J# I. w. @0 v& G/ W0 @, r
% z; W- y9 F# e8 p8 s ]3 T * @arg GPIO_AF_SWJ/ I* ~0 s4 _' q/ y! b4 A
9 I* M: b! T1 v* o4 F
* @arg GPIO_AF_TRACE0 c3 {) z/ Z9 D( f9 Q
3 u2 \- y% m" J" H
* @arg GPIO_AF_TIM15 A' K0 W4 p+ a/ i3 H
1 x% m! ^# ?& V
* @arg GPIO_AF_TIM26 ], U8 A9 m% K
) V/ @- j+ V, z
* @arg GPIO_AF_TIM3
/ n& W7 d! a# E) L* |! {1 V+ q8 w+ s8 w' T" X( V
* @arg GPIO_AF_TIM4
2 H2 e4 l G; `7 K; t* a: M5 l$ D9 k W
* @arg GPIO_AF_TIM5+ _" | e/ W9 q
9 {+ I! S( v3 k# ]
* @arg GPIO_AF_TIM8
8 ?! Z" Q) M2 d& ^$ [9 u1 T0 N+ M3 O$ P; A/ b6 v; y2 B2 I
* @arg GPIO_AF_TIM9
6 [2 ?6 p. @9 s, V9 {
2 h8 y: x h* J+ l * @arg GPIO_AF_TIM10
7 { e2 R+ q9 n. t/ P6 t" a f7 W: g
* @arg GPIO_AF_TIM11
( R& e, Y$ [& d9 ?( q8 L
8 r! P0 A( o) g! S" t- v) M0 j * @arg GPIO_AF_I2C1: K8 e2 s; w7 Y2 D# c7 e0 w
* ]+ V( i5 a% U2 C
* @arg GPIO_AF_I2C2
. z$ g) v* Z1 P# N* y! ~$ x7 \, m3 i' b+ x6 V, r1 Z2 ?" E" |
* @arg GPIO_AF_I2C33 C$ Z9 X. M$ d5 W& {$ t
+ q8 T' c* M7 o * @arg GPIO_AF_SPI1
) \# v6 H. q. z) L" h( n: F/ Q8 F* a" i2 m6 K% }
* @arg GPIO_AF_SPI28 G6 S0 r6 F; }7 o- r
4 d( D$ L0 I" H, Z. j
* @arg GPIO_AF_SPI30 y% \1 \8 Q- z+ n
. L" V1 f' _, c2 G
* @arg GPIO_AF_USART1
1 |$ V. d# `) Y" i7 P
$ t/ T* X: b: { * @arg GPIO_AF_USART2
7 e3 t/ |' S) `9 f. [* t
6 r3 r% k* ^; h5 W$ O( d8 k. Q/ Y * @arg GPIO_AF_USART3/ C9 Z5 g. n3 s# z
5 X5 |3 s8 D* P: W0 h * @arg GPIO_AF_UART4
5 N# y. Y+ P- d* m. E& |$ O8 n% T8 N$ ?- S" E
* @arg GPIO_AF_UART51 Z/ C* F# N/ I4 \* t
" S& M' u9 c' r( G6 y& o" Y V- T * @arg GPIO_AF_USART6
6 \4 Z3 u/ B- K1 X3 p7 P5 a$ B
+ |. h, h) |2 ^$ ~ * @arg GPIO_AF_CAN12 K( q$ D0 t5 `* z1 m3 @
! V+ n) Q- i k6 v4 W1 v2 Q0 I * @arg GPIO_AF_CAN2
t3 N5 i5 V: y. ~% d& [5 |9 u& ^; Y3 t0 s; o: w" j* j2 W3 \
* @arg GPIO_AF_TIM12+ O( F6 z$ w5 G- @# ^. g
& F) u( p6 x& y5 z; `. f * @arg GPIO_AF_TIM130 s0 @: `; N2 e: W+ U, v3 s6 r# y
% \! U% C+ O/ L* D: { * @arg GPIO_AF_TIM14
K, Y! n3 x6 G! \9 \9 r6 X
- ~; d7 Y: y L- ^- c# q' D0 o( r * @arg GPIO_AF_OTG1_FS8 s( ?3 j9 F/ H* u2 r/ n8 |
% E* W g: g" s, Y8 l: z
* @arg GPIO_AF_OTG2_HS& T$ @+ z2 y- j: f
7 V% x' v% S* n% u9 I& m
* @arg GPIO_AF_ETH( h8 D+ j# T: s9 U4 t
- Y) S' P& {1 k3 H- A6 d * @arg GPIO_AF_FSMC
3 B& i) b, ~( J0 e' |2 B' L) l/ m* x6 G- U( o A3 \& M: H% y% p# W
* @arg GPIO_AF_OTG2_FS2 M4 L" S3 E9 X4 U- \& B0 V
& Z0 ^; V5 T; _9 z1 H; J( ] * @arg GPIO_AF_SDIO
6 s* [ P& v" u3 g) v4 N" ~3 u `3 Q& _4 u* N2 \( ^+ H
* @arg GPIO_AF_DCMI
: ~# C0 R" r% o+ h) q1 P8 u* m" d7 `) E. t
* @arg GPIO_AF_EVENTOUT
K" E" |- y0 |& }* P4 h/ U) U5 a. W+ C9 d. _! `( S7 w
3、 初始化GPIO配置:
/ O. T7 P& D8 I1 @( @5 v% \$ l1 Z0 j2 X9 k1 |$ [! U' U
GPIO_Init();
1 H b7 W4 ]7 t+ ]3 L$ o2 M6 ?8 v( w: R- x" ~6 A F
4、 外设初始化:6 G/ s6 c- M, |# L4 m/ t. T- K1 |8 P; C
% S$ Y4 R# {" L2 U5 g0 }. V. `
如UART初始化如下:9 _" O( {2 `+ w7 a. m5 q# A) n
, e1 ]0 a7 D% E2 T. { O: K9 M- USART_InitStructure.USART_BaudRate = 115200;1 z4 |. S, @% g* n- M
8 I- `7 O8 w0 T' P. u4 z1 x& r; A' U* B- USART_InitStructure.USART_WordLength = USART_WordLength_8b;! @' t; Y' m7 N9 |: S' z" g
2 h) E$ L. Q+ a8 t- USART_InitStructure.USART_StopBits = USART_StopBits_1;
1 r) _, S5 ~" v+ J! }% D - 5 y: q- a8 [8 w1 h+ H% `6 R' k9 y
- USART_InitStructure.USART_Parity = USART_Parity_No;5 Z$ T1 m! T7 Q* Y$ {" g% a
- $ J0 R$ E! V- b9 v/ d
- USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;& Q/ W: [/ K& O# l
- ' [; N" g2 w7 r# ~ G: F
- USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;8 |' r4 [, A0 n9 K$ D/ s0 Y' F' Q
- : L1 |& i7 l* Z a. t! ]- a, W% y) C, B
- USART_Init(USARTx, &USART_InitStructure);
复制代码 , q% j2 \4 |( \' D/ G \, S
6 ?- H( K/ m2 R& z5 W% Y
ADC初始化如下:(多路模式)' R% S; O" W" ^3 [6 B+ U
! Q5 j. w, }/ N
- // DMA1_Stream0 channel0 configuration **************************************/$ B- J3 }6 o1 u
% d0 ]: {+ r8 Q" V+ y- DMA_DeInit(DMA2_Stream0);1 o$ I3 W) } l0 G7 o
) u+ d0 {( q. h% K- DMA_InitStructure.DMA_Channel = DMA_Channel_0;
0 {+ Q) q! }* u( E3 I8 }1 X - ' |- l2 L/ ]/ m Y6 y
- DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_ADDRESS; //定义外设基址
2 H3 U. H9 C9 ?0 l, B% y" o# a
5 V( Z. `. U1 A# d- DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADCConvertedValue; //定义寄存器基址& Q5 o3 y# [: L
- 1 s; i( f; ?) R3 }
- DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; //定义DMA传输模式从外设到内存
; J- s! T& N1 w" F0 \+ {. T8 U& b - & u) e* p. d* A* L
- DMA_InitStructure.DMA_BufferSize = 4; //定义buffer大小,根据通道数来定
) ]2 f) X2 j% t8 v- f/ h - + l* k3 n5 X% Q9 E0 ~8 z+ g
- DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址寄存器不变$ e" I! D: _" M5 F' z
! o) v' {: D3 h/ c1 F- DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //DMA寄存器随之增加(单通道不增加)1 B2 c+ d& E0 B/ B1 h2 J$ ^. k
7 { {% a& O' B0 O% P% Y8 a' I- DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //DMA外设数据大小,16位半字' s' s# A* g5 s8 {1 H) V4 K
^- M2 A0 Q+ `2 L- DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //DMA存储器数据大小,16位半字0 {$ S" a5 @0 v' u( a
# N- r: n1 a( @- DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //模式为循环模式6 E% y/ \* E5 W) S
( O- d [9 P7 T2 B& y# [- DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA优先级高
: E! L! _/ Y; E. R+ Q$ i) u" b$ c - ' i; ?6 B; w( o1 L# u) g T
- DMA_InitStructure.DMA_DirectMode = DMA_DirectMode_Disable; //直接传输模式无效 DMA_InitStructure.DMA_FifoThreshold = DMA_FifoThreshold_HalfFull;
/ E K+ t/ X; R# ?1 \7 F8 x
) Z6 o* {. E" s- DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;& O5 s2 g2 N( k+ a
- + |" H5 m, O4 t8 n
- DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;0 o t# D Y9 G5 O* _3 R0 o, G2 c
& l, r0 v* @; L+ f5 _$ |- DMA_Init(DMA2_Stream0, &DMA_InitStructure);
复制代码- //************ DMA2_Stream0 enable ************/" }" n/ [: [5 X P& B8 ~4 Q+ I( Z
; ^9 o4 ^9 K, b Z/ H4 l0 ^0 M- DMA_Cmd(DMA2_Stream0, ENABLE); //使能DMA流0
复制代码- //***************** ADCs DeInit ***************/
) T* f4 L; O m7 K3 c
% ^" e4 l9 N# _) H5 j" y" O- ADC_DeInit(); //ADC重初始化
复制代码- //************* ADC Common Init ****************/
, f% X1 G0 G7 z2 x% s( _ - : y5 O9 C2 i% v7 b1 T9 `
- ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent; //ADC独立模式
' N: M# Z4 V" W - 3 r# E! P4 o( a! M. l
- ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2; //ADC采样周期2分频 D0 X \# ]1 j9 |3 W
7 n' f+ W U4 B. Y$ G* x! ?- ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;2 i+ r, P2 p5 R8 B2 L" g1 `: h4 r
K( G. z; y" C' {: D- W6 F: b" D- ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles; //采样周期6 `6 x% {/ y, P! \$ {
- 9 i7 \. N% w2 K
- ADC_CommonInit(&ADC_CommonInitStructure); //基本初始化
复制代码- //*************** ADC1 Init ********************/6 l6 q, \+ \7 ?' A. _! d
' Y$ R0 p& `; V. U0 Y4 |. w, N, I8 U- ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; //ADC采样精度# S) v$ A4 t0 j& y
$ F; h* i5 c8 w& G9 b- ADC_InitStructure.ADC_ScanConvMode = ENABLE; //采用扫描模式,因为多路
( e5 A5 M& C0 r1 V' ?7 m - ' ?8 {5 ^7 F0 @; p7 U* ~0 n* B8 ?: @
- ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //连续扫描模式1 @- }- n/ j3 g' I
- S# K; v9 g) ]! w4 S y$ [- ADC_InitStructure.ADC_ExternalTrigConvPolarity = ADC_ExternalTrigConvPolarity_None;//无外部触发
, \& E; n, c; C - " ?/ C4 H$ L$ ^/ u% d' d' D
- ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //数据右对齐
k1 P7 S8 O" U0 R- \% ]: { - ' p3 i1 Z( N2 \( o1 G
- ADC_InitStructure.ADC_NbrOfChannel = 4; //采样通道数# M2 K3 ` c; W: O
9 w; U) _# A* _ G9 o- ADC_Init(ADC1, &ADC_InitStructure);
复制代码- //************ ADC1 regular channel12 configuration ************/
' {% d: _! c% _: { - 7 c" q+ U* Y( J1 w$ B6 x6 k
- ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_3Cycles);5 c/ q( N( a0 [. P
: n1 T) @3 w4 W' S% k/ m- ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 2, ADC_SampleTime_3Cycles);! E8 k# E. i8 h5 e
: n6 V/ _( ? D; q- ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 3, ADC_SampleTime_3Cycles);
" D! _9 d' I( ]3 o6 `8 f, g2 D
# ^ x7 H. g. _- ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 4, ADC_SampleTime_3Cycles);
复制代码- //********* Enable DMA request after last transfer (Multi-ADC mode) *********/ @& O1 D6 n" j3 c5 F6 `
- 9 H: U' N/ a) l9 I4 H% n9 A
- ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);
复制代码- //*********** Enable ADC1 DMA ****************/
& T* A6 }# I C) @" }8 Z4 M! t
( b T" c1 q, v& v- ADC_DMACmd(ADC1, ENABLE);
6 [# `" p) }, O3 D
复制代码- //*************** Enable ADC1 ***************/, X, l. K' i5 g( u I' F
- . a# D( c/ ^5 G
- ADC_Cmd(ADC1, ENABLE);
复制代码
! r1 k2 K/ T% X" O s" R |4 {- //******* Start ADC1 Software Conversion *****/
- B: H/ V2 R- Y3 a* p - 5 \0 y' ~* Q! I0 K; ?
- ADC_SoftwareStartConv(ADC1); //软启动开始采样
复制代码 i9 j6 U; |0 ]9 h2 r1 h
! `0 h8 n' P8 i$ K$ U
5、 中端配置:1 P9 R3 R9 s5 M- o
+ {+ |0 x( b5 t. X7 c, O
以下为串口中断配置:
" y/ W# m6 X ^3 H% o) q
! w1 V& ~3 k" F9 ]7 _& C0 L- void NVIC_Configuration(void)
6 f3 l2 B; S" f; C% f8 J( b
1 w! P T6 C1 i4 Q7 N- {
$ o6 Q. x/ e# R- V& w1 a+ W- ?" f: u- C
+ J( I% x' k4 J! ]4 q- NVIC_InitTypeDef NVIC_InitStructure;- t6 d# F' w) Z
( J, e9 P! @. z X: Z5 u/ J9 l* `4 ?
) I! H6 d& Y" G$ z8 V3 v- 0 [) M! W1 Y# o1 `2 U
- /* Configure the NVIC Preemption Priority Bits */
3 m7 L3 q }+ X9 y, L# @( P - 8 ^. x! U' j# K
- /* Configure one bit for preemption priority */ N: i% b% M0 F. g! q
- ( }5 ~3 V, L O+ U% c
- /* 优先级组说明了抢占优先级所用的位数,和子优先级所用的位数 在这里是1, 7 */
+ @6 O* }. q8 s7 }$ }% z+ |7 Z" E
' c' I) D! l) a- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
8 x- O, v, l1 y9 E+ B$ m% n# c
4 g" {4 T) X E3 s! _
* X0 Y+ @/ t( \' R
* {& E3 {+ W, q4 e- /* Enable the USART1 Interrupt */5 \) Q) K, m+ V! o" m4 {
- % }3 Q" T4 G3 C: w/ m+ q% ?
- NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn; //设置串口5中断
# P8 Y+ Z) a( P+ K3 y! v$ ~6 N
: z, m) q8 {! H5 c% P- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级 03 B2 y) L' g7 O
- 1 K5 `- F1 e- W" t8 f6 F- K6 c) M, X
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子优先级为0
! f1 J+ S* R0 O' ?! r$ V9 a% H - J, [# w8 j# d8 E ~
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能) o5 M& S; K* d3 F' C; q
- 4 \/ f. ]4 l0 d& T1 s. b' h) K8 R
- NVIC_Init(&NVIC_InitStructure);# _3 o& l3 }/ j0 k
% b: r5 R6 p: y' L! ]; W- }
) S' c# p4 d& c/ d: \% ? - , l; a. A" }! O4 G
- USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //使能接收中断8 [& ~, r; D1 @" G- Z1 j! X
# B% J5 v1 e D% \- USART_ITConfig(USART1, USART_IT_TXE, ENABLE); //使能发送缓冲空中断5 ~4 _9 S }0 e; t) R
( T0 p, C1 [; P- USART_ITConfig(USART1, USART_IT_TC, ENABLE); //使能发送完成中断
+ J" O' A T# e1 F
复制代码 : A& P) Y% K% ^* N( O% @
6、 使能外设功能:
% f M6 i2 Z+ I" q" q: [2 E& v% X4 l: ]- [/ J# N: {
串口使能:! _# a" l2 O) u8 k: Z: I* T
2 T( k& h/ Z" B* K& W7 V8 a+ e# T5 @
- USART_Cmd(USARTx, ENABLE);0 z2 j/ P/ o6 `1 G5 g- I& T
4 V+ i: Q& r8 T7 T- ADC使能:
. n; ^- `1 P4 Z - # F! s; B- h9 y5 M" i4 X% F0 D
- ADC_Cmd(ADC1, ENABLE);' c5 H! X" [4 `' @) @6 x
复制代码
7 O n0 Q) D9 Y* L! X8 e6 t) B) O* a+ d
|