第二章:STM32CubeMxGPIO基本使用方法 第一点:生成一个工程后,需要注意事项: 在STM32CubeMx软件本身生成的源文件中;用户的代码只可以写在以下区域,自己建立的源码文件不受影响: - //写在前面或后面在下次从STM32CubeMx 生成工程时会被清空掉!& r' b! z3 U2 O6 B5 Y6 x
- //包含库文件,所以尽量不要试图尝试修改库文件来达到功能需求!
2 d# Y/ d W1 l$ B; u3 G" ^ - USER CODE BEGIN9 E. ^, P( n( i' l" k
8 C1 S3 ~% u# Z; B& P- //只有这写在有编辑权限的代码区域中编写代码,才不会被清空掉,这里要注意一下!0 s' X! P; C* ^) U+ W
- 用户可编写的代码区
5 o( @1 l% N' D1 x& u
0 D$ Y3 q3 U2 U3 [- USER CODE END
复制代码- /* Private includes ----------------------------------------------------------*/
$ w2 F( \5 h; d9 t - /* USER CODE BEGIN Includes */
: P% e5 d$ M8 ? - 用户可编写的代码区1 A ~: F7 ]; d& N2 M5 z5 f% i. o
- /* USER CODE END Includes */6 G2 j% ?8 `! d' @1 U; e; ~
- ) @9 I9 H' D& v, J6 w6 g2 {
- /* Private typedef -----------------------------------------------------------*/
, Y$ ]9 Q9 _& D$ q, T" u - /* USER CODE BEGIN PTD */- {3 L2 S) Y9 r4 Q8 e
- 用户可编写的代码区0 k( q8 V2 e9 J2 n
- /* USER CODE END PTD */7 P8 }# G) l$ K4 r- d w e; {
- /* Private define ------------------------------------------------------------*/
9 R c: o& n1 G2 y X- [7 c. R - /* USER CODE BEGIN PD */
0 Q2 @6 U1 I: z! w/ _' _ - 用户可编写的代码区
& A$ k0 E, s, Y5 s# ?% c# s" B5 E
" q) a& e- S6 A {5 r- #define KEY1_Pin GPIO_PIN_11 //宏定义GPIO_PIN_11 为 KEY1_Pin
2 W- m/ h7 y/ d; h' A( q5 g - #define KEY1_GPIO_Port GPIOA //宏定义GPIOA 为 KEY1_GPIO_Port * [% ~0 g: k- A4 G$ p9 J
- #define LED1_Pin GPIO_PIN_12 //宏定义GPIO_PIN_12 为 LED1_Pin 2 m: f( `! ~ H* S8 W$ `
- #define LED1_GPIO_Port GPIOA //宏定义GPIOA 为 KEY1_GPIO_Port }7 A+ q) q5 J+ m* V2 P
- 3 h3 w6 O; a# B
- /* USER CODE END PD */9 D8 \$ X- t) H/ O
) E/ V5 X. i' J+ ?! X# U- /* Private macro -------------------------------------------------------------*/
2 ^2 J$ u! f. f! Z- C( x - /* USER CODE BEGIN PM */, A$ J/ Z" H! N9 h5 V4 j
- 用户可编写的代码区
7 P+ ?% u; D E( a: \# X - /* USER CODE END PM */3 b# p7 W# `% i# C
- & z# v$ J( _. i8 K: M9 T4 l
- /* Private variables ---------------------------------------------------------*/
8 h! R' V" p+ ]2 I8 d& _7 r* E6 ^% @( T
! U. O1 N5 E7 ^2 U% w2 o- /* USER CODE BEGIN PV */6 Z a- t: J& X" @
- 用户可编写的代码区4 T9 o8 v4 R* ?8 V' h
- /* USER CODE END PV */
复制代码 % k6 o' ?- I/ u% ~# A
- int main(void)
3 i6 {8 |# p* w( J; | U. v# P" m* C4 l - {
, l9 C& i8 {$ @! H; M2 s - /* USER CODE BEGIN 1 */
* q0 b% b( d7 H/ W* M, \/ F" Q - 用户可编写的代码区1 i0 v& c Q+ e% t$ W, u" t
- /* USER CODE END 1 */
% f0 f* g5 B( H' F Z9 K" H Q0 q, o) Y- g - 7 y( m# ~0 W2 `8 n
- , v$ {% N5 I$ V6 g5 u3 _+ |
- /* MCU Configuration--------------------------------------------------------*/; x4 O" u4 y3 N7 I4 B
- 4 e+ Z: _% J2 B. W7 n9 q
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
3 I* N/ ~, C! K# d& C9 { - HAL_Init();
1 t" ^* ?* Y: y2 R8 k
; v% v8 Q4 w% a$ \- [; G- /* USER CODE BEGIN Init */( A7 ^3 C1 @; n/ r- }
- 用户可编写的代码区4 q, O7 K. N/ H2 r9 O
- /* USER CODE END Init */
, I) I: j" R( Z9 X- w* h- D
# |" W0 p1 g2 p$ e9 e- /* Configure the system clock */* f# u7 Y' j0 g: Y! G( N
- SystemClock_Config();
, o8 V3 o) ]9 \. a4 p
) R* C' A( j! F. V- /* USER CODE BEGIN SysInit */5 ^$ D( P- L( D! r8 o" e( }, |
- 用户可编写的代码区# X0 ^. W( n4 e+ S) k2 O
- /* USER CODE END SysInit */
# e6 S& Q- t. {$ N' @
% ^7 P. g/ D6 U* u" Z- /* Initialize all configured peripherals */
! S7 d" d% w0 T" i" y( n8 n - MX_GPIO_Init();
2 y( V2 ~0 H, s0 R% C; y# j - /* USER CODE BEGIN 2 */
j7 ~1 ?" Y( Q$ J" ^$ d" ~) h - 用户可编写的代码区
$ d) J m, |$ p: [9 K, x - /* USER CODE END 2 */7 f5 ?1 \ s8 R4 u
2 D4 t, g, n" f+ n' k- /* Infinite loop */
( [" K# J: D# J' D0 a - /* USER CODE BEGIN WHILE */. @! M6 m& w- K& d+ R" l; u m
- while (1)
: t9 b6 J7 |, ~0 ` - {( Y, `8 k& f# b) v! ?) f
- 用户可编写的代码区; I8 h: B: N4 U; `9 W6 D& }
- /* USER CODE END WHILE *// m9 E7 s! L% K0 ]
- 2 o3 {4 m# W- ~+ K9 J; X% U2 V9 y
- /* USER CODE BEGIN 3 */
7 J/ z, o: x) G - }( y" I$ n) w1 A
- /* USER CODE END 3 */- W+ A$ n$ u7 T- f
- }
复制代码 第二点:关于GPIO 的几个库函数使用说明: - //这是上一节讲到IO口初始化代码,该代码由STM32CubeMx 自动生成8 ~0 f- F- S0 h$ y9 \
- static void MX_GPIO_Init(void)
1 f( H4 s/ u7 u2 d$ _ - {
! j. |" ]" |9 | g* ]. ` - GPIO_InitTypeDef GPIO_InitStruct = {0};0 J0 b$ a. a; o0 a, O; a6 m
7 A* @ ]) |; i0 t; K; c- /* GPIO Ports Clock Enable */
2 N, o5 m9 `0 _8 M - __HAL_RCC_GPIOA_CLK_ENABLE();% p' C4 T$ F2 @+ M# |
- ' C" H- a9 o4 j. r% y
- /*Configure GPIO pin Output Level */
& P3 B9 @9 O, h$ v - HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);//默认输出高) H7 F1 I4 H2 Q
- 7 k# p3 c1 D, t: t* F, B' G0 u
- /*Configure GPIO pin : KEY1_Pin */
' ?6 c5 u. V; \0 l: J. Q$ R - //这是我们之前在上位机配置的参数,生成代码后就这是这样了0 `3 m/ V- _. o$ P) o
- GPIO_InitStruct.Pin = KEY1_Pin; //初始化KEY1引脚( E' I' U/ Q I* _. ~# M
- GPIO_InitStruct.Mode = GPIO_MODE_INPUT; //配置为输入模式( ]2 G: A5 C$ f# b. T" T% A7 ^
- GPIO_InitStruct.Pull = GPIO_PULLUP; //上拉输入; C) k0 r1 Z2 t7 g! D
- HAL_GPIO_Init(KEY1_GPIO_Port, &GPIO_InitStruct);
, x$ R; r! k. y6 O
H# u% f* o* {0 w1 g |. A- /*Configure GPIO pin : LED1_Pin */
9 e0 z! S4 P! F& h4 R: j - GPIO_InitStruct.Pin = LED1_Pin; //初始化LED1引脚
6 w( L$ O6 q: _; n - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //配置为输出模式
) a4 p/ A7 B: L3 Y( k0 Y4 Z' C7 y - GPIO_InitStruct.Pull = GPIO_PULLUP;//默认上拉输出7 |- ]. t" J4 {
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;//低速模式& @6 h- k. s, m( G
- HAL_GPIO_Init(LED1_GPIO_Port, &GPIO_InitStruct);! }! X% T, X- v+ X) c. d
- }
复制代码- /* HAL_GPIO_DeInit 重置IO口,恢复为默认状态
$ n. j6 n# C% B - . HAL_GPIO_ReadPin 读取IO口状态函数,需要把IO口配置为输入模式才可以读取到,这里注意一下
! R7 _' d& u7 f K! u" C5 q - · HAL_GPIO_WritePin 输出IO口状态函数,即对IO输出高电平/低电平( Z3 F: Y1 K1 d+ N& b
- . HAL_GPIO_TogglePin 输出IO口翻转函数,即对IO口取反( s8 x! I" W) G k
- . HAL_GPIO_LockPin 锁定IO口函数,读管脚值使用锁定,当这个管脚电平变化时保持锁定的值。 D! t4 d, J! }' w
- . HAL_GPIO_EXTI_IRQHandler 外部中断服务函数,详细使用,下期讲到!
) r& [) j8 j* W - . HAL_GPIO_EXTI_Callback 中断回调函数,详细使用,下期讲到!$ D" N4 l) Z8 U# s* ^
- */
- K5 g; a E8 _& B) x( t - void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin);) { D4 M5 p) @' f+ C/ I2 d
- GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);$ E$ h2 m3 W \3 A1 M
- void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);2 R; Y+ W! G2 Y" Y2 |+ |
- void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
2 Z4 ^) t7 W! `& @. a, [' a - HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
' q* W: ?. {( | - void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);
! d' O8 S' ^0 o - void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
) s: C2 ?" E: a
, u( _: F2 L0 L2 `5 V- //搞清楚每个功能函数的功能后,我们只需要直接调用即可:
% g! I* E- i' d1 ?8 o! S - //例:
+ u8 X7 q* \1 o7 C - if(!HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)) //如果KEY1 脚为低电平* r$ g9 G9 e5 V
- {
' F9 ?% U. a; f0 w0 ^) I/ S" o - HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET); //LED1输出高电平# t1 z1 f+ y; j# a! [
- HAL_Delay(1000); //延时函数1S* E3 e, L9 _/ @ i, v, _
- HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET); //LED1输出低电平- t: y# [ f7 U) r: B3 S
- HAL_Delay(1000); //延时函数1S# W( r' g. R1 h
- HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin); // LED1 翻转输出电平
D- f9 a( w2 {& F) c$ | - }
复制代码
6 I7 }8 ]' ~! c. x3 j: ]4 Y: v; S如果能理解到这里,恭喜你已经学会了IO的基本操作! 文章出处: 电子爱好者 $ I5 w; F: M% M
|