第二章:STM32CubeMxGPIO基本使用方法 第一点:生成一个工程后,需要注意事项: 在STM32CubeMx软件本身生成的源文件中;用户的代码只可以写在以下区域,自己建立的源码文件不受影响: - //写在前面或后面在下次从STM32CubeMx 生成工程时会被清空掉!: R: T0 }* u& e G
- //包含库文件,所以尽量不要试图尝试修改库文件来达到功能需求!) ^+ B7 I% a, {9 x
- USER CODE BEGIN
$ Y% O+ c2 Q1 z: h
' T" ^, O& G* ^/ u' r- //只有这写在有编辑权限的代码区域中编写代码,才不会被清空掉,这里要注意一下!1 a- Z- U7 L; ]- r
- 用户可编写的代码区
g- G( w# p: V' u- I3 l# A
$ ^* t2 ~7 I- _) I. T4 \- USER CODE END
复制代码- /* Private includes ----------------------------------------------------------*/( G" m$ S* i+ d }+ B7 Y
- /* USER CODE BEGIN Includes */
, r8 d* {( Y3 _, z$ J6 w6 L9 a0 ] - 用户可编写的代码区4 l y: ^9 M! h0 J8 k( v" b/ R
- /* USER CODE END Includes */
, s4 f* r1 A+ W i8 J4 F' _- r& c8 m
: _) D4 m1 V g- Y; p8 A- /* Private typedef -----------------------------------------------------------*/6 I- |% B4 k; {# G5 t3 S6 F
- /* USER CODE BEGIN PTD */
, D2 z* I( ~ e& e7 F' B9 F6 ], h - 用户可编写的代码区3 Z5 |6 n9 z* d
- /* USER CODE END PTD */
7 r8 o6 p8 L. v8 m3 x - /* Private define ------------------------------------------------------------*/3 b( g; q6 L6 n
- /* USER CODE BEGIN PD */
7 C% }; J$ e1 J6 Y - 用户可编写的代码区7 _) B' c# E9 B$ D4 N
3 f3 W8 u0 t( [. L" ]6 c5 I- #define KEY1_Pin GPIO_PIN_11 //宏定义GPIO_PIN_11 为 KEY1_Pin
* {) q9 }/ b; @5 `/ L' w - #define KEY1_GPIO_Port GPIOA //宏定义GPIOA 为 KEY1_GPIO_Port 2 q! ?( Y! B& c
- #define LED1_Pin GPIO_PIN_12 //宏定义GPIO_PIN_12 为 LED1_Pin
# U, j/ `# \/ b% Z5 z - #define LED1_GPIO_Port GPIOA //宏定义GPIOA 为 KEY1_GPIO_Port ) K7 b- m( p7 p0 |7 C f! ~
- j) L( h# u: j5 I- G) r' R" @
- /* USER CODE END PD */
( z2 w$ m! w" ~, Q - 0 m1 t6 Z$ l T" j" c& S8 ~7 {+ F
- /* Private macro -------------------------------------------------------------*/
8 w8 j) k: j. f5 `' B/ k! i - /* USER CODE BEGIN PM */
0 Y5 K$ @0 }1 C - 用户可编写的代码区# F' M# c- j8 s4 T
- /* USER CODE END PM */
/ f$ V y7 p; T - D5 ^( K q5 d# Y
- /* Private variables ---------------------------------------------------------*/
4 N- q9 F. ~, q! ` g - 3 q/ |1 y- _- T3 O! M7 L. T" @) `
- /* USER CODE BEGIN PV */
# j; i$ o! w0 @2 L' h3 Z f - 用户可编写的代码区
: s0 j4 m. C7 ? - /* USER CODE END PV */
复制代码
0 P, \2 O! H6 E, f/ S - int main(void)
* @2 W& B' b. V, o" @$ m9 j - {
* p3 b1 C x/ m4 ^. _$ _ - /* USER CODE BEGIN 1 */2 _7 ^9 t( C; j* u# X
- 用户可编写的代码区
; V0 i9 {& t, }, I) | - /* USER CODE END 1 */; i4 q* c+ t8 T, T5 W
-
a! K* K, t- ?9 C) b - 2 k0 p% g4 S+ y, t% o
- /* MCU Configuration--------------------------------------------------------*/
& z% a7 G7 `4 a& F3 b6 F - 1 ~+ X, a6 _+ m7 J9 e" B- \, k2 ]
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */; [- [5 P5 V( U: M
- HAL_Init();9 ~" y- ?+ z. A- E; D1 z7 a+ s
3 v) @$ Q) a2 W$ ~+ Q/ ~- /* USER CODE BEGIN Init */9 \" i+ C6 }" C' D3 ?
- 用户可编写的代码区
- a' n) J; _. _+ l& V4 _% y H - /* USER CODE END Init */3 T: }- E7 Y& Z( l/ e; Z
- 8 A0 E+ S. O) _1 y/ P9 i! B4 f
- /* Configure the system clock */! \4 u- `/ H- m
- SystemClock_Config();
! [5 d% i P# q - & j* n- ~1 X" ?$ G8 A6 v
- /* USER CODE BEGIN SysInit */
1 }6 h2 }* w: g$ t2 q# K - 用户可编写的代码区' L; U0 h+ ]+ I A% O
- /* USER CODE END SysInit */
' c, T. n. o* t. P) ^2 M
, w' h: ]7 x2 h- /* Initialize all configured peripherals */4 g2 |6 ?9 ~. D# h' Q# U5 }
- MX_GPIO_Init();5 I: v/ C& w4 g+ M
- /* USER CODE BEGIN 2 */
. t1 y' r8 u' u; u. w0 r9 V - 用户可编写的代码区1 U, ~7 H& Q3 p: c c0 c
- /* USER CODE END 2 */
( n B& U4 {; |$ a5 M0 `! K! l
# U( n! G4 u. U) X+ s) o$ k- /* Infinite loop */
# D) t- y8 ~6 W- D* C& l0 B2 [ - /* USER CODE BEGIN WHILE */: \, U8 P! w0 ^& g3 |/ {: B
- while (1): w: R5 J2 k; q1 G" |2 E
- {
1 w! G: y& a) H# n, w - 用户可编写的代码区
' Y; {2 ]9 c! R - /* USER CODE END WHILE */ N1 D. I; x- s5 g/ {; ^! [1 o: H
, t5 A; }) `6 Y8 B5 k) K2 ]- /* USER CODE BEGIN 3 */
- G& C4 v! O" K2 M - }1 ^; b: r* ^% c0 Q( f6 ~
- /* USER CODE END 3 */" O) w) ?+ B6 J1 R7 z3 v2 J* f
- }
复制代码 第二点:关于GPIO 的几个库函数使用说明: - //这是上一节讲到IO口初始化代码,该代码由STM32CubeMx 自动生成
- h" p( [, y6 x' F6 }4 C* n5 _6 | - static void MX_GPIO_Init(void)) t5 B7 x7 r5 R3 y8 `3 l/ Z5 Z: C/ o
- {
; v: s8 y* P5 j2 F' v - GPIO_InitTypeDef GPIO_InitStruct = {0};
. {0 K' [9 ~1 X* |" {
& Y$ R7 {2 j2 F" ]! G- /* GPIO Ports Clock Enable */' o7 C) e; ^+ ]) l C4 i# Y
- __HAL_RCC_GPIOA_CLK_ENABLE();- X- p8 ^* e* v* T8 u! e0 r
- , N- @, c' ~* |
- /*Configure GPIO pin Output Level */
8 W+ q5 Q6 a! s, u7 }7 n) R1 k% b - HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);//默认输出高9 C/ f- M1 i. I
- H2 W- k: A0 B. Y- /*Configure GPIO pin : KEY1_Pin */ : a% p# J2 ^4 o6 }2 ]8 ^& m" E( H
- //这是我们之前在上位机配置的参数,生成代码后就这是这样了
j' B/ Y& P; m+ l5 P! y - GPIO_InitStruct.Pin = KEY1_Pin; //初始化KEY1引脚. s5 h3 S( N# ^7 M: C4 W8 [. w
- GPIO_InitStruct.Mode = GPIO_MODE_INPUT; //配置为输入模式1 G9 K2 r' o- L2 t% b
- GPIO_InitStruct.Pull = GPIO_PULLUP; //上拉输入
$ I( W" g( k5 t1 }( X$ `4 I - HAL_GPIO_Init(KEY1_GPIO_Port, &GPIO_InitStruct);
; I1 G; @* H5 t - 8 \! F$ I6 S* d! @7 ?, _7 a$ z* S5 ^
- /*Configure GPIO pin : LED1_Pin */
. h; n+ o" d; B) \* j& ^: I$ _7 V - GPIO_InitStruct.Pin = LED1_Pin; //初始化LED1引脚
; g2 ?2 F8 |# w+ x/ P& @' ?$ J, P - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //配置为输出模式" f1 J4 u) P. R( d/ W
- GPIO_InitStruct.Pull = GPIO_PULLUP;//默认上拉输出) @6 h; S6 Q% u# x$ D& ~$ u
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;//低速模式# i b( c" Q6 o, v
- HAL_GPIO_Init(LED1_GPIO_Port, &GPIO_InitStruct);
2 @# _4 l5 p4 D1 }. z - }
复制代码- /* HAL_GPIO_DeInit 重置IO口,恢复为默认状态
% q e p: k( G- Z' _( h) H0 P I' z - . HAL_GPIO_ReadPin 读取IO口状态函数,需要把IO口配置为输入模式才可以读取到,这里注意一下
; i# u3 S9 h/ s, v9 h1 } - · HAL_GPIO_WritePin 输出IO口状态函数,即对IO输出高电平/低电平) a: U1 i* R" l1 c" o
- . HAL_GPIO_TogglePin 输出IO口翻转函数,即对IO口取反# x# g9 f/ P1 A; {5 ~
- . HAL_GPIO_LockPin 锁定IO口函数,读管脚值使用锁定,当这个管脚电平变化时保持锁定的值。- W% n- N9 ^- |# n
- . HAL_GPIO_EXTI_IRQHandler 外部中断服务函数,详细使用,下期讲到!
, k0 M; s8 b- V" U" d! i: N; p - . HAL_GPIO_EXTI_Callback 中断回调函数,详细使用,下期讲到!
1 R+ Y* I/ ?, u u+ J7 F - */
2 d; t P- R6 F - void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin);
# v' N/ D* F# u7 R; X2 Y, [ - GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
% z1 s" Z) j: A! o; T9 r0 i: n' C- k - void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
) O) Q: ~% c: p1 {/ r! ? - void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
, g! F- C$ X6 e. R. J( o4 b$ M - HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
: C5 Q5 b5 t2 x. g" p# c - void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);
9 Y+ P9 `2 r' T) D, i' U9 `4 {& w - void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);2 _8 W2 g$ N/ m0 S* R% ~& n
- ( ^% S5 i- {* X8 E
- //搞清楚每个功能函数的功能后,我们只需要直接调用即可:$ W. f3 v( y- J" i* [$ H8 y
- //例:/ Q5 f4 A- I$ E1 G: Z& C# E
- if(!HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)) //如果KEY1 脚为低电平1 c* U+ L6 ^3 \, H) k6 z1 r
- {( B# S2 f3 k8 `" [1 i; h
- HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET); //LED1输出高电平
4 X |. P/ `& F9 r0 P: @/ V - HAL_Delay(1000); //延时函数1S# G( C( X9 d3 Z7 O: S8 \! `! I7 r ]
- HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET); //LED1输出低电平
" L: P$ f. x. u/ Z& Z* Q, j8 h - HAL_Delay(1000); //延时函数1S6 C9 B$ C' y Q$ i
- HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin); // LED1 翻转输出电平 p3 w8 s; p" r4 `9 K" v1 k
- }
复制代码
2 I. D3 q1 k7 J8 S. q, O$ V( ]如果能理解到这里,恭喜你已经学会了IO的基本操作! 文章出处: 电子爱好者
5 O; q( Z! o" \ |