|
第二章:STM32CubeMxGPIO基本使用方法 第一点:生成一个工程后,需要注意事项: 在STM32CubeMx软件本身生成的源文件中;用户的代码只可以写在以下区域,自己建立的源码文件不受影响: - //写在前面或后面在下次从STM32CubeMx 生成工程时会被清空掉!
/ x( L' d2 J# F8 l& y - //包含库文件,所以尽量不要试图尝试修改库文件来达到功能需求!# {$ k* ]" A4 ] z
- USER CODE BEGIN0 O. F# m/ O- S' Z/ l1 f2 s1 l
2 V" V7 a1 d8 e- //只有这写在有编辑权限的代码区域中编写代码,才不会被清空掉,这里要注意一下!+ E; h9 i' i7 b+ ~
- 用户可编写的代码区. ]5 L& t# f6 q5 I) Y9 X8 P$ r
- # I. r) t! H3 F9 X5 ]
- USER CODE END
复制代码- /* Private includes ----------------------------------------------------------*/
- i& C( @& {0 \# U4 o( G - /* USER CODE BEGIN Includes */% l- z+ M. i7 p0 B
- 用户可编写的代码区
+ p5 d- _! a/ I3 M1 L - /* USER CODE END Includes */3 y. j, m: }5 E9 B" y6 k
5 q+ _4 p: _3 j: U- a1 N2 w, P# v- /* Private typedef -----------------------------------------------------------*/
0 T) N' ~; A7 T H6 ?- o - /* USER CODE BEGIN PTD */
0 T/ {4 R& L6 h - 用户可编写的代码区
0 d7 a* N1 Q" K - /* USER CODE END PTD */
4 h7 z; n5 O" U9 } - /* Private define ------------------------------------------------------------*/
9 b* F: t& B/ f% ]+ d - /* USER CODE BEGIN PD */
* K! r3 k+ F8 n7 V! ~; B; t" }. Z+ J - 用户可编写的代码区
9 y, E' Z3 j$ ^8 G% q' o
9 k9 s& B3 K1 d; {+ S- [5 A- o- #define KEY1_Pin GPIO_PIN_11 //宏定义GPIO_PIN_11 为 KEY1_Pin
# A5 ^# Q5 g1 Y1 {; k - #define KEY1_GPIO_Port GPIOA //宏定义GPIOA 为 KEY1_GPIO_Port ) L. r4 i8 ]5 ?# m. M4 l
- #define LED1_Pin GPIO_PIN_12 //宏定义GPIO_PIN_12 为 LED1_Pin
, t! t5 w; M0 G; v0 O5 j - #define LED1_GPIO_Port GPIOA //宏定义GPIOA 为 KEY1_GPIO_Port
+ D4 a9 s, x, i4 N( p3 C1 E - & V% }$ f) Y5 J0 f- i8 K
- /* USER CODE END PD */
+ p6 |6 u" b, p* Q" h6 n - " o. @3 d' j. C2 c% ^) p
- /* Private macro -------------------------------------------------------------*/ l* d& d( w8 O$ |$ X
- /* USER CODE BEGIN PM *// a2 I$ v( p+ _" b- W4 g
- 用户可编写的代码区
2 e- f& E1 H @/ y V+ m( w. \/ v - /* USER CODE END PM */
0 N/ V/ _" z. e' J2 ^5 h8 l - * T& ^% e( |' j
- /* Private variables ---------------------------------------------------------*/
$ \3 W9 I; n2 _! O' e8 o - # ], N3 M% ^8 D& z1 S5 `# F
- /* USER CODE BEGIN PV */6 e1 S# T/ z# L) {9 x( }# t- ^
- 用户可编写的代码区5 j5 x2 C6 O3 `' |% t" w0 W
- /* USER CODE END PV */
复制代码 % b8 ^3 L% Q s; ?8 B" m2 P
- int main(void)0 T. X5 x- }+ H! p
- {! E) D- P4 C* T
- /* USER CODE BEGIN 1 */' N& V( n$ d! m5 O6 A( m& e. W' V
- 用户可编写的代码区7 D2 H" \& ~& \) a) a
- /* USER CODE END 1 */; a3 o* s" H! ~) v
- h- C) P$ K0 @3 z) g
A0 S. p. a3 ]) }, h& c2 Y5 f- /* MCU Configuration--------------------------------------------------------*/
+ ]$ t B6 Q$ ~# _2 l. j
0 e3 M; ~8 l A, g( _3 i' x- `( Z- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */0 R. U" H: M8 l4 v8 ^
- HAL_Init();& i" Z1 n+ N: N% r
- - Z5 S. F, B8 x" o
- /* USER CODE BEGIN Init */
: |# U9 M) p+ t3 W" _ - 用户可编写的代码区1 s# | @- t; ?( k% ]
- /* USER CODE END Init */
% s6 T" _6 B$ }' F- L, a - 9 F, }) P! L. f8 a. s2 f" i" R1 h
- /* Configure the system clock */5 P) i) w p2 u4 {
- SystemClock_Config();
8 `. X2 ?6 }- f3 x4 } - ( C7 f- Z: J1 p9 S. O/ ?4 w# W
- /* USER CODE BEGIN SysInit */2 }& |+ p% M1 z( t9 J, {
- 用户可编写的代码区6 b5 c& _! J" {# d
- /* USER CODE END SysInit */3 l/ \9 T$ [: B8 l
- 1 ]( f8 @2 G# A4 n! n" `
- /* Initialize all configured peripherals */
5 D( b+ O% C- @8 i' s6 ~ - MX_GPIO_Init();
/ |2 a. |" ~4 k9 V5 i5 G - /* USER CODE BEGIN 2 */
+ F" H# [0 I7 y$ i - 用户可编写的代码区
- \# y- O) @4 U - /* USER CODE END 2 */5 J; z9 g- x# K/ y; F$ y4 g
9 e/ O( I2 w; A9 G6 U" |2 r1 U ?- /* Infinite loop */
# S" A' o# G# s( O7 ]0 K7 V) l - /* USER CODE BEGIN WHILE */
7 x. A" P5 J' e( d - while (1)
. Q4 l1 [5 v! @3 y+ T, d; T) @ - { ?2 c6 U0 F* B) e; {: u
- 用户可编写的代码区( Y2 s5 f3 A1 T
- /* USER CODE END WHILE */) |9 i8 R: `3 ? y
- % Z, h3 b5 i, }, e
- /* USER CODE BEGIN 3 */
6 M4 I' n& }! U% u3 G - }
* W& S" L5 x5 Y, B - /* USER CODE END 3 */. a1 o e0 P- `& Z3 G% s
- }
复制代码 第二点:关于GPIO 的几个库函数使用说明: - //这是上一节讲到IO口初始化代码,该代码由STM32CubeMx 自动生成
- Q1 x: i0 L+ L3 b2 w- u2 c - static void MX_GPIO_Init(void)
3 b% R; @' d( ~3 F) K9 O - {
- I5 P. a2 i5 b* K - GPIO_InitTypeDef GPIO_InitStruct = {0};
- w" g* f9 k% c+ R0 m, M
2 i7 F3 _; O M4 }$ C. U- /* GPIO Ports Clock Enable */5 ^. Q- A- c5 i5 ^% f
- __HAL_RCC_GPIOA_CLK_ENABLE();
; R9 x: l* U! [* B3 \) C5 W+ @( p6 K
& E( [7 r8 ~2 z( P Y- /*Configure GPIO pin Output Level */: O) \* V/ u: l) \! p9 i ~# T( Y" n
- HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);//默认输出高6 |1 j6 {% |( r. d' ?" t
; {7 t% r v, Q/ V- /*Configure GPIO pin : KEY1_Pin */ 3 H+ Q/ V3 p& {6 y+ s1 s
- //这是我们之前在上位机配置的参数,生成代码后就这是这样了
2 X! F# ?. {$ v; K* W - GPIO_InitStruct.Pin = KEY1_Pin; //初始化KEY1引脚' ~1 m! p& T% l b% |' O; G
- GPIO_InitStruct.Mode = GPIO_MODE_INPUT; //配置为输入模式
: ~; V4 q% r# D4 N( E - GPIO_InitStruct.Pull = GPIO_PULLUP; //上拉输入9 T; ^5 P2 Y& L5 Q" y3 E, A
- HAL_GPIO_Init(KEY1_GPIO_Port, &GPIO_InitStruct);
2 b, p% D0 |" u9 u - 2 f9 l6 h/ ~1 O& I. K, D
- /*Configure GPIO pin : LED1_Pin */
8 u/ O! _( ]; J" F- w$ ^ - GPIO_InitStruct.Pin = LED1_Pin; //初始化LED1引脚
- @& ?0 t) ^1 _; r - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //配置为输出模式' A4 r+ k' D8 [: v# w0 Z7 d
- GPIO_InitStruct.Pull = GPIO_PULLUP;//默认上拉输出
- N( r' R3 O4 f1 k- l! { - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;//低速模式: H5 a8 S& z2 `1 [
- HAL_GPIO_Init(LED1_GPIO_Port, &GPIO_InitStruct);
0 h; p! L$ Q3 Q1 P1 _, [# i9 E - }
复制代码- /* HAL_GPIO_DeInit 重置IO口,恢复为默认状态' a/ {7 D; I& _7 N! Z+ D1 s
- . HAL_GPIO_ReadPin 读取IO口状态函数,需要把IO口配置为输入模式才可以读取到,这里注意一下
4 b* M8 Z" k: p/ e) p) Z$ p - · HAL_GPIO_WritePin 输出IO口状态函数,即对IO输出高电平/低电平
8 O" B; V5 Z$ L8 u! M& p - . HAL_GPIO_TogglePin 输出IO口翻转函数,即对IO口取反
% @% N4 |9 @) S; N - . HAL_GPIO_LockPin 锁定IO口函数,读管脚值使用锁定,当这个管脚电平变化时保持锁定的值。+ r9 n, x6 ]# {4 i
- . HAL_GPIO_EXTI_IRQHandler 外部中断服务函数,详细使用,下期讲到!
# ^" p) }0 t4 A6 T: |4 r( J) q& B - . HAL_GPIO_EXTI_Callback 中断回调函数,详细使用,下期讲到!- V$ Z: b x- ?5 L4 P6 d$ B9 B& p+ x
- */
1 ]3 i; x. I Q - void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin);/ j/ v- T m: N" Z! o1 E
- GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
) a8 V* e0 U4 b5 ~7 d - void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);8 u5 ~* X2 p" D: Z/ o- C
- void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
* [6 n/ s* K6 o - HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);5 ?! w' R: b/ ^. M$ a
- void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);
9 A* r0 f3 r6 ~9 b; L - void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);' l% r: h+ ^/ L' l) L
- % j1 G+ l$ I4 ^2 Q1 u% K1 w
- //搞清楚每个功能函数的功能后,我们只需要直接调用即可:
# e5 o4 ^/ p b: ~3 _/ w" u - //例:( P2 s* |& B% x7 z
- if(!HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)) //如果KEY1 脚为低电平
# f6 ~7 q; s. u% |5 a0 F6 ~6 Q - {- K' E" i- b: S8 a" c& d: h
- HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET); //LED1输出高电平
' n9 L0 A5 P5 z7 o - HAL_Delay(1000); //延时函数1S
/ ]# [9 N% }! k6 ^9 n - HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET); //LED1输出低电平4 F$ Z( q# g* U+ s- q
- HAL_Delay(1000); //延时函数1S
/ ]- N: c1 G" R3 _" j* `4 V6 X - HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin); // LED1 翻转输出电平
+ C+ c3 X9 o* W4 K& k+ P( N- O9 p - }
复制代码
$ s0 u% L4 B) E# W" H5 _如果能理解到这里,恭喜你已经学会了IO的基本操作! 文章出处: 电子爱好者 . Y, M8 C( T& _, K9 f% l% W- ^
|