你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32mp1 Cortex M4开发篇2:通过GPIO点亮LED灯详解

[复制链接]
STMCU小助手 发布时间:2022-10-2 10:08
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- @ 2a60597904b14da696b646f8afbdf7d2.png
' 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 ?
b92e4e61eb734b448ea07a13872f58cf.png
* 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
12a5f29b4d274dbfbaeddafdbad708d4.png
/ o1 d2 i/ v0 I9 J3 G7 H7 d
) Z( Y2 a" Z  v5 ]7 M. N bc2bacdc7cf8926b4d070815b8027393.png / `% K* J# ^3 ]/ b7 k

$ f" O7 w5 X; v
  1. /**
    ) i. V5 W/ x4 R, q3 ^5 W* z  D
  2.   * @brief   GPIO Init structure definition) h8 A! q8 t  z' N. k$ s* d
  3.   */  e" B4 x( g9 @. v0 I; R) q/ i/ v
  4. typedef struct
    6 u2 r; N; o, U! i: Z5 z* P
  5. {* a4 p  @' s2 p' N) ^* j
  6.   uint32_t Pin;       /*!< Specifies the GPIO pins to be configured.
    / ]  V* s; F7 d/ E* b
  7.                            This parameter can be any value of @ref GPIO_pins_define */2 i; x; I$ {% S- v

  8. & F, d. j3 X& Z7 `" a
  9.   uint32_t Mode;      /*!< Specifies the operating mode for the selected pins." S. G. x7 Z- `
  10.                            This parameter can be a value of @ref GPIO_mode_define */
    3 r8 ]# o/ G/ ]2 h% M- H/ Z

  11. 5 d8 W- L8 m# N4 V0 o0 z
  12.   uint32_t Pull;      /*!< Specifies the Pull-up or Pull-Down activation for the selected pins.6 Y, q$ j/ N& R4 a4 U8 @% k
  13.                            This parameter can be a value of @ref GPIO_pull_define */7 M. F, K* H9 r4 T, D
  14. ; B6 }3 M7 j3 h- G: Y( }
  15.   uint32_t Speed;     /*!< Specifies the speed for the selected pins.6 Z+ E  ]4 T( j4 G- w6 N" P3 B: N
  16.                            This parameter can be a value of @ref GPIO_speed_define */, b& B+ `- `! p7 Z1 |( B
  17. " C0 n$ k/ y8 ^8 N  N3 m
  18.   uint32_t Alternate;  /*!< Peripheral to be connected to the selected pins.
    * q" A9 m- ?$ T) A: e- @
  19.                             This parameter can be a value of @ref GPIO_Alternate_function_selection */
    8 ~8 v& u/ f/ d2 l( P% E  N) M
  20. }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
  1. #define  GPIO_MODE_INPUT        ((uint32_t)0x00000000U)   /*!< Input Floating Mode                 */
    " J0 l' b# R2 D" U4 c
  2. #define  GPIO_MODE_OUTPUT_PP    ((uint32_t)0x00000001U)   /*!< Output Push Pull Mode               */( b6 m! O" n- Z; z
  3. #define  GPIO_MODE_OUTPUT_OD    ((uint32_t)0x00000011U)   /*!< Output Open Drain Mode              *// s) |/ |$ T( ^8 `1 x" _  l1 B
  4. #define  GPIO_MODE_AF_PP        ((uint32_t)0x00000002U)   /*!< Alternate Function Push Pull Mode   */
    & V! R; V9 U. n* j  u
  5. #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 {
