你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32F2系列外设设置规则

[复制链接]
STMCU小助手 发布时间:2021-12-4 17:03
外设设置规则:
: F% T8 a2 e- d在配置之前必须添加外设的.c文件,以及相应包含的.h。.h文件在stm32f2xx_conf.h中添加。
$ E2 ~& E! x2 K( ^& m8 M# g* ]) {* F9 H# ?
1、  时钟设置:包括引脚时钟和外设时钟:
3 x8 j& m1 u6 e) d0 X- m0 G' S# J6 Z; ?8 O
RCC_XXXPeriphClockCmd();
9 h  O( S3 k  ~( N1 E; ?( ?0 O5 k7 p7 k/ T) Q# J& t2 Q7 V, n( B
2、  引脚连接:即把引脚和外设功能进行连接;% j% |" c) c' w! G. E: ^

; o1 N7 y0 Q1 p$ l- Q4 v# qGPIO_PinAFConfig();( k# L! _% k+ A
( E- G7 ^* d: [& Q
如下功能需要引脚与外设连接。
6 L' y% \: Z$ O4 f8 J; x
) i, U. w/ Y% ?: `( N1 p* b, b  *     @arg GPIO_AF_RTC_50Hz
+ f0 ]" \! T' |( x# S1 J; _2 D9 |- Y
( n+ U1 h8 ?  d! {  *     @arg GPIO_AF_MCO) Z) P3 p  V1 ]8 h  H

& T& w2 z0 S6 D2 z1 r+ }- I  *     @arg GPIO_AF_TAMPER1 Y8 \! S3 ~( T- B- ?% k
1 ~* H, S5 S. X. j' e
  *     @arg GPIO_AF_SWJ0 y/ Y8 \/ o3 Y' y
/ ~$ _5 [9 A" }
  *     @arg GPIO_AF_TRACE7 H# M! ]/ B5 x" E
. y" e' y8 _; i1 P( T
  *     @arg GPIO_AF_TIM1% Q. A+ [4 _( a. J% L

% j, Q' r% b6 a6 V* B  *     @arg GPIO_AF_TIM2
7 p; \  P5 a1 \6 U( z2 A
/ W6 e* Y! b, S. g, l, t  *     @arg GPIO_AF_TIM35 R0 H, [0 h7 m+ j$ a- E
, k: k) J  T# E8 g7 Y
  *     @arg GPIO_AF_TIM4
' G# S4 m: O9 `* E0 ?5 e: m" o; D1 }: _4 ?3 M  s  j
  *     @arg GPIO_AF_TIM5" c! f- I7 n, d" I& t8 O6 k
! j4 ~- q5 A7 E6 @" U  `! O
  *     @arg GPIO_AF_TIM8
7 Y9 k; M7 U# h3 D0 I
6 b1 h3 I% i7 I4 W2 {  *     @arg GPIO_AF_TIM9
. ]0 J! Q$ g6 P- O2 w
7 G% U- T) _& |9 s  *     @arg GPIO_AF_TIM100 }& p" U2 G; k+ b! j

: s# h, g; Y% Z  *     @arg GPIO_AF_TIM11
- \/ S: }8 @. v9 j' j# t
. N1 B6 R6 s( O8 v  *     @arg GPIO_AF_I2C1% K. d8 X  [! G5 H& ^' c6 o
: R* T4 G7 l/ q3 S& L) h
  *     @arg GPIO_AF_I2C2
3 G) `/ M4 [, E
6 l+ |$ i9 g) B( m' o! i  *     @arg GPIO_AF_I2C3* T! ~' n0 I: X& G' h: I

- ]" F$ W1 ~0 f9 e* F  N# A  *     @arg GPIO_AF_SPI13 x5 K6 a9 n0 W$ h0 P

+ S9 W2 l1 e" V+ ]2 z  *     @arg GPIO_AF_SPI2! k; `) K& [& _! c" E: q

6 y2 Q( |1 m& `) `6 U6 I  *     @arg GPIO_AF_SPI3
, N/ u9 R" F$ k$ v
8 m  h9 m8 x, A! x  *     @arg GPIO_AF_USART1
& Y, B  O7 ~9 J  w: r: K% X$ o- C! s5 ~+ h# {1 G8 H- E' _( D! f
  *     @arg GPIO_AF_USART2) I5 ?/ S2 o+ n3 Y3 S
# }' P! X* X: T' l2 D
  *     @arg GPIO_AF_USART3: t6 |" [. H& o; K! \' B, ?. t6 p
1 u3 v% g1 m) D5 _+ r, }" l' h
  *     @arg GPIO_AF_UART40 P/ V+ s; u5 m5 \- Z5 E

