第二章:STM32CubeMxGPIO基本使用方法 第一点:生成一个工程后,需要注意事项: 在STM32CubeMx软件本身生成的源文件中;用户的代码只可以写在以下区域,自己建立的源码文件不受影响: - //写在前面或后面在下次从STM32CubeMx 生成工程时会被清空掉!/ h% t4 P$ e# B! G
- //包含库文件,所以尽量不要试图尝试修改库文件来达到功能需求!8 R: b1 z# ~3 Y$ M" V
- USER CODE BEGIN; A# I! b& w) U' r" |0 u) V
6 \$ E" `' x# K( d9 V- //只有这写在有编辑权限的代码区域中编写代码,才不会被清空掉,这里要注意一下!
% z. C7 D3 [' h# B5 I3 D - 用户可编写的代码区
' A. v1 C: _% E2 U0 c: R' X, p
( F0 F+ l4 r' d9 x2 V- USER CODE END
复制代码- /* Private includes ----------------------------------------------------------*/
1 Q; {3 j3 _, U& {$ F3 Z& h - /* USER CODE BEGIN Includes */
8 M& i: Q5 C1 x) {! L5 [ - 用户可编写的代码区
4 j, I) p+ B$ Y& o6 @+ i7 l - /* USER CODE END Includes */9 c6 L; N* u% H, k4 U' j
- . q+ M- V! O2 A
- /* Private typedef -----------------------------------------------------------*/
8 ~# ?+ P9 ~* ~8 j& h( l3 M" n, c - /* USER CODE BEGIN PTD */
" N2 ]3 w3 y$ ?3 p - 用户可编写的代码区
[! u6 O# L5 z - /* USER CODE END PTD */
' E8 R* y" P8 f) Q! P2 j - /* Private define ------------------------------------------------------------*/% H/ ], |' n4 E- N& [1 D" n, W
- /* USER CODE BEGIN PD */
- h, z2 d6 H9 R7 _+ d2 Y2 K - 用户可编写的代码区9 B# j* d" ]+ u# f, L
' J& D- b8 l5 K% }" G! G- #define KEY1_Pin GPIO_PIN_11 //宏定义GPIO_PIN_11 为 KEY1_Pin 6 l. i# [7 s4 E! m
- #define KEY1_GPIO_Port GPIOA //宏定义GPIOA 为 KEY1_GPIO_Port . f; q0 i; I/ [4 S6 {+ `
- #define LED1_Pin GPIO_PIN_12 //宏定义GPIO_PIN_12 为 LED1_Pin
' m, n7 N) A) B7 K5 u* v - #define LED1_GPIO_Port GPIOA //宏定义GPIOA 为 KEY1_GPIO_Port
?( _. O( S6 S5 v - + [4 p8 @8 Y- U m& a
- /* USER CODE END PD */
/ I. Z @3 m1 E5 a% G6 S
$ ^) L ^& m) _; {% k- /* Private macro -------------------------------------------------------------*/
( q. N R4 A+ o5 r) A: [1 d - /* USER CODE BEGIN PM */% ?/ S7 i; O8 E/ ?5 i' L9 v9 x1 Z% h
- 用户可编写的代码区+ o( y" Z7 c, o
- /* USER CODE END PM */
3 i' c1 p8 z! l - . _ w+ k$ F# n: ^& D' A; Q$ V8 X
- /* Private variables ---------------------------------------------------------*/
% C5 k5 q. L) W+ {2 o A7 D - * Z8 r# s, D8 t; L4 I8 k# K, [. {
- /* USER CODE BEGIN PV */. e2 G6 @7 h, _! A5 \
- 用户可编写的代码区- D! t1 H/ N9 y( _- g! S
- /* USER CODE END PV */
复制代码
$ U7 G& H% K, i, W R" ^1 j - int main(void)) E$ k4 R" ]6 z; U
- {7 d' k$ D3 q" O( z3 V
- /* USER CODE BEGIN 1 */: T, ]* s8 Q/ C
- 用户可编写的代码区
& m- @' H7 k; k - /* USER CODE END 1 */% o# S b* Y: A/ b
-
' u7 x0 L5 I; G, p% @4 \4 Q7 p - & A- v2 {/ H' w
- /* MCU Configuration--------------------------------------------------------*/
4 h1 F4 i) \. D& {! ^ - 8 g1 C) i; q& T; B$ P; s: J
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */' E" m0 }% D) c6 N& ?3 ?
- HAL_Init();
2 s: t) ~- V1 a& D: R. z. D3 C
+ s& T) X; U/ H, o. y l' L- /* USER CODE BEGIN Init */
. B8 a. P4 e* C - 用户可编写的代码区
2 D9 |/ |. w( h; ^ |- Q$ R; u. u. E - /* USER CODE END Init */1 X1 z m" O) V
3 ~) x1 `: q( q$ S, a& H- /* Configure the system clock */
8 P- w$ Y; P% M( O/ W' j& Q8 v! d - SystemClock_Config();
3 [* j5 X& ^& H; k* V( f" m - % r+ Q9 C" H+ J4 m/ |% w0 [/ T
- /* USER CODE BEGIN SysInit */
4 ]8 Z+ _6 i U. u9 g - 用户可编写的代码区
( S. V6 z" F) ^: @4 B, ^! ^ - /* USER CODE END SysInit */, A" r6 r) r. x
7 u' ^! U1 a+ D R- /* Initialize all configured peripherals */
$ z6 D7 {2 e/ i+ V: K - MX_GPIO_Init();) e" b! Q: o8 w
- /* USER CODE BEGIN 2 */
6 M; g" W" P- x. N - 用户可编写的代码区4 S* W* \9 X! _
- /* USER CODE END 2 */) d: [3 _# M) W9 W
- . e* `+ {1 n4 r( Q6 l+ F, V6 B
- /* Infinite loop */
5 E6 M, u. @# e3 j, h - /* USER CODE BEGIN WHILE */
: U- d2 j2 z5 z- r: k - while (1)! k) p+ B' F, a. _& T. M
- { |6 O0 Z' r1 M$ {; ]9 }, D
- 用户可编写的代码区5 _' Y9 p+ c) e# N+ b5 V
- /* USER CODE END WHILE */
0 Q. e; U) L X- f- }1 O! r
& ]/ A7 U0 V+ `: V- /* USER CODE BEGIN 3 */
" g- @9 J9 C7 w: e - }5 \$ n; S7 X% P
- /* USER CODE END 3 */
9 s; k5 U& @2 }8 o - }
复制代码 第二点:关于GPIO 的几个库函数使用说明: - //这是上一节讲到IO口初始化代码,该代码由STM32CubeMx 自动生成5 F+ K% A8 h& L# K& S$ J7 _
- static void MX_GPIO_Init(void)
E- @! d. b7 \7 L+ F0 y - {9 F& ], w- {& Q: n& L* |
- GPIO_InitTypeDef GPIO_InitStruct = {0};* h- q B! w& M/ s4 Q0 [" T
- 0 j+ n2 a+ H6 d$ @. W: N$ x$ M3 M
- /* GPIO Ports Clock Enable */
7 M/ P0 \. y0 {" o: w8 @& k - __HAL_RCC_GPIOA_CLK_ENABLE();
5 G! o* B' F. d# O) ?
: Y3 S2 B& w: s( h- /*Configure GPIO pin Output Level *// n6 ~) I- U. D
- HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);//默认输出高7 h! |- z! G9 a; f
" X( q- p9 |- O1 S6 ]; A- /*Configure GPIO pin : KEY1_Pin */
0 W2 t6 n" ^& t5 Q% i( i - //这是我们之前在上位机配置的参数,生成代码后就这是这样了7 T6 J6 X$ v; ~" u; v3 l, V
- GPIO_InitStruct.Pin = KEY1_Pin; //初始化KEY1引脚8 [5 G% h( w h$ W; Y
- GPIO_InitStruct.Mode = GPIO_MODE_INPUT; //配置为输入模式
6 C) r" P8 r% h# t& i% I - GPIO_InitStruct.Pull = GPIO_PULLUP; //上拉输入9 {2 a2 g4 K) J2 A
- HAL_GPIO_Init(KEY1_GPIO_Port, &GPIO_InitStruct);1 Z+ d' F: h7 s- {/ u
- 4 g6 r8 h/ Z& `! C5 M5 Y
- /*Configure GPIO pin : LED1_Pin */
( ], g- P3 ?0 C$ }* `) N - GPIO_InitStruct.Pin = LED1_Pin; //初始化LED1引脚
- i) k1 x2 G9 {7 S/ s - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //配置为输出模式4 F1 [' C/ ^8 ~/ W' N3 R' D5 t
- GPIO_InitStruct.Pull = GPIO_PULLUP;//默认上拉输出
/ N, o' I9 a2 D/ h" o) V7 ]1 E% y - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;//低速模式
+ ~" a& i" A+ f' K: M2 | - HAL_GPIO_Init(LED1_GPIO_Port, &GPIO_InitStruct);
* E8 R, ]! k% R/ ~% T# a - }
复制代码- /* HAL_GPIO_DeInit 重置IO口,恢复为默认状态
. z0 v4 a; k' T# _3 o - . HAL_GPIO_ReadPin 读取IO口状态函数,需要把IO口配置为输入模式才可以读取到,这里注意一下9 X9 g0 \# M, G0 T$ c# Z
- · HAL_GPIO_WritePin 输出IO口状态函数,即对IO输出高电平/低电平 C, r+ t4 W/ ~7 a& m
- . HAL_GPIO_TogglePin 输出IO口翻转函数,即对IO口取反
- E; v4 Q# x3 R" S, t3 X - . HAL_GPIO_LockPin 锁定IO口函数,读管脚值使用锁定,当这个管脚电平变化时保持锁定的值。
; z9 N. t" B/ c; [0 X - . HAL_GPIO_EXTI_IRQHandler 外部中断服务函数,详细使用,下期讲到!5 Q# Q6 p! `0 }8 R8 g, ^- D
- . HAL_GPIO_EXTI_Callback 中断回调函数,详细使用,下期讲到!
6 _1 n/ I6 e+ ^& K3 Q* d - */" A$ M7 ^. C) H' J
- void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin);/ U* F& e+ _% ~$ P. }" D* G0 h
- GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);( M7 F' P- S% N' a4 Z! E0 C( ~
- void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
$ _9 J, P1 W! a) l6 @0 b9 ` - void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
8 C" S1 p8 V' {) ?7 s% |1 C4 D - HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
+ k# _0 @0 N" A) B2 i3 [ - void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);
5 F; V" F$ l; q R - void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);: `1 i/ k0 V# T, S
4 c6 m- C' R) }8 M% H- //搞清楚每个功能函数的功能后,我们只需要直接调用即可:8 @4 ]" f- O7 k+ S& `) X: K ~
- //例:
( g* b3 D( N5 Q - if(!HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)) //如果KEY1 脚为低电平0 ]& e$ r: S" Q
- {+ V: ?, e% }% ]
- HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET); //LED1输出高电平: ]' Q) ~& M9 z* x9 d+ M! R
- HAL_Delay(1000); //延时函数1S
4 j/ U1 Q# Q; W; P* _& M2 | - HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET); //LED1输出低电平7 [1 x: I% {+ i- E+ {, c/ @ g4 @* j
- HAL_Delay(1000); //延时函数1S
" Q+ Q7 F) n' m9 `$ d - HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin); // LED1 翻转输出电平" q- O+ y" k5 w9 f, s4 ]( _
- }
复制代码
' ~2 c1 l. X" J6 J如果能理解到这里,恭喜你已经学会了IO的基本操作! 文章出处: 电子爱好者 4 H2 w% ?+ Q e$ b' i
|