1ebed7c1b3fa224312523a34cf1866a0.png 9 }, G: Z! b+ s+ _2 X; M/ ^
# J, |9 s' M! Z; Z
  1. /** @defgroup GPIO_speed_define  GPIO speed define
    ' W5 Q7 }/ I9 q5 E) K# Y1 D
  2.   * @brief GPIO Output Maximum frequency- s1 }! B* T5 u2 @: `
  3.   * @{% X& g, y$ ?$ p
  4.   */
    ) P- O" T6 X2 L( c) b. n8 b6 h
  5. #define  GPIO_SPEED_FREQ_LOW         ((uint32_t)0x00000000U)  /*!< Low speed     */
    - B3 t: C( O' J
  6. #define  GPIO_SPEED_FREQ_MEDIUM      ((uint32_t)0x00000001U)  /*!< Medium speed  */
    " l/ R( j+ o7 ?5 Z+ b: n0 R7 s1 q
  7. #define  GPIO_SPEED_FREQ_HIGH        ((uint32_t)0x00000002U)  /*!< Fast speed    */
    2 e! F# s2 L( m0 _1 ~. n, q
  8. #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 da7c6d7be70239aa59eb5c4cf4442a66.png
. 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
46e28e4d9521d952f2c8d1276c26f75a.png + 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 1dad455731ecf6ac07bd8b523f7cc553.png
6 _. p9 i0 W1 v3 q, F: S6 Y3 f
点击Yes打开配置页面
0 Z: t% A( |& b0 k! E: p% }" y* J2 Q# C
779124fadda91a30d693827d13f0b839.png ; v5 ^* d3 S9 g9 l6 E- X
: }0 q" E9 l, |; S
d8a12bb89ade8ee5054b4aae3617f128.png + 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 5974ae97a673fd4d70d39559964578eb.png # 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 6ceb1946762c4a0c36394555617e08cf.png
) 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
f349a5799c79819ff3a3bca8f3b50d86.png
' 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
  1. void bsp_led_init(void)3 I: m; }; B; e1 S* O$ U( c
  2. {! ]+ M; R5 G* R* A1 `, Z
  3. GPIO_InitTypeDef GPIO_InitStruct;7 g) n3 I: c+ V
  4. __HAL_RCC_GPIOZ_CLK_ENABLE();2 U+ ]. }; v4 t' M( }& @
  5. HAL_GPIO_WritePin(GPIOZ, GPIO_PIN_5, GPIO_PIN_RESET);
    ' f% Y& v5 @& C% o% K+ p- ]
  6. HAL_GPIO_WritePin(GPIOZ, GPIO_PIN_6, GPIO_PIN_RESET);. T! W$ P9 Y1 L( q3 g
  7. HAL_GPIO_WritePin(GPIOZ, GPIO_PIN_7, GPIO_PIN_RESET);
    # V/ Q  p' X% O6 x5 |5 V8 D
  8. GPIO_InitStruct.Pin = GPIO_PIN_5;
    : W6 K8 l! p/ F& P! S) U
  9. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;7 s# V8 _+ R+ a2 L- B
  10. GPIO_InitStruct.Pull = GPIO_PULLUP;, h1 U" }5 l! a
  11. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    7 R7 I# ]( h4 O4 C
  12. HAL_GPIO_Init(GPIOZ, &GPIO_InitStruct);: H- z  e8 [% v  T' `8 w8 C
  13. GPIO_InitStruct.Pin = GPIO_PIN_6;
    " `  Y- ~& S) Q- b8 X
  14. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    / c; a- R+ i: d  }9 ^+ F1 D  l  t
  15. GPIO_InitStruct.Pull = GPIO_PULLUP;# ~" Y/ c' t" s2 |/ C0 S" b5 e+ t
  16. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    ! X& E( x& C# V+ o
  17. HAL_GPIO_Init(GPIOZ, &GPIO_InitStruct);, G2 x: _+ k9 i) w2 y
  18. GPIO_InitStruct.Pin = GPIO_PIN_7;
    3 ^. E# }) B( e/ s: P1 T
  19. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    2 v9 g& u1 [3 \1 r
  20. GPIO_InitStruct.Pull = GPIO_PULLUP;5 N, p4 J1 [8 e# m
  21. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;! ?% n' Q( @( j; V8 q6 j
  22. HAL_GPIO_Init(GPIOZ, &GPIO_InitStruct);) j  L% k! [( @# k
  23. }, o5 M5 I# O6 T- @) b, R
  24. ( s: O( ]; n3 k
  25. void bsp_led_on(void)
    & B9 K/ o) [/ K5 t+ @; x
  26. {; _% D' e$ [: d2 Q+ M
  27. HAL_GPIO_WritePin(GPIOZ, GPIO_PIN_5,GPIO_PIN_SET);; k5 S  m+ x6 F7 L
  28. HAL_GPIO_WritePin(GPIOZ, GPIO_PIN_6,GPIO_PIN_SET);2 F6 k7 C; R5 p7 V7 T( p0 o6 Z- t# `
  29. HAL_GPIO_WritePin(GPIOZ, GPIO_PIN_7,GPIO_PIN_SET);
    7 @; D+ v; Q6 _# }5 T8 L1 W0 j9 f
  30. }: q  g6 N. k0 x' e$ G8 A
  31. void bsp_led_off(void)
    ' X4 K  s- `  V
  32. {# |+ L  ]" W- U, N3 k$ L
  33. HAL_GPIO_WritePin(GPIOZ, GPIO_PIN_5,GPIO_PIN_RESET);. a9 N1 D3 h1 I% g
  34. HAL_GPIO_WritePin(GPIOZ, GPIO_PIN_6,GPIO_PIN_RESET);" I7 G6 E. C0 _- _8 m
  35. HAL_GPIO_WritePin(GPIOZ, GPIO_PIN_7,GPIO_PIN_RESET);
    6 @) Y! y5 C- i
  36. }
复制代码
- 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
df22eef5354d2e524c89d65735a48139.png
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
0b865a950943721a3bc8a322c328b8cf.png ! 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
5a037ac46b95f7fb8ab57c65a3599731.png
赞 收藏 评论0 发布时间:2022-10-2 10:08

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版