* f7 i7 l" L1 ?$ M( X7 {  *     @arg GPIO_AF_UART56 I) ~' _& P, M/ G- o6 B3 U
" ]+ t" f# a7 T( f  k# x
  *     @arg GPIO_AF_USART65 ?- n* f, G+ ^7 n8 f6 x

' v$ w  L& T0 e6 k  *     @arg GPIO_AF_CAN1
2 l1 N* r; k) e8 \
6 e. @6 u1 k# m# J  *     @arg GPIO_AF_CAN2) @6 @: G: e  X  P1 z. y
+ a' j1 s+ {6 r9 G3 r! d* a" t! n4 H
  *     @arg GPIO_AF_TIM12
! T9 o* ]0 v: p
6 t; U4 u9 g3 L7 ~" N1 d  *     @arg GPIO_AF_TIM13$ l7 Y) V0 h, `$ q8 z

+ W! \- d- G6 h1 \  *     @arg GPIO_AF_TIM14
% P1 p+ H' P* D! D: u2 `" z, _8 t8 D7 \" d# y: }) y+ ]
  *     @arg GPIO_AF_OTG1_FS
* ]- n3 T7 W7 _! h1 t+ N
# F; ~  o- T: m- W0 k& |  *     @arg GPIO_AF_OTG2_HS9 `( S3 x- R1 B; h- }/ q) i, U
8 K7 c6 p0 y& u! H" n8 a" _& n
  *     @arg GPIO_AF_ETH* e, v2 d5 U. U! \

' ~$ B* V9 H. e! ~% c, G  *     @arg GPIO_AF_FSMC) O$ [" x/ D" D5 w& \9 P9 x* M
  K/ T; f. V. K  }
  *     @arg GPIO_AF_OTG2_FS
3 f, ^: H" W* g2 w+ a0 \! H3 x1 U7 M5 }' b' {
  *     @arg GPIO_AF_SDIO
