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

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

[复制链接]
STMCU小助手 发布时间:2021-12-4 17:03
外设设置规则:
$ Q2 F# U- k. k- s在配置之前必须添加外设的.c文件,以及相应包含的.h。.h文件在stm32f2xx_conf.h中添加。% N7 T2 ~, e0 @' j- N5 Z, ]: l
# b8 [  O/ S- K! x  F
1、  时钟设置:包括引脚时钟和外设时钟:* J) |) ~/ `0 {  \' K8 x
* O9 C/ w7 q! R5 p( g: y, h) T
RCC_XXXPeriphClockCmd();
- C% q  T1 I4 c  F2 ^' ~
2 {0 c$ f; ]) r; l: n5 g& B2、  引脚连接:即把引脚和外设功能进行连接;- t- q! F) p4 o3 X. I7 p
" ^& O* Q4 X6 A9 t5 A4 D
GPIO_PinAFConfig();
) s1 |! R: r) h4 _+ P) U9 W& s) H5 a) ^+ M, k
如下功能需要引脚与外设连接。& l( e' d$ Y; A% u  T0 }* O, a

! {8 b' ~5 e% i  *     @arg GPIO_AF_RTC_50Hz, g# p" I7 w3 l; Q% x" |
( z/ X2 K2 y* O) U- T3 N
  *     @arg GPIO_AF_MCO& F& k2 X/ l* i! I" |% U  [/ }
' A: N" Z; t% g) |- C; g" {7 Q( ?7 I
  *     @arg GPIO_AF_TAMPER- V6 @+ l$ x) p9 }4 l/ O3 w: r4 v7 N
5 D1 u" g# K4 a7 D( v* u3 f8 |
  *     @arg GPIO_AF_SWJ
: G" Z2 ^& I7 G% K* ~/ J; K5 p
% e$ w% F, H$ w. l; X  *     @arg GPIO_AF_TRACE- R) E9 C+ _* t6 z
) l7 A3 V  c9 \* c6 b
  *     @arg GPIO_AF_TIM1" w- g3 t2 m2 b
) E" |. I1 ^$ c% T. t/ r
  *     @arg GPIO_AF_TIM2
% q& r) x) B5 U) g& a" C
' t# \' d5 q8 ]# c. b  *     @arg GPIO_AF_TIM3
8 I7 Y: [# h+ i8 o0 u0 ^! E& |/ Q, f+ [  V, Y
  *     @arg GPIO_AF_TIM4
) b/ ]; t1 R" k+ v' v# I% R  ~- W6 |7 J' {' [: _! N
  *     @arg GPIO_AF_TIM5
  B# Y% z3 N  ?, O* T+ U) B, d2 r% J) u. ]8 _+ U4 l1 G
  *     @arg GPIO_AF_TIM8/ F& r9 [% F- a

6 g- ]0 J' O, ?# o  *     @arg GPIO_AF_TIM91 x- w! m  R) [/ s$ ?( J

" I& D" Z( k# U& v' P8 K  *     @arg GPIO_AF_TIM10
$ P6 L( @, R- v+ n# x
8 p% A; c4 n( Z* D+ _9 i! {# m  *     @arg GPIO_AF_TIM110 F/ f/ t; T, r, P& b! C0 r
5 Q/ d0 x$ Z7 g7 g! V
  *     @arg GPIO_AF_I2C1
5 [1 N1 `# G$ o5 K! G2 W7 U6 P5 V+ Q# U  g0 D
  *     @arg GPIO_AF_I2C2
. A3 s3 R% L6 A3 t0 `) V2 O% q8 A! N! C) \3 _: e
  *     @arg GPIO_AF_I2C3! W# B$ `9 g" s) ^) g
; h8 t$ z! c3 B8 y5 D6 J0 S: m
  *     @arg GPIO_AF_SPI1; z- G; J. k/ Q( o8 M% S$ o

5 u1 p. A  L; E* h: k4 L* e  *     @arg GPIO_AF_SPI2
/ s" }- S, q: k, R% v, A
$ n& o4 E/ e9 M/ ^  *     @arg GPIO_AF_SPI3$ }+ J9 Z  H! V7 l
8 u* S# w/ u4 E3 T9 A$ T
  *     @arg GPIO_AF_USART15 ?, K! \5 Z0 p
