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

第二章:STM32CubeMx GPIO基本使用方法

[复制链接]
STMCU小助手 发布时间:2021-1-14 15:52
第二章:STM32CubeMxGPIO基本使用方法
第一点:生成一个工程后,需要注意事项:
在STM32CubeMx软件本身生成的源文件中;用户的代码只可以写在以下区域,自己建立的源码文件不受影响:
  1. //写在前面或后面在下次从STM32CubeMx 生成工程时会被清空掉!: R: T0 }* u& e  G
  2. //包含库文件,所以尽量不要试图尝试修改库文件来达到功能需求!) ^+ B7 I% a, {9 x
  3. USER CODE BEGIN
    $ Y% O+ c2 Q1 z: h

  4. ' T" ^, O& G* ^/ u' r
  5. //只有这写在有编辑权限的代码区域中编写代码,才不会被清空掉,这里要注意一下!1 a- Z- U7 L; ]- r
  6. 用户可编写的代码区
      g- G( w# p: V' u- I3 l# A

  7. $ ^* t2 ~7 I- _) I. T4 \
  8. USER CODE END
复制代码
  1. /* Private includes ----------------------------------------------------------*/( G" m$ S* i+ d  }+ B7 Y
  2. /* USER CODE BEGIN Includes */
    , r8 d* {( Y3 _, z$ J6 w6 L9 a0 ]
  3. 用户可编写的代码区4 l  y: ^9 M! h0 J8 k( v" b/ R
  4. /* USER CODE END Includes */
    , s4 f* r1 A+ W  i8 J4 F' _- r& c8 m

  5. : _) D4 m1 V  g- Y; p8 A
  6. /* Private typedef -----------------------------------------------------------*/6 I- |% B4 k; {# G5 t3 S6 F
  7. /* USER CODE BEGIN PTD */
    , D2 z* I( ~  e& e7 F' B9 F6 ], h
  8. 用户可编写的代码区3 Z5 |6 n9 z* d
  9. /* USER CODE END PTD */
    7 r8 o6 p8 L. v8 m3 x
  10. /* Private define ------------------------------------------------------------*/3 b( g; q6 L6 n
  11. /* USER CODE BEGIN PD */
    7 C% }; J$ e1 J6 Y
  12. 用户可编写的代码区7 _) B' c# E9 B$ D4 N

  13. 3 f3 W8 u0 t( [. L" ]6 c5 I
  14. #define KEY1_Pin GPIO_PIN_11    //宏定义GPIO_PIN_11  为  KEY1_Pin
    * {) q9 }/ b; @5 `/ L' w
  15. #define KEY1_GPIO_Port GPIOA    //宏定义GPIOA        为  KEY1_GPIO_Port 2 q! ?( Y! B& c
  16. #define LED1_Pin GPIO_PIN_12    //宏定义GPIO_PIN_12  为  LED1_Pin  
    # U, j/ `# \/ b% Z5 z
  17. #define LED1_GPIO_Port GPIOA    //宏定义GPIOA       为  KEY1_GPIO_Port ) K7 b- m( p7 p0 |7 C  f! ~
  18.   j) L( h# u: j5 I- G) r' R" @
  19. /* USER CODE END PD */
    ( z2 w$ m! w" ~, Q
  20. 0 m1 t6 Z$ l  T" j" c& S8 ~7 {+ F
  21. /* Private macro -------------------------------------------------------------*/
    8 w8 j) k: j. f5 `' B/ k! i
  22. /* USER CODE BEGIN PM */
    0 Y5 K$ @0 }1 C
  23. 用户可编写的代码区# F' M# c- j8 s4 T
  24. /* USER CODE END PM */
    / f$ V  y7 p; T
  25.   D5 ^( K  q5 d# Y
  26. /* Private variables ---------------------------------------------------------*/
    4 N- q9 F. ~, q! `  g
  27. 3 q/ |1 y- _- T3 O! M7 L. T" @) `
  28. /* USER CODE BEGIN PV */
    # j; i$ o! w0 @2 L' h3 Z  f
  29. 用户可编写的代码区
    : s0 j4 m. C7 ?
  30. /* USER CODE END PV */
复制代码

0 P, \2 O! H6 E, f/ S
  1. int main(void)
    * @2 W& B' b. V, o" @$ m9 j
  2. {
    * p3 b1 C  x/ m4 ^. _$ _
  3.   /* USER CODE BEGIN 1 */2 _7 ^9 t( C; j* u# X
  4. 用户可编写的代码区
    ; V0 i9 {& t, }, I) |
  5.   /* USER CODE END 1 */; i4 q* c+ t8 T, T5 W
  6.   
      a! K* K, t- ?9 C) b
  7. 2 k0 p% g4 S+ y, t% o
  8.   /* MCU Configuration--------------------------------------------------------*/
    & z% a7 G7 `4 a& F3 b6 F
  9. 1 ~+ X, a6 _+ m7 J9 e" B- \, k2 ]
  10.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */; [- [5 P5 V( U: M
  11.   HAL_Init();9 ~" y- ?+ z. A- E; D1 z7 a+ s

  12. 3 v) @$ Q) a2 W$ ~+ Q/ ~
  13.   /* USER CODE BEGIN Init */9 \" i+ C6 }" C' D3 ?
  14. 用户可编写的代码区
    - a' n) J; _. _+ l& V4 _% y  H
  15.   /* USER CODE END Init */3 T: }- E7 Y& Z( l/ e; Z
  16. 8 A0 E+ S. O) _1 y/ P9 i! B4 f
  17.   /* Configure the system clock */! \4 u- `/ H- m
  18.   SystemClock_Config();
    ! [5 d% i  P# q
  19. & j* n- ~1 X" ?$ G8 A6 v
  20.   /* USER CODE BEGIN SysInit */
    1 }6 h2 }* w: g$ t2 q# K
  21. 用户可编写的代码区' L; U0 h+ ]+ I  A% O
  22.   /* USER CODE END SysInit */
    ' c, T. n. o* t. P) ^2 M

  23. , w' h: ]7 x2 h
  24.   /* Initialize all configured peripherals */4 g2 |6 ?9 ~. D# h' Q# U5 }
  25.   MX_GPIO_Init();5 I: v/ C& w4 g+ M
  26.   /* USER CODE BEGIN 2 */
    . t1 y' r8 u' u; u. w0 r9 V
  27. 用户可编写的代码区1 U, ~7 H& Q3 p: c  c0 c
  28.   /* USER CODE END 2 */
    ( n  B& U4 {; |$ a5 M0 `! K! l

  29. # U( n! G4 u. U) X+ s) o$ k
  30.   /* Infinite loop */
    # D) t- y8 ~6 W- D* C& l0 B2 [
  31.   /* USER CODE BEGIN WHILE */: \, U8 P! w0 ^& g3 |/ {: B
  32.   while (1): w: R5 J2 k; q1 G" |2 E
  33.   {
    1 w! G: y& a) H# n, w
  34.     用户可编写的代码区
    ' Y; {2 ]9 c! R
  35.     /* USER CODE END WHILE */  N1 D. I; x- s5 g/ {; ^! [1 o: H

  36. , t5 A; }) `6 Y8 B5 k) K2 ]
  37.     /* USER CODE BEGIN 3 */
    - G& C4 v! O" K2 M
  38.   }1 ^; b: r* ^% c0 Q( f6 ~
  39.   /* USER CODE END 3 */" O) w) ?+ B6 J1 R7 z3 v2 J* f
  40. }
复制代码
第二点:关于GPIO 的几个库函数使用说明:
  1. //这是上一节讲到IO口初始化代码,该代码由STM32CubeMx 自动生成
    - h" p( [, y6 x' F6 }4 C* n5 _6 |
  2. static void MX_GPIO_Init(void)) t5 B7 x7 r5 R3 y8 `3 l/ Z5 Z: C/ o
  3. {
    ; v: s8 y* P5 j2 F' v
  4.   GPIO_InitTypeDef GPIO_InitStruct = {0};
    . {0 K' [9 ~1 X* |" {

  5. & Y$ R7 {2 j2 F" ]! G
  6.   /* GPIO Ports Clock Enable */' o7 C) e; ^+ ]) l  C4 i# Y
  7.   __HAL_RCC_GPIOA_CLK_ENABLE();- X- p8 ^* e* v* T8 u! e0 r
  8. , N- @, c' ~* |
  9.   /*Configure GPIO pin Output Level */
    8 W+ q5 Q6 a! s, u7 }7 n) R1 k% b
  10.   HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);//默认输出高9 C/ f- M1 i. I

  11. - H2 W- k: A0 B. Y
  12.   /*Configure GPIO pin : KEY1_Pin */ : a% p# J2 ^4 o6 }2 ]8 ^& m" E( H
  13.   //这是我们之前在上位机配置的参数,生成代码后就这是这样了
      j' B/ Y& P; m+ l5 P! y
  14.   GPIO_InitStruct.Pin = KEY1_Pin;      //初始化KEY1引脚. s5 h3 S( N# ^7 M: C4 W8 [. w
  15.   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;  //配置为输入模式1 G9 K2 r' o- L2 t% b
  16.   GPIO_InitStruct.Pull = GPIO_PULLUP;    //上拉输入
    $ I( W" g( k5 t1 }( X$ `4 I
  17.   HAL_GPIO_Init(KEY1_GPIO_Port, &GPIO_InitStruct);
    ; I1 G; @* H5 t
  18. 8 \! F$ I6 S* d! @7 ?, _7 a$ z* S5 ^
  19.   /*Configure GPIO pin : LED1_Pin */
    . h; n+ o" d; B) \* j& ^: I$ _7 V
  20.   GPIO_InitStruct.Pin = LED1_Pin; //初始化LED1引脚
    ; g2 ?2 F8 |# w+ x/ P& @' ?$ J, P
  21.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //配置为输出模式" f1 J4 u) P. R( d/ W
  22.   GPIO_InitStruct.Pull = GPIO_PULLUP;//默认上拉输出) @6 h; S6 Q% u# x$ D& ~$ u
  23.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;//低速模式# i  b( c" Q6 o, v
  24.   HAL_GPIO_Init(LED1_GPIO_Port, &GPIO_InitStruct);
    2 @# _4 l5 p4 D1 }. z
  25. }
复制代码
  1. /* HAL_GPIO_DeInit    重置IO口,恢复为默认状态
    % q  e  p: k( G- Z' _( h) H0 P  I' z
  2. .  HAL_GPIO_ReadPin   读取IO口状态函数,需要把IO口配置为输入模式才可以读取到,这里注意一下
    ; i# u3 S9 h/ s, v9 h1 }
  3. ·  HAL_GPIO_WritePin  输出IO口状态函数,即对IO输出高电平/低电平) a: U1 i* R" l1 c" o
  4. .  HAL_GPIO_TogglePin 输出IO口翻转函数,即对IO口取反# x# g9 f/ P1 A; {5 ~
  5. .  HAL_GPIO_LockPin   锁定IO口函数,读管脚值使用锁定,当这个管脚电平变化时保持锁定的值。- W% n- N9 ^- |# n
  6. . HAL_GPIO_EXTI_IRQHandler 外部中断服务函数,详细使用,下期讲到!
    , k0 M; s8 b- V" U" d! i: N; p
  7. . HAL_GPIO_EXTI_Callback 中断回调函数,详细使用,下期讲到!
    1 R+ Y* I/ ?, u  u+ J7 F
  8. */
    2 d; t  P- R6 F
  9. void  HAL_GPIO_DeInit(GPIO_TypeDef  *GPIOx, uint32_t GPIO_Pin);
    # v' N/ D* F# u7 R; X2 Y, [
  10. GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
    % z1 s" Z) j: A! o; T9 r0 i: n' C- k
  11. void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
    ) O) Q: ~% c: p1 {/ r! ?
  12. void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
    , g! F- C$ X6 e. R. J( o4 b$ M
  13. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
    : C5 Q5 b5 t2 x. g" p# c
  14. void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);
    9 Y+ P9 `2 r' T) D, i' U9 `4 {& w
  15. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);2 _8 W2 g$ N/ m0 S* R% ~& n
  16. ( ^% S5 i- {* X8 E
  17. //搞清楚每个功能函数的功能后,我们只需要直接调用即可:$ W. f3 v( y- J" i* [$ H8 y
  18. //例:/ Q5 f4 A- I$ E1 G: Z& C# E
  19. if(!HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin))  //如果KEY1 脚为低电平1 c* U+ L6 ^3 \, H) k6 z1 r
  20. {( B# S2 f3 k8 `" [1 i; h
  21.   HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET); //LED1输出高电平
    4 X  |. P/ `& F9 r0 P: @/ V
  22.   HAL_Delay(1000);  //延时函数1S# G( C( X9 d3 Z7 O: S8 \! `! I7 r  ]
  23.   HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET); //LED1输出低电平
    " L: P$ f. x. u/ Z& Z* Q, j8 h
  24.   HAL_Delay(1000);  //延时函数1S6 C9 B$ C' y  Q$ i
  25.   HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin); // LED1 翻转输出电平  p3 w8 s; p" r4 `9 K" v1 k
  26. }
复制代码

2 I. D3 q1 k7 J8 S. q, O$ V( ]
如果能理解到这里,恭喜你已经学会了IO的基本操作!
文章出处: 电子爱好者

5 O; q( Z! o" \
收藏 评论0 发布时间:2021-1-14 15:52

举报

0个回答

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版