5 X2 t) b5 z( h" X6 G" e" j3 C! ]- T2 X
  *     @arg GPIO_AF_DCMI
% j; b% G4 t- s2 D0 O: A% e" y4 k
  *     @arg GPIO_AF_EVENTOUT
/ o+ P" x, t8 \, |4 F
! E7 d) w! [0 r, T3、  初始化GPIO配置:! b: H3 ?1 H1 Q+ o0 v

3 Q+ f& V# Q' v1 }GPIO_Init();
" P- y4 x6 Z& w9 m" I# l& Q
/ v! z4 E3 i6 L3 N' c; `4、  外设初始化:' P& U  r5 J* h' }

' _0 f6 A$ M4 K如UART初始化如下:: h4 D9 N" ?5 K6 h

8 {! @: i/ D) U. u/ Y: q: }
  1. USART_InitStructure.USART_BaudRate = 115200;
    * [0 [- r8 k& y

  2. 2 n: W* \+ l# E4 j3 f& |
  3. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    5 N6 d. C) m5 _  W4 w. t2 [& e7 z

  4. " M% Z! m2 }( ~9 V* g" P, m
  5. USART_InitStructure.USART_StopBits = USART_StopBits_1;
    " }. e9 N% j; T2 G4 }1 W& S
  6. ' c% ~2 ?: W1 ^" {7 o5 l3 i) _
  7. USART_InitStructure.USART_Parity = USART_Parity_No;! z) w8 x0 O$ I0 B" `, D3 u
  8. ; k& L! T. S/ E* B' T: N" ~% w' Z! c  w
  9. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;/ f: w6 L2 V; m1 r9 p8 H
  10. 3 }) t1 k2 }7 ^% z: ~' v
  11. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    4 s5 v& I; Y! _

  12. * a1 a( ^9 c( h
  13. USART_Init(USARTx, &USART_InitStructure);
复制代码

# M( d* S: l* z0 K: [# [. A. ^  @6 L# y& l: @6 i8 e0 o9 k
ADC初始化如下:(多路模式)
! g! o. d& x, n) t2 I0 q6 a* `% a' e1 I8 R* z& S  s
  1. // DMA1_Stream0 channel0 configuration **************************************/( e9 x# `0 j6 n8 X$ s
  2. 2 E. g1 l  v' S* A" w+ E* z1 b
  3.   DMA_DeInit(DMA2_Stream0);: E, ^5 C+ y6 k6 g) U
  4. / @% p0 s4 [. Z- ]. K% e) I- ^
  5.   DMA_InitStructure.DMA_Channel = DMA_Channel_0;
    3 R. e% L7 O2 S5 K
  6. % }$ k1 r6 t, T( g
  7.   DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_ADDRESS;    //定义外设基址8 b' n+ m6 i) J% y6 K% p

  8. # w& o, S! \6 Y) b, T' ~1 R
  9.   DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADCConvertedValue;  //定义寄存器基址
    ; t; D+ W4 e; Y# b
  10. 6 I! G" O! Z6 x# y
  11.   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;                               //定义DMA传输模式从外设到内存
    : {1 X/ n! Q; f' K" V' t( \& ^/ t3 H
  12. - q5 C2 `2 ]1 Z( d
  13.   DMA_InitStructure.DMA_BufferSize = 4;                                                                              //定义buffer大小,根据通道数来定% t6 A, h( _: b6 G+ z6 Q: r

  14. . N+ I( ~! s3 v# R) Z) }/ n
  15.   DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;                    //外设地址寄存器不变
    ' F8 K6 b; U, T! ^* X

  16. ) ?7 f' Z- r  E3 W- r) `8 c
  17.   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                        //DMA寄存器随之增加(单通道不增加)
    # P' O6 P+ }1 r2 ~/ w) k" j

  18. 7 I* ?; F' \- A3 h0 v( y
  19.   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;    //DMA外设数据大小,16位半字
    : [/ Q1 }5 H0 R& W4 j7 K9 I
  20. 5 t1 L$ E" P; h/ n5 X# O) a1 U
  21.   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;           //DMA存储器数据大小,16位半字" D  i  S+ G1 H# q. }2 i1 R
  22. # c$ D$ e% Q  C
  23.   DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                    //模式为循环模式3 H* w7 t2 O) U6 g

  24. 8 @2 S) {: c! I& S5 p) o' ^
  25.   DMA_InitStructure.DMA_Priority = DMA_Priority_High;                     //DMA优先级高! W1 X7 J0 \) u

  26. 0 ~5 \: m+ f, H% Z9 |5 O  ]7 k
  27.   DMA_InitStructure.DMA_DirectMode = DMA_DirectMode_Disable;       //直接传输模式无效  DMA_InitStructure.DMA_FifoThreshold = DMA_FifoThreshold_HalfFull;8 y2 V9 E" L% C# F4 U" ?

  28. - W. c0 P0 y  T+ ?
  29.   DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;; `2 ]- Q7 r: O4 R+ ^; d
  30. # X4 M0 J5 c; g- v  r. {
  31.   DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;+ g* F0 y. v* t) t
  32. % E# x& u2 O, u
  33.   DMA_Init(DMA2_Stream0, &DMA_InitStructure);
复制代码
  1. //************ DMA2_Stream0 enable ************/( P4 E' X; V2 w$ G
  2. 7 x4 z1 p; T! c4 N1 b# b! c
  3.   DMA_Cmd(DMA2_Stream0, ENABLE);                          //使能DMA流0
复制代码
  1. //***************** ADCs DeInit ***************/
    7 ]' p$ D# D( v' i" Y

  2. " i" I. o6 f- Q& p
  3.   ADC_DeInit();                //ADC重初始化
复制代码
  1. //************* ADC Common Init ****************/
    % B4 q' ^* i. v) Y& o
  2. 5 o# z7 C4 S" P) S. A- V9 l
  3.   ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;       //ADC独立模式% K$ x* H0 ?$ i
  4. ! a* Z! w, n1 H( V
  5.   ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;                   //ADC采样周期2分频
    3 R+ w" ]' G2 Z& e. ?) P
  6. + h& c# @6 m7 T2 W) s- K
  7.   ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
    ) D: m) J1 O7 o' p# c% P

  8.   t+ T% l. @6 r- k, R$ N
  9.   ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles; //采样周期
    0 p+ \: ^3 L0 t$ I' Y

  10. 5 h$ A% _9 |1 D+ |  E9 y
  11.   ADC_CommonInit(&ADC_CommonInitStructure);              //基本初始化
复制代码
  1. //*************** ADC1 Init ********************/
    ; E( G- }) v; c5 Z. d) k4 g7 t
  2. . l  M1 X$ l( V9 G' x) c4 K6 O
  3.        ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;                  //ADC采样精度0 O' i- M; i; l" t
  4. / Z4 g7 U& M7 @6 ]
  5.        ADC_InitStructure.ADC_ScanConvMode = ENABLE;                         //采用扫描模式,因为多路5 j3 x2 j7 n1 {0 Z" p
  6. $ P8 y3 V; k3 F  F% J
  7.        ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;            //连续扫描模式
      h" g2 o1 Z" K& ^
  8. - C: `3 l4 U2 c$ u5 h  F. `/ d3 r/ `
  9.        ADC_InitStructure.ADC_ExternalTrigConvPolarity = ADC_ExternalTrigConvPolarity_None;//无外部触发
    2 [% u& t# v1 }0 Z+ t7 Z
  10. # |, J5 I2 G: P% R1 p* H6 R) w) `
  11.        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;                           //数据右对齐9 y) ~6 M  C$ ]% ?& X6 Q
  12. / M7 F: g& S# t( a  W5 [1 x% P5 B
  13.        ADC_InitStructure.ADC_NbrOfChannel = 4;                                                 //采样通道数
    ) u( b, M3 W5 x/ _% G4 z+ x

  14. + N7 I9 l; F5 _& ~
  15.        ADC_Init(ADC1, &ADC_InitStructure);
复制代码
  1. //************ ADC1 regular channel12 configuration ************/
    # ^5 N; o. K2 Y+ ~, t6 @2 S
  2. 0 [/ q( \) P6 I" g3 ?
  3.          ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_3Cycles);
    % K4 {0 `$ M9 D% r2 x
  4. 5 \; r& x0 y! R& B) q: {( j
  5.          ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 2, ADC_SampleTime_3Cycles);0 Q  O9 W. h: ^+ S- m  z
  6. 0 y+ n) W  A1 J* d
  7.          ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 3, ADC_SampleTime_3Cycles);0 Y* B/ L( j6 R- U% M: h5 X

  8. ) I& ^3 ]1 Y0 j: G' T# R( S5 t5 y8 D
  9.          ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 4, ADC_SampleTime_3Cycles);
复制代码
  1. //********* Enable DMA request after last transfer (Multi-ADC mode) *********/
    6 Q" B' F! }* S' |

  2. 4 g  g( U; l, X9 g7 B. e# n2 ]: r4 M
  3.        ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);
复制代码
  1. //*********** Enable ADC1 DMA ****************/
    # m# j. Q+ B+ }: l/ A* p7 z% a
  2. % t; G& d! t; P( `2 V: S/ N
  3.        ADC_DMACmd(ADC1, ENABLE);' y5 O% R! i1 ]/ Q) X4 I/ o
复制代码
  1. //*************** Enable ADC1 ***************/8 l* [# y1 K, Z1 d/ h- W

  2. : F: h2 ~# A+ c: T: |! s
  3.        ADC_Cmd(ADC1, ENABLE);
复制代码

  1. ' u: b2 L; H% Q7 B
  2. //******* Start ADC1 Software Conversion *****/
    + }' V" F5 O" P' @" N9 q8 U" x/ B: F! d
  3. 5 O  F4 ?' I4 u- \/ n$ u6 X
  4.        ADC_SoftwareStartConv(ADC1);                       //软启动开始采样
复制代码

" w1 I: e- z2 z( L7 w$ J6 O
8 P" A7 k  V/ y" z1 j: L0 O5、  中端配置:/ B; u+ o, Y/ K0 y' Q% k+ o3 e

) y8 D' }* a2 U以下为串口中断配置:
4 u9 j4 q7 [+ E; `3 A& E8 a5 U9 P% p2 J
  1. void NVIC_Configuration(void)
    / Y$ E" n+ g& U8 z
  2. 2 D) N$ v" S+ j$ t, i
  3. {: ]1 j  b0 c: Y3 P

  4. ) }; v# G* i, z/ X- Z+ R
  5.    NVIC_InitTypeDef NVIC_InitStructure;
    1 k# d# a* |% ]( d
  6. , ?, B- Z; r0 n- k1 Z9 b( ^) G
  7. % [! V* O" M$ Z# F8 L+ W/ k3 g

  8. / E2 N8 T- G7 i7 {
  9.   /* Configure the NVIC Preemption Priority Bits */ % t$ r  n- M# ~& l; A# F
  10. 0 T: u2 v5 [4 n5 R
  11.   /* Configure one bit for preemption priority */
    5 v& z+ s- U5 x7 [6 J) T& m3 i
  12. / Z6 p) L9 W4 i  e) `) ~
  13.   /* 优先级组说明了抢占优先级所用的位数,和子优先级所用的位数   在这里是1, 7 */   
    $ V, k+ n3 `0 O% J6 t

  14. 6 X! a/ p9 |/ j$ `) R5 s
  15.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);              0 D- W; r5 W5 M! C$ l( B* H  c
  16. " M+ P, x4 c, |
  17. - S5 ~$ _& i  U- j
  18. & j: f! v* c! e
  19.   /* Enable the USART1 Interrupt */
    2 Y+ ?3 |0 q* u

  20. ) k( ~0 [- k+ ^5 O7 r6 h9 N
  21.   NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn;                                    //设置串口5中断1 x  |3 y" M5 `, L

  22. . N7 Q: l( T  Q( u
  23.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;             //抢占优先级 09 p. O5 ?2 b. F* `/ c. r; C! k- z8 M

  24. 2 ?& |( R/ a( x( O
  25.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                                   //子优先级为0
    1 I3 \5 X$ B# o1 C: k# s
  26. 7 K3 d) t& P; I& T! [' ~
  27.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                            //使能
    ( `0 h, f+ ]; V4 d- O! z# s

  28. . T4 j- Y  N$ m8 O1 Y: ]
  29.   NVIC_Init(&NVIC_InitStructure);
    1 f  _" G( E9 T
  30. 2 T# ~4 g* C  w+ L3 c- P  K- x# H
  31. }
    3 i; F, B8 ~8 D0 N0 Z9 Z9 B% s

  32. / a& f$ V) k. A2 k; C- a
  33. USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);           //使能接收中断0 R) X( k$ Q0 h3 E! E6 f
  34. + T! N$ D# Q5 t6 p: o" H
  35. USART_ITConfig(USART1, USART_IT_TXE, ENABLE);               //使能发送缓冲空中断. H( s8 x5 g. `1 ]! o! V9 \
  36. . \* V2 X. c3 `. }8 R/ E& |
  37. USART_ITConfig(USART1, USART_IT_TC, ENABLE);                 //使能发送完成中断6 s7 q2 h: m1 k% y
复制代码
# t* w& O7 H$ E" d6 Z
6、  使能外设功能:& E) M; K% H. n

( I" v3 C( y! p& s2 v# g串口使能:
. T2 n4 o/ U9 u: X2 U8 \9 L3 ?  _
  1. USART_Cmd(USARTx, ENABLE);
    # V2 ~/ Z+ P$ D6 y

  2. / L. M/ |9 H9 p  V7 }" O& Q
  3. ADC使能:
    2 ~1 d6 E2 p+ I

  4. ( s& d$ r9 q- S1 F3 d+ K
  5. ADC_Cmd(ADC1, ENABLE);) s4 T# h1 U9 ?: V1 s1 c* D
复制代码

% W) p4 y, P& W: K
0 R( w/ x2 X4 c5 ~
赞 收藏 评论0 发布时间:2021-12-4 17:03

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版