/ [! t" `" Q' C( ]' \. C0 E9 i
  *     @arg GPIO_AF_USART23 }# {/ [  C. T  t. _, R# [
$ `  b$ H% }/ t5 Q
  *     @arg GPIO_AF_USART3
& U2 Z: @3 J" O' M6 f$ d
1 F. R# P6 ]. n/ [6 |  *     @arg GPIO_AF_UART4
- q% V5 B0 l1 ^- |/ |* V4 ]
' f6 L1 x! f8 W" r  *     @arg GPIO_AF_UART5
# {( [- W" E( c: N: v5 n( r/ P) n* V2 \& I: b0 L, E/ u
  *     @arg GPIO_AF_USART6
6 v& w. a& [& _) {4 N
$ |! L5 j( o0 I  *     @arg GPIO_AF_CAN1
& c* f- p+ O; p6 b/ d! |; `; t5 N6 J( [% w5 g
  *     @arg GPIO_AF_CAN2
% P. i/ J. L' a# B4 F: c4 J. a( S, R% x& v. b- C
  *     @arg GPIO_AF_TIM12
- W4 ]4 j% Y1 U& V8 c9 }  u
4 @2 f% Y$ ^1 ~2 ?  *     @arg GPIO_AF_TIM13  A5 B0 e2 e4 b" W" S
0 [* m2 w0 H$ i7 K" P, K
  *     @arg GPIO_AF_TIM14
- I) d( q1 x! j/ d9 p6 L  O2 w
5 p- ~3 K3 \0 U  b  *     @arg GPIO_AF_OTG1_FS
1 q/ r( j6 o: F9 j! g0 y$ I" k0 ]. S. I
  *     @arg GPIO_AF_OTG2_HS
% I. x  ^+ {/ ]  Y/ Y9 J0 D9 ^
, w7 _% i  @: i9 [1 s( p  *     @arg GPIO_AF_ETH; t) Y0 e& j+ o3 a' H& {7 [
8 h3 x8 M( i* s6 A( g1 t+ ~
  *     @arg GPIO_AF_FSMC
5 g2 s% k% m$ Y0 R; ^% g# S7 X! l2 b7 P' |7 A0 E7 t
  *     @arg GPIO_AF_OTG2_FS
& ?, a8 i- h. }, ]( j0 `; l6 s. B$ C% T
  *     @arg GPIO_AF_SDIO  f0 m, _; {8 y% W$ y  {; F  `
5 S' a6 S8 `6 ?
  *     @arg GPIO_AF_DCMI
6 ]7 g: G- w9 S; i3 s/ Z: o5 `' q. h$ {# {  b6 P- x( E
  *     @arg GPIO_AF_EVENTOUT
* e; Y1 F9 G& T/ W. N6 n' U+ S! [( a0 Y
3、  初始化GPIO配置:
% s& M( l! V6 i5 }0 \4 |5 O4 d
# i' y! I& a1 L+ E2 ZGPIO_Init();
6 i" `* c0 U; ~& M1 [+ h" @( s! J
4、  外设初始化:+ c- [. ?& c: }" Y( t

( R+ E7 A+ C) \; O  `: h" `: X如UART初始化如下:) P' M+ }6 j0 [6 Z" w$ E$ i, L

7 q# r1 {5 ]( H: J
  1. USART_InitStructure.USART_BaudRate = 115200;# u1 H3 Z$ B" E' l3 V! o
  2. 2 X& g  w8 E/ y6 l
  3. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    . x: T+ B7 x- ~+ R! [
  4. / b3 D) t1 S! m( D) }. M' u
  5. USART_InitStructure.USART_StopBits = USART_StopBits_1;7 V4 L* J6 ?& w

  6. : @0 f# s' H( ~
  7. USART_InitStructure.USART_Parity = USART_Parity_No;
    * O8 R2 j& B- @9 i* D: w# k

  8.   ?" o3 z2 E* n' N' _
  9. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;9 t! w7 [6 }4 w' u" r

  10. . E1 h9 R- o; }& k1 ^" Y, U: g
  11. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    6 s  w3 W" R, ^8 s& J2 @

  12. & ^4 G4 Z8 o" j: P
  13. USART_Init(USARTx, &USART_InitStructure);
复制代码

: k- M" ?. u6 L4 v5 I: `6 |. x# w$ [" l1 Q" C0 G- M+ r" i
ADC初始化如下:(多路模式)+ Q" g& N+ z* e  c

- ?* T  F9 c$ V3 R
  1. // DMA1_Stream0 channel0 configuration **************************************/
    / g5 Q) s+ Q1 m" _$ T! `
  2. * L, B) ~; H0 ^1 g* K9 u2 D6 j: `2 L
  3.   DMA_DeInit(DMA2_Stream0);
    6 t1 o0 |& O/ c
  4. ) q1 z; }: l7 E' M3 M5 d
  5.   DMA_InitStructure.DMA_Channel = DMA_Channel_0; ! b& J" A3 q+ F' D0 |

  6. / f3 @! F/ k: _5 P/ V
  7.   DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_ADDRESS;    //定义外设基址, A& w" K; `) s3 c- ?" |
  8. 7 @5 N* O5 a4 y8 X
  9.   DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADCConvertedValue;  //定义寄存器基址" e6 H' M( E' i5 h4 q
  10. : Y& z, }2 @, o5 T4 j6 T  F7 j
  11.   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;                               //定义DMA传输模式从外设到内存
    ! a# D% ~$ M& y6 _3 {  a. G% F* v
  12. 2 N4 P% @; R& x
  13.   DMA_InitStructure.DMA_BufferSize = 4;                                                                              //定义buffer大小,根据通道数来定: _, L/ Q# ^; Z
  14. # _$ v7 v, u4 X7 z) O: @
  15.   DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;                    //外设地址寄存器不变
    : P" W9 l. h) J& K
  16. - G% ^3 N4 z5 s" \) W
  17.   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                        //DMA寄存器随之增加(单通道不增加)
    . T  F2 A* K8 C0 B1 t9 b. B0 Z
  18. ) n5 p; C) n; g- i( l6 ?5 V
  19.   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;    //DMA外设数据大小,16位半字
    9 p8 i  k6 A2 O; M+ Z8 B7 z

  20. 1 J' L1 [/ b; Y1 u, [# c8 h# \
  21.   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;           //DMA存储器数据大小,16位半字7 [& K. R, o( |& o
  22. ' ?  V3 R& p% o
  23.   DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                    //模式为循环模式
    8 d  |9 `( n8 T% X, j
  24. 8 L  {$ ^5 e4 l8 t2 e
  25.   DMA_InitStructure.DMA_Priority = DMA_Priority_High;                     //DMA优先级高, j% p. V; V8 ]/ i9 O/ z

  26. 8 I3 t4 G: T% j# \# l% i
  27.   DMA_InitStructure.DMA_DirectMode = DMA_DirectMode_Disable;       //直接传输模式无效  DMA_InitStructure.DMA_FifoThreshold = DMA_FifoThreshold_HalfFull;: D, M1 b, x4 K! B  I1 a
  28. + R$ x9 r" d& x1 z* M( {
  29.   DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;3 k( O' O0 }. p$ I) Q6 \- C* y$ F
  30. % ?# `6 D: ]# R6 }9 x
  31.   DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;9 p) _& [/ f- M7 ~9 R

  32. 9 J  o. q+ T7 U7 i( ^0 v" p; {, o
  33.   DMA_Init(DMA2_Stream0, &DMA_InitStructure);
复制代码
  1. //************ DMA2_Stream0 enable ************/7 F; w4 Y- |/ L
  2. $ m5 x' e/ H# X: M! A. `6 c
  3.   DMA_Cmd(DMA2_Stream0, ENABLE);                          //使能DMA流0
复制代码
  1. //***************** ADCs DeInit ***************/
    & T$ i: F$ t% s9 i& E, s

  2. 4 @1 d) Z, x2 ~# ~3 t/ G
  3.   ADC_DeInit();                //ADC重初始化
复制代码
  1. //************* ADC Common Init ****************/9 {7 [# l* O% d/ ~- k8 p# J
  2. 3 ~: _# Y9 E* c
  3.   ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;       //ADC独立模式# V) J) j4 k+ q7 S9 u& @5 l

  4. 2 K2 t2 G* f- b9 P
  5.   ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;                   //ADC采样周期2分频
    * D% t1 O1 H) _; G% m
  6. 0 w/ _3 w1 L8 C; Q. S2 F) u
  7.   ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;. d' x) J4 b6 J% n# N

  8. ( R% F4 J, Y0 J* X$ v
  9.   ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles; //采样周期* g3 q0 @+ b  _' P! h1 \+ H) d
  10. 8 l7 K% ]& d$ W* Q' j5 y. L+ H& I
  11.   ADC_CommonInit(&ADC_CommonInitStructure);              //基本初始化
