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

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

[复制链接]
STMCU小助手 发布时间:2021-1-14 15:52
第二章:STM32CubeMxGPIO基本使用方法
第一点:生成一个工程后,需要注意事项:
在STM32CubeMx软件本身生成的源文件中;用户的代码只可以写在以下区域,自己建立的源码文件不受影响:
  1. //写在前面或后面在下次从STM32CubeMx 生成工程时会被清空掉!
    / x( L' d2 J# F8 l& y
  2. //包含库文件,所以尽量不要试图尝试修改库文件来达到功能需求!# {$ k* ]" A4 ]  z
  3. USER CODE BEGIN0 O. F# m/ O- S' Z/ l1 f2 s1 l

  4. 2 V" V7 a1 d8 e
  5. //只有这写在有编辑权限的代码区域中编写代码,才不会被清空掉,这里要注意一下!+ E; h9 i' i7 b+ ~
  6. 用户可编写的代码区. ]5 L& t# f6 q5 I) Y9 X8 P$ r
  7. # I. r) t! H3 F9 X5 ]
  8. USER CODE END
复制代码
  1. /* Private includes ----------------------------------------------------------*/
    - i& C( @& {0 \# U4 o( G
  2. /* USER CODE BEGIN Includes */% l- z+ M. i7 p0 B
  3. 用户可编写的代码区
    + p5 d- _! a/ I3 M1 L
  4. /* USER CODE END Includes */3 y. j, m: }5 E9 B" y6 k

  5. 5 q+ _4 p: _3 j: U- a1 N2 w, P# v
  6. /* Private typedef -----------------------------------------------------------*/
    0 T) N' ~; A7 T  H6 ?- o
  7. /* USER CODE BEGIN PTD */
    0 T/ {4 R& L6 h
  8. 用户可编写的代码区
    0 d7 a* N1 Q" K
  9. /* USER CODE END PTD */
    4 h7 z; n5 O" U9 }
  10. /* Private define ------------------------------------------------------------*/
    9 b* F: t& B/ f% ]+ d
  11. /* USER CODE BEGIN PD */
    * K! r3 k+ F8 n7 V! ~; B; t" }. Z+ J
  12. 用户可编写的代码区
    9 y, E' Z3 j$ ^8 G% q' o

  13. 9 k9 s& B3 K1 d; {+ S- [5 A- o
  14. #define KEY1_Pin GPIO_PIN_11    //宏定义GPIO_PIN_11  为  KEY1_Pin
    # A5 ^# Q5 g1 Y1 {; k
  15. #define KEY1_GPIO_Port GPIOA    //宏定义GPIOA        为  KEY1_GPIO_Port ) L. r4 i8 ]5 ?# m. M4 l
  16. #define LED1_Pin GPIO_PIN_12    //宏定义GPIO_PIN_12  为  LED1_Pin  
    , t! t5 w; M0 G; v0 O5 j
  17. #define LED1_GPIO_Port GPIOA    //宏定义GPIOA       为  KEY1_GPIO_Port
    + D4 a9 s, x, i4 N( p3 C1 E
  18. & V% }$ f) Y5 J0 f- i8 K
  19. /* USER CODE END PD */
    + p6 |6 u" b, p* Q" h6 n
  20. " o. @3 d' j. C2 c% ^) p
  21. /* Private macro -------------------------------------------------------------*/  l* d& d( w8 O$ |$ X
  22. /* USER CODE BEGIN PM *// a2 I$ v( p+ _" b- W4 g
  23. 用户可编写的代码区
    2 e- f& E1 H  @/ y  V+ m( w. \/ v
  24. /* USER CODE END PM */
    0 N/ V/ _" z. e' J2 ^5 h8 l
  25. * T& ^% e( |' j
  26. /* Private variables ---------------------------------------------------------*/
    $ \3 W9 I; n2 _! O' e8 o
  27. # ], N3 M% ^8 D& z1 S5 `# F
  28. /* USER CODE BEGIN PV */6 e1 S# T/ z# L) {9 x( }# t- ^
  29. 用户可编写的代码区5 j5 x2 C6 O3 `' |% t" w0 W
  30. /* USER CODE END PV */
复制代码
% b8 ^3 L% Q  s; ?8 B" m2 P
  1. int main(void)0 T. X5 x- }+ H! p
  2. {! E) D- P4 C* T
  3.   /* USER CODE BEGIN 1 */' N& V( n$ d! m5 O6 A( m& e. W' V
  4. 用户可编写的代码区7 D2 H" \& ~& \) a) a
  5.   /* USER CODE END 1 */; a3 o* s" H! ~) v
  6.     h- C) P$ K0 @3 z) g

  7.   A0 S. p. a3 ]) }, h& c2 Y5 f
  8.   /* MCU Configuration--------------------------------------------------------*/
    + ]$ t  B6 Q$ ~# _2 l. j

  9. 0 e3 M; ~8 l  A, g( _3 i' x- `( Z
  10.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */0 R. U" H: M8 l4 v8 ^
  11.   HAL_Init();& i" Z1 n+ N: N% r
  12. - Z5 S. F, B8 x" o
  13.   /* USER CODE BEGIN Init */
    : |# U9 M) p+ t3 W" _
  14. 用户可编写的代码区1 s# |  @- t; ?( k% ]
  15.   /* USER CODE END Init */
    % s6 T" _6 B$ }' F- L, a
  16. 9 F, }) P! L. f8 a. s2 f" i" R1 h
  17.   /* Configure the system clock */5 P) i) w  p2 u4 {
  18.   SystemClock_Config();
    8 `. X2 ?6 }- f3 x4 }
  19. ( C7 f- Z: J1 p9 S. O/ ?4 w# W
  20.   /* USER CODE BEGIN SysInit */2 }& |+ p% M1 z( t9 J, {
  21. 用户可编写的代码区6 b5 c& _! J" {# d
  22.   /* USER CODE END SysInit */3 l/ \9 T$ [: B8 l
  23. 1 ]( f8 @2 G# A4 n! n" `
  24.   /* Initialize all configured peripherals */
    5 D( b+ O% C- @8 i' s6 ~
  25.   MX_GPIO_Init();
    / |2 a. |" ~4 k9 V5 i5 G
  26.   /* USER CODE BEGIN 2 */
    + F" H# [0 I7 y$ i
  27. 用户可编写的代码区
    - \# y- O) @4 U
  28.   /* USER CODE END 2 */5 J; z9 g- x# K/ y; F$ y4 g

  29. 9 e/ O( I2 w; A9 G6 U" |2 r1 U  ?
  30.   /* Infinite loop */
    # S" A' o# G# s( O7 ]0 K7 V) l
  31.   /* USER CODE BEGIN WHILE */
    7 x. A" P5 J' e( d
  32.   while (1)
    . Q4 l1 [5 v! @3 y+ T, d; T) @
  33.   {  ?2 c6 U0 F* B) e; {: u
  34.     用户可编写的代码区( Y2 s5 f3 A1 T
  35.     /* USER CODE END WHILE */) |9 i8 R: `3 ?  y
  36. % Z, h3 b5 i, }, e
  37.     /* USER CODE BEGIN 3 */
    6 M4 I' n& }! U% u3 G
  38.   }
    * W& S" L5 x5 Y, B
  39.   /* USER CODE END 3 */. a1 o  e0 P- `& Z3 G% s
  40. }
复制代码
第二点:关于GPIO 的几个库函数使用说明:
  1. //这是上一节讲到IO口初始化代码,该代码由STM32CubeMx 自动生成
    - Q1 x: i0 L+ L3 b2 w- u2 c
  2. static void MX_GPIO_Init(void)
    3 b% R; @' d( ~3 F) K9 O
  3. {
    - I5 P. a2 i5 b* K
  4.   GPIO_InitTypeDef GPIO_InitStruct = {0};
    - w" g* f9 k% c+ R0 m, M

  5. 2 i7 F3 _; O  M4 }$ C. U
  6.   /* GPIO Ports Clock Enable */5 ^. Q- A- c5 i5 ^% f
  7.   __HAL_RCC_GPIOA_CLK_ENABLE();
    ; R9 x: l* U! [* B3 \) C5 W+ @( p6 K

  8. & E( [7 r8 ~2 z( P  Y
  9.   /*Configure GPIO pin Output Level */: O) \* V/ u: l) \! p9 i  ~# T( Y" n
  10.   HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);//默认输出高6 |1 j6 {% |( r. d' ?" t

  11. ; {7 t% r  v, Q/ V
  12.   /*Configure GPIO pin : KEY1_Pin */ 3 H+ Q/ V3 p& {6 y+ s1 s
  13.   //这是我们之前在上位机配置的参数,生成代码后就这是这样了
    2 X! F# ?. {$ v; K* W
  14.   GPIO_InitStruct.Pin = KEY1_Pin;      //初始化KEY1引脚' ~1 m! p& T% l  b% |' O; G
  15.   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;  //配置为输入模式
    : ~; V4 q% r# D4 N( E
  16.   GPIO_InitStruct.Pull = GPIO_PULLUP;    //上拉输入9 T; ^5 P2 Y& L5 Q" y3 E, A
  17.   HAL_GPIO_Init(KEY1_GPIO_Port, &GPIO_InitStruct);
    2 b, p% D0 |" u9 u
  18. 2 f9 l6 h/ ~1 O& I. K, D
  19.   /*Configure GPIO pin : LED1_Pin */
    8 u/ O! _( ]; J" F- w$ ^
  20.   GPIO_InitStruct.Pin = LED1_Pin; //初始化LED1引脚
    - @& ?0 t) ^1 _; r
  21.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //配置为输出模式' A4 r+ k' D8 [: v# w0 Z7 d
  22.   GPIO_InitStruct.Pull = GPIO_PULLUP;//默认上拉输出
    - N( r' R3 O4 f1 k- l! {
  23.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;//低速模式: H5 a8 S& z2 `1 [
  24.   HAL_GPIO_Init(LED1_GPIO_Port, &GPIO_InitStruct);
    0 h; p! L$ Q3 Q1 P1 _, [# i9 E
  25. }
复制代码
  1. /* HAL_GPIO_DeInit    重置IO口,恢复为默认状态' a/ {7 D; I& _7 N! Z+ D1 s
  2. .  HAL_GPIO_ReadPin   读取IO口状态函数,需要把IO口配置为输入模式才可以读取到,这里注意一下
    4 b* M8 Z" k: p/ e) p) Z$ p
  3. ·  HAL_GPIO_WritePin  输出IO口状态函数,即对IO输出高电平/低电平
    8 O" B; V5 Z$ L8 u! M& p
  4. .  HAL_GPIO_TogglePin 输出IO口翻转函数,即对IO口取反
    % @% N4 |9 @) S; N
  5. .  HAL_GPIO_LockPin   锁定IO口函数,读管脚值使用锁定,当这个管脚电平变化时保持锁定的值。+ r9 n, x6 ]# {4 i
  6. . HAL_GPIO_EXTI_IRQHandler 外部中断服务函数,详细使用,下期讲到!
    # ^" p) }0 t4 A6 T: |4 r( J) q& B
  7. . HAL_GPIO_EXTI_Callback 中断回调函数,详细使用,下期讲到!- V$ Z: b  x- ?5 L4 P6 d$ B9 B& p+ x
  8. */
    1 ]3 i; x. I  Q
  9. void  HAL_GPIO_DeInit(GPIO_TypeDef  *GPIOx, uint32_t GPIO_Pin);/ j/ v- T  m: N" Z! o1 E
  10. GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
    ) a8 V* e0 U4 b5 ~7 d
  11. void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);8 u5 ~* X2 p" D: Z/ o- C
  12. void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
    * [6 n/ s* K6 o
  13. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);5 ?! w' R: b/ ^. M$ a
  14. void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);
    9 A* r0 f3 r6 ~9 b; L
  15. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);' l% r: h+ ^/ L' l) L
  16. % j1 G+ l$ I4 ^2 Q1 u% K1 w
  17. //搞清楚每个功能函数的功能后,我们只需要直接调用即可:
    # e5 o4 ^/ p  b: ~3 _/ w" u
  18. //例:( P2 s* |& B% x7 z
  19. if(!HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin))  //如果KEY1 脚为低电平
    # f6 ~7 q; s. u% |5 a0 F6 ~6 Q
  20. {- K' E" i- b: S8 a" c& d: h
  21.   HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET); //LED1输出高电平
    ' n9 L0 A5 P5 z7 o
  22.   HAL_Delay(1000);  //延时函数1S
    / ]# [9 N% }! k6 ^9 n
  23.   HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET); //LED1输出低电平4 F$ Z( q# g* U+ s- q
  24.   HAL_Delay(1000);  //延时函数1S
    / ]- N: c1 G" R3 _" j* `4 V6 X
  25.   HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin); // LED1 翻转输出电平
    + C+ c3 X9 o* W4 K& k+ P( N- O9 p
  26. }
复制代码

$ s0 u% L4 B) E# W" H5 _
如果能理解到这里,恭喜你已经学会了IO的基本操作!
文章出处: 电子爱好者
. Y, M8 C( T& _, K9 f% l% W- ^
赞 收藏 评论0 发布时间:2021-1-14 15:52

举报

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