1.资源扩展板介绍
7 e+ r. [5 X ]& g1.1硬件介绍
6 Q) r; m6 h$ S# b# s
' \2 ^( p8 n; J) B3 G" ~- J: K2 A- @
' N+ M) e' ^, i2 s9 M; S% O8 P: `6 ]
; o0 M# P+ c- {1.2资源扩展板可开发项目5 s- z, E0 Z5 J# V O- q8 K
# {4 }5 y5 D# E( S3 A: N9 ?
* x& o1 n$ \3 l0 i5 s Z" G! }3 v4 i4 h
2.Cortex-M4 GPIO编程
+ J: [) g1 E4 e4 y( P* ]9 |2 x/ n2.1 实验目的6 F# j/ s" ]9 M6 K
熟悉STM32CubeIDE工具软件的使用。4 P7 q5 u8 m8 w$ e/ y+ |
! A, {$ p2 R* k$ K# Z* W) m3 m& C
掌握STM32CubeIDE软件的基本设计流程和设计步骤,能够使用工具进行设计、编程、仿真调试。
/ i& \8 g! D/ ?. ~& x4 G' _
& e( a- ?1 L! V学习GPIO口的使用方法,掌握如何利用STM32MP157A芯片的I/O口控制LED。" _/ B/ ~' B8 m6 r2 Q& \% P$ ^5 i
% U4 w0 y% r; ]/ H6 U9 F2.2 实验环境
# y( T1 C0 s0 m+ T! V1 GFS_MP1A开发平台% a% E: O0 L! I0 w, s# I: b4 T
) F- ]2 B, m6 Y
ST-Link仿真器
, v2 J" v( a5 c
4 j1 k1 b* {/ R6 ^) CSTM32CubeIDE开发软件# Y K" h. i& K2 L) S
$ T) W! `6 x5 Q) o4 t9 b
PC机 XP、Window7/10 (32/64bit)
* a) u' T; f0 d# o: Q+ l) C: \4 A7 f! a- ]; ~
2.3 实验原理$ t" \" _# ^) t' i5 m* g( T
只要是对硬件操作,就要首先查看原理图。查看外设是和模块的MCU的哪个引脚相连。FS_MP1A开发平台上的LED的亮灭状态,与芯片上的引脚I/O输出电平有关。
6 L) a# A/ E5 M- Y% ?% P P* L
* p, v- j A5 v0 |* DFS_MP1A开发平台上LED的I/O:
( O7 ? C$ { {8 m) c0 H( V( {7 t9 I/ R, x: H( E
/ o1 d2 i/ v0 I9 J3 G7 H7 d
) Z( Y2 a" Z v5 ]7 M. N
/ `% K* J# ^3 ]/ b7 k
$ f" O7 w5 X; v- /**
) i. V5 W/ x4 R, q3 ^5 W* z D - * @brief GPIO Init structure definition) h8 A! q8 t z' N. k$ s* d
- */ e" B4 x( g9 @. v0 I; R) q/ i/ v
- typedef struct
6 u2 r; N; o, U! i: Z5 z* P - {* a4 p @' s2 p' N) ^* j
- uint32_t Pin; /*!< Specifies the GPIO pins to be configured.
/ ] V* s; F7 d/ E* b - This parameter can be any value of @ref GPIO_pins_define */2 i; x; I$ {% S- v
& F, d. j3 X& Z7 `" a- uint32_t Mode; /*!< Specifies the operating mode for the selected pins." S. G. x7 Z- `
- This parameter can be a value of @ref GPIO_mode_define */
3 r8 ]# o/ G/ ]2 h% M- H/ Z
5 d8 W- L8 m# N4 V0 o0 z- uint32_t Pull; /*!< Specifies the Pull-up or Pull-Down activation for the selected pins.6 Y, q$ j/ N& R4 a4 U8 @% k
- This parameter can be a value of @ref GPIO_pull_define */7 M. F, K* H9 r4 T, D
- ; B6 }3 M7 j3 h- G: Y( }
- uint32_t Speed; /*!< Specifies the speed for the selected pins.6 Z+ E ]4 T( j4 G- w6 N" P3 B: N
- This parameter can be a value of @ref GPIO_speed_define */, b& B+ `- `! p7 Z1 |( B
- " C0 n$ k/ y8 ^8 N N3 m
- uint32_t Alternate; /*!< Peripheral to be connected to the selected pins.
* q" A9 m- ?$ T) A: e- @ - This parameter can be a value of @ref GPIO_Alternate_function_selection */
8 ~8 v& u/ f/ d2 l( P% E N) M - }GPIO_InitTypeDef;: \. O# p% b: P K( P
复制代码 . B1 p- b- L1 l- @/ _1 [
第一个成员变量Pin是所操作的管脚,第二个Mode是模式选择,第三个Pull是上拉下拉,或者都不加,第四个Speed是速度选择,第五个是管脚复用功能。一般我们只操作前四个。
+ h9 V& f( @3 z/ w5 A* Y( l6 Z2 y4 g+ L1 d$ L! T2 R3 y% v
IO口可以由软件配置成4种模式,其实操作的是GPIO的端口模式寄存器:- j5 a) Q" f3 @* D, ~8 @
5 p9 l; ~' D7 n# \8 L- W3 e% o输入(复位状态)/input(reset state)4 {7 v. ]" A+ t
: p9 J; D" I: z' g ~# @通用输出模式 / general purpose output mode* h$ c" I( b2 ]; k& N. _( C
6 J% S5 N$ k. j& s; J& c' m复用功能模式 / alternate function mode
, ?$ R# {- a( ?' Z* `3 |: J* L% z; g1 o, X5 ^
模拟模式 / analog mode& {& _ c K3 a7 N) z; s
4 o5 U6 X+ N3 `9 B- #define GPIO_MODE_INPUT ((uint32_t)0x00000000U) /*!< Input Floating Mode */
" J0 l' b# R2 D" U4 c - #define GPIO_MODE_OUTPUT_PP ((uint32_t)0x00000001U) /*!< Output Push Pull Mode */( b6 m! O" n- Z; z
- #define GPIO_MODE_OUTPUT_OD ((uint32_t)0x00000011U) /*!< Output Open Drain Mode *// s) |/ |$ T( ^8 `1 x" _ l1 B
- #define GPIO_MODE_AF_PP ((uint32_t)0x00000002U) /*!< Alternate Function Push Pull Mode */
& V! R; V9 U. n* j u - #define GPIO_MODE_AF_OD ((uint32_t)0x00000012U) /*!< Alternate Function Open Drain Mode */
复制代码
6 s' P. g; p. E* W4 X- q上面给两个寄存器赋值了,1~4位是GPIO端口模式寄存器,5~8位是端口输出类型寄存器(决定是推挽输出还是开漏输出)。- F) K/ [' V' R3 I( B" m7 f4 [: K
3 V9 J: u/ ^0 V# h
STM32的GPIO端口在作为输出时,可以软件配置端口最大支持的时钟速率,下图是端口输出速度寄存器,有以下几种速度选择:
( K0 D4 T8 B. R, G- z5 T: M5 t9 i! T' x! b) |1 Q0 Y! s4 _' R' S7 {
9 }, G: Z! b+ s+ _2 X; M/ ^
# J, |9 s' M! Z; Z
- /** @defgroup GPIO_speed_define GPIO speed define
' W5 Q7 }/ I9 q5 E) K# Y1 D - * @brief GPIO Output Maximum frequency- s1 }! B* T5 u2 @: `
- * @{% X& g, y$ ?$ p
- */
) P- O" T6 X2 L( c) b. n8 b6 h - #define GPIO_SPEED_FREQ_LOW ((uint32_t)0x00000000U) /*!< Low speed */
- B3 t: C( O' J - #define GPIO_SPEED_FREQ_MEDIUM ((uint32_t)0x00000001U) /*!< Medium speed */
" l/ R( j+ o7 ?5 Z+ b: n0 R7 s1 q - #define GPIO_SPEED_FREQ_HIGH ((uint32_t)0x00000002U) /*!< Fast speed */
2 e! F# s2 L( m0 _1 ~. n, q - #define GPIO_SPEED_FREQ_VERY_HIGH ((uint32_t)0x00000003U) /*!< High speed */
复制代码
. }* t j/ `3 M" _5 x' H" T( F9 kGPIO调用的HAL函数:
- X- T4 V; y; g6 A9 b
5 k& ^0 v; \8 `void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);3 c x! [9 V/ v9 l5 R
. y6 ~- b$ a7 T1 x
该函数其实是对BSRR寄存器进行操作。
( N3 X5 j6 w) T
0 A0 d: H- ~. P6 S$ a0 W; |第一个参数传的是GPIO所在的组,第二个是该组的几号管脚,第三个是对管脚进行置位。
' U( E7 T- D6 j: b& z& z. P+ ?# x! x8 c
2.4 实验步骤
. m; s1 V, _; o8 l% ], K打开STM32CubeIDE->File->New->STM32 Project
. y' `! Z2 w1 Y
* I$ Z. P/ g- W( |* a
. F9 W" \# ~0 L A' Q
9 O0 E$ d3 @2 b# ^: K可以在左侧搜索框内输入芯片型号STM32MP157A进行搜索,选择对应芯片,点击Next
3 D% l: D% ]: l. [. k' _. g# v6 V0 z; P; m) T
+ K' s ^ P; {$ C% F# u, P( L% I9 Y- M1 y
6 x) L7 E: S1 H' [
填写工程名,点击Finsh: Q2 a( i8 r" E( M* t
( L* A) x: w6 t, X+ b
6 _. p9 i0 W1 v3 q, F: S6 Y3 f
点击Yes打开配置页面
0 Z: t% A( |& b0 k! E: p% }" y* J2 Q# C
; v5 ^* d3 S9 g9 l6 E- X
: }0 q" E9 l, |; S
+ J6 a/ X- D- z c7 V5 A v; t4 z2 `* s
! S2 Z% l' T: b" L2 R0 B/ a
搜索框内搜索LED对应GPIO引脚PZ5、PZ6、PZ7,左键点击设置为GPIO_Output
8 y3 c0 [% |/ L
+ G' c9 ?* k) |5 w
# d5 x$ P# J# o
( x) }9 u6 i$ R7 A& I: z在Code Generator处选择为每个外设生成单独的C和H文件,这样设置方便阅读代码1 [: A1 a Y9 ]: [& p0 {
" i& w5 n/ z0 }' r8 p+ G+ P
) p. T6 o5 J. M* d6 M* B b; e, j( b' s$ b1 \) N' b
完成以上设置后,Ctrl+S保存,会提示是否需要生成代码,选择Yes即可自动生成代码。系统会自动生成System Clock代码
) o; R0 ]% a( \% Q) _ r" k
7 d. t4 u& l3 ?: c$ x5 C" @3 n$ S' [# e
- l( S2 N- b8 K( F0 l& W) Z9 o# }
可以在左侧工程文件夹找到LED_CM4子工程,打开main.c
7 l' p& @! t* d4 X& T( Y3 E* i/ E9 U8 |" ~, P
' Z7 B: K) ?) X+ s" @5 E* }$ d- X7 M. V& G) x
添加GPIO函数说明:
; N) b: W- H3 z& V8 v+ S$ T# }( \: s! n- U4 R
我们需要在main.c中添加GPIO相关函数,GPIO初始化函数和GPIO引脚输出电平高低函数- Y+ ]: B& \" _, B/ ]
8 y3 ` h/ c* y" L- void bsp_led_init(void)3 I: m; }; B; e1 S* O$ U( c
- {! ]+ M; R5 G* R* A1 `, Z
- GPIO_InitTypeDef GPIO_InitStruct;7 g) n3 I: c+ V
- __HAL_RCC_GPIOZ_CLK_ENABLE();2 U+ ]. }; v4 t' M( }& @
- HAL_GPIO_WritePin(GPIOZ, GPIO_PIN_5, GPIO_PIN_RESET);
' f% Y& v5 @& C% o% K+ p- ] - HAL_GPIO_WritePin(GPIOZ, GPIO_PIN_6, GPIO_PIN_RESET);. T! W$ P9 Y1 L( q3 g
- HAL_GPIO_WritePin(GPIOZ, GPIO_PIN_7, GPIO_PIN_RESET);
# V/ Q p' X% O6 x5 |5 V8 D - GPIO_InitStruct.Pin = GPIO_PIN_5;
: W6 K8 l! p/ F& P! S) U - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;7 s# V8 _+ R+ a2 L- B
- GPIO_InitStruct.Pull = GPIO_PULLUP;, h1 U" }5 l! a
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
7 R7 I# ]( h4 O4 C - HAL_GPIO_Init(GPIOZ, &GPIO_InitStruct);: H- z e8 [% v T' `8 w8 C
- GPIO_InitStruct.Pin = GPIO_PIN_6;
" ` Y- ~& S) Q- b8 X - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
/ c; a- R+ i: d }9 ^+ F1 D l t - GPIO_InitStruct.Pull = GPIO_PULLUP;# ~" Y/ c' t" s2 |/ C0 S" b5 e+ t
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
! X& E( x& C# V+ o - HAL_GPIO_Init(GPIOZ, &GPIO_InitStruct);, G2 x: _+ k9 i) w2 y
- GPIO_InitStruct.Pin = GPIO_PIN_7;
3 ^. E# }) B( e/ s: P1 T - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
2 v9 g& u1 [3 \1 r - GPIO_InitStruct.Pull = GPIO_PULLUP;5 N, p4 J1 [8 e# m
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;! ?% n' Q( @( j; V8 q6 j
- HAL_GPIO_Init(GPIOZ, &GPIO_InitStruct);) j L% k! [( @# k
- }, o5 M5 I# O6 T- @) b, R
- ( s: O( ]; n3 k
- void bsp_led_on(void)
& B9 K/ o) [/ K5 t+ @; x - {; _% D' e$ [: d2 Q+ M
- HAL_GPIO_WritePin(GPIOZ, GPIO_PIN_5,GPIO_PIN_SET);; k5 S m+ x6 F7 L
- HAL_GPIO_WritePin(GPIOZ, GPIO_PIN_6,GPIO_PIN_SET);2 F6 k7 C; R5 p7 V7 T( p0 o6 Z- t# `
- HAL_GPIO_WritePin(GPIOZ, GPIO_PIN_7,GPIO_PIN_SET);
7 @; D+ v; Q6 _# }5 T8 L1 W0 j9 f - }: q g6 N. k0 x' e$ G8 A
- void bsp_led_off(void)
' X4 K s- ` V - {# |+ L ]" W- U, N3 k$ L
- HAL_GPIO_WritePin(GPIOZ, GPIO_PIN_5,GPIO_PIN_RESET);. a9 N1 D3 h1 I% g
- HAL_GPIO_WritePin(GPIOZ, GPIO_PIN_6,GPIO_PIN_RESET);" I7 G6 E. C0 _- _8 m
- HAL_GPIO_WritePin(GPIOZ, GPIO_PIN_7,GPIO_PIN_RESET);
6 @) Y! y5 C- i - }
复制代码 - V+ M/ v. X) M: H. w( v# Z- l7 ^
在main.c中调用这三个函数实现GPIO的初始化和通过改变GPIO引脚高低电平来改变LED灯的状态4 H0 c4 z& G0 X
$ N e0 w" h: \( p, A8 \4 R. H, k
2 @' k. ?% Q4 H: _' q% t7 Z) Y+ ]) Z! q* [# r: W* h
上述为新建工程配置过程,可参考16.3.2章节进行导入已有工程,工程存放路径【华清远见-FS_MP1A开发资料\02-程序源码\ARM体系结构与接口技术\Cortex-M4部分\1_LED】) A. }9 V* D8 O8 K) U; I
2 ]" B6 H- a: U9 X/ r$ _: A8 M
配置完成或导入工程后进行程序下载,具体步骤参考16.3.3节进行开发板连接,程序编译、下载3 A+ p; D0 m* M' m
4 b1 ~, z4 N6 M2.5 实验现象
% C2 D/ Q% H) S5 b; l9 x可看到LED灯循环亮灭" r+ \9 J; h# H+ K! f
! f: y6 h/ i& p+ Y# y1 G- \4 l
! i V' T2 C, C
6 k2 m5 N+ j \% I* p4 K
————————————————
; E: ~% F7 i1 n) x# j7 H8 F& E版权声明:华清远见IT开放实验4 N) B# x; ~" W* f+ R
# J% b r3 M" ]# |9 g _# n |