复制代码
  1. //*************** ADC1 Init ********************/  H# O. R7 p, n; w
  2. + L8 _' o( f1 J/ N& o
  3.        ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;                  //ADC采样精度
    4 c9 V& e6 [" U9 Z$ p: X

  4. 7 u$ y6 a, [5 E' r& G, ?
  5.        ADC_InitStructure.ADC_ScanConvMode = ENABLE;                         //采用扫描模式,因为多路
      v1 A( N1 A; B' G+ |: h) Q/ W9 `

  6. 3 [, F2 p. j) U$ C
  7.        ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;            //连续扫描模式
    9 R: [: Z- R9 h/ i: h# L/ F

  8. ! {, e1 ?8 `% F1 |- i% ]0 x
  9.        ADC_InitStructure.ADC_ExternalTrigConvPolarity = ADC_ExternalTrigConvPolarity_None;//无外部触发
    9 A, A) j1 T) i, I& k5 P, X. z$ f
  10.   @2 I; u) U  X
  11.        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;                           //数据右对齐
    : |- m' x  Y- |5 y- r1 a, H& I5 d

  12. $ R( i$ t4 S0 w2 {, [
  13.        ADC_InitStructure.ADC_NbrOfChannel = 4;                                                 //采样通道数3 V+ [4 P/ u) G4 a- M9 V
  14. ) m0 N. h) B( a# S/ B  q
  15.        ADC_Init(ADC1, &ADC_InitStructure);
复制代码
  1. //************ ADC1 regular channel12 configuration ************/
    + ]+ k& I) Q3 p9 |  Q) L% C
  2. 1 ^) @) p/ U/ ^) A( R
  3.          ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_3Cycles);! |6 Y5 `+ ^/ l

  4. 6 k+ l& O: ^% c: J( I
  5.          ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 2, ADC_SampleTime_3Cycles);5 t( |! O4 _& w# n7 Q; y) C

  6. , K) O7 x9 m& s; s  y- ^0 c: {
  7.          ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 3, ADC_SampleTime_3Cycles);  f. H( z7 P) K# c; x* e+ ]/ c

  8. 2 _( t3 r2 F9 R8 K, v# }( S
  9.          ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 4, ADC_SampleTime_3Cycles);
复制代码
  1. //********* Enable DMA request after last transfer (Multi-ADC mode) *********/3 d9 N2 y  ~) F' b7 ]' @% ^% Y

  2. : }) S$ {7 g" k# Q: r2 J
  3.        ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);
复制代码
  1. //*********** Enable ADC1 DMA ****************// b# K- N8 A- B' K/ q" y: @; H

  2. ) w, F8 f3 ~& q. L
  3.        ADC_DMACmd(ADC1, ENABLE);
    0 b: [) o8 i; l4 a; O
复制代码
  1. //*************** Enable ADC1 ***************/: Y7 W2 @' z9 O  U

  2. ) k: x/ C8 ~! U* X
  3.        ADC_Cmd(ADC1, ENABLE);
复制代码

  1. , e9 F8 P5 r! K# _
  2. //******* Start ADC1 Software Conversion *****/9 f8 D7 |4 Z% h" Y- ^) T2 u
  3. 4 J, Z( X% t) {8 k
  4.        ADC_SoftwareStartConv(ADC1);                       //软启动开始采样
复制代码

) p! Y* a5 f* u+ d* m: u+ T/ d& G4 ~7 p1 Y. Y& o( j
5、  中端配置:
' e: }! x: l0 {+ ^9 T& v( h4 H' B  Y. S3 P1 e) K& C" e* D2 e
以下为串口中断配置:# a: x8 e' Q" T5 U7 `' G5 R' d
3 `0 D# P/ H' d" q% h: x& T  A
  1. void NVIC_Configuration(void)
    0 u/ U: ^! o; p$ j$ ]$ X

  2. % M- Y5 ]* P2 p7 ^! P1 B" ?
  3. {9 n0 g( G% N& k0 u% M$ t
  4. " c* X6 {& i/ v, {
  5.    NVIC_InitTypeDef NVIC_InitStructure;# j; j' V8 W+ Y- H0 Z/ J  s

  6. & x$ l/ ^( c  E  w, X  V, _
  7. + @: p3 o  g% y
  8. # m/ L$ R5 @9 d! A
  9.   /* Configure the NVIC Preemption Priority Bits */ , M8 m$ v/ G8 Z8 g! e* g' M

  10. 8 o) `. g- ?' T1 D- s
  11.   /* Configure one bit for preemption priority */
    2 l7 j5 f$ S' P8 t
  12. ; K4 W% v" Z+ A. ]; l
  13.   /* 优先级组说明了抢占优先级所用的位数,和子优先级所用的位数   在这里是1, 7 */   
    / N3 n- B% z9 S, f

  14. 4 w/ f* |9 l# q, ?+ L1 P, H" ~5 Y
  15.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);              
      T+ u2 U: n; h# F3 Y6 x4 q, P
  16. ) _8 E; V" Y% P+ p

  17. . s2 I* x. g+ N3 D, k3 R
  18. # N* a5 p, @" m
  19.   /* Enable the USART1 Interrupt */
    - ~6 x% _9 ^+ ?" Z- j  l

  20. ! t' S  m, k, }
  21.   NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn;                                    //设置串口5中断
    1 B4 L0 w, c& ?8 n, h+ s8 `8 |

  22. + w6 @* P  V0 c8 w% o7 b$ g
  23.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;             //抢占优先级 0
    1 D+ B% U. i3 y5 i- C% n; l

  24. 1 {9 o" \. P( B8 e' w( ]
  25.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                                   //子优先级为0
    * D/ H" @2 _% o5 Q

  26. - ?7 [1 I0 ]9 Y- `
  27.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                            //使能3 K8 Y  y+ G, [1 ^) x" N4 A6 Z! _
  28. ' I# N, u: w+ d
  29.   NVIC_Init(&NVIC_InitStructure);
    5 M1 _3 K; N9 ^

  30. & L3 U3 r# }) G! _7 b9 h) [; M" ~4 h
  31. }! b& a; _- d4 p  v7 i( x+ T
  32.   |( S7 p& a0 T  K+ I, q; q( i
  33. USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);           //使能接收中断
    7 H. y  R, t5 b& g7 v' p
  34. 9 ^- P" Y# j/ X+ T. D6 l4 o
  35. USART_ITConfig(USART1, USART_IT_TXE, ENABLE);               //使能发送缓冲空中断
    ( X) R1 L0 ^' o5 I; q; s

  36. $ I+ K  t3 `! y( Z
  37. USART_ITConfig(USART1, USART_IT_TC, ENABLE);                 //使能发送完成中断
    ; f& C9 A/ F9 g1 o: I  }- c
复制代码
, I1 l$ y$ j8 \( \3 N8 U, k
6、  使能外设功能:
" u& A; a$ c# k; u  S( ?
4 y' k5 [5 Z2 c8 m* Z) V7 `串口使能:9 z0 ]& ?) {4 O1 B. i6 j* `4 q
1 ^$ @" J, O! U1 B  y( d
  1. USART_Cmd(USARTx, ENABLE);
    + [0 h) W% p9 W' Y

  2. 4 A5 `8 V2 [) p: Z# p
  3. ADC使能:# P( Y7 c3 z3 N  {8 i: \6 I
  4. + {+ a% N/ X# |; _
  5. ADC_Cmd(ADC1, ENABLE);
    8 x- _) E% e% J3 M, D4 s
复制代码

% ]2 ~; q5 I8 D& g4 a, p# u$ K
3 N0 j6 e% L. ?2 s$ M
收藏 评论0 发布时间:2021-12-4 17:03

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版