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

【经验分享】使用STM32G4 ----点亮LED

[复制链接]
STMCU小助手 发布时间:2021-11-13 00:01
1.使用keil5的注意事项
8 }/ m) K6 Q1 l! ~) Z9 M  w用STM32Cube生成程序驱动后 将程序写到以下范围内,以程序保证用STM32Cube重新生成工程后不被删除 。$ K8 A$ j6 @+ z5 p
  1. /* USER CODE BEGIN 1 */     //代码开始# ]) S8 [$ _8 v9 \

  2. # R# x6 r7 |8 ?0 n$ {6 E# @+ N
  3. /* USER CODE END 1 */                //代码结束
复制代码

2 k4 |- R$ K2 Z4 n5 e  O* j

) D/ ]% s6 Z! p( [6 W2 y8 T2.HAL库延时函数
# p, V- ^% i+ E/ Z4 s' }/ L" yHAL库自带延时函数(毫秒,阻塞)
9 ]- {2 m+ S; E# j9 P4 t
  1. HAL_Delay(x);+ v/ P4 |) n$ i6 m& A$ y1 N
  2. 实际延时时间为(x+1)ms
复制代码
HAL库函数为了防止无意义延时(即0ms延时)的产生,在HAL_Delay函数传入参数之后会对参数加1。 如果使用HAL库默认延时函数进行延时,实际延时时间将会比预期时间多1ms。换句话说,HAL_Delay函数至少会产生1ms的延时。0 b: @1 d3 l: G  P
6 P% {' G, n  C) A( E  L
重新定义延时函数,非阻塞式延时  e" C/ F2 z" }* d6 g
  1. void Delay_us(int16_t nus) 7 M1 M' m9 z6 H
  2. {6 l' ]! w6 ]! \  M& m% S
  3.   int32_t temp; 7 e6 F: f7 I' v9 z& |
  4.   SysTick->LOAD = nus*9; //72MHz
    , B; @6 o0 b% y+ Y, c% H& C9 d3 K
  5.   SysTick->VAL=0X00;& r. F: x9 t; h: ^3 W. p
  6.   SysTick->CTRL=0X01;  `2 \$ C) S: T5 j" G; p( A  X# _
  7.   do 5 d( d: G2 ]/ l% k; K$ [
  8.   { ! x! I' T1 G: `9 c
  9.     temp=SysTick->CTRL;( A& c6 _4 v2 U$ z
  10.   }1 t5 p; I4 X/ f4 B7 Q6 ]
  11.   while((temp&0x01)&&(!(temp&(1<<16))));
    - [* i6 f& {9 L; d# w, s

  12. ( v$ s- p0 t; H/ S& A8 N
  13.   SysTick->CTRL=0x00;
    / c; _7 s4 ~& B/ r9 l3 \& _8 \# p- D
  14.   SysTick->VAL =0X00;
    % A' U4 q3 z. ~! j4 w- y; R
  15. }
    3 Z2 F7 g( |  \$ Z" }% p
复制代码

" v3 I) n2 H: ^# Q8 c3.HAL库配置GPIO
  ~* X- l1 v3 u% n' W) k" d3 o
  1. void              HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init);, K3 D0 u5 S0 w# {/ n/ b
  2. void              HAL_GPIO_DeInit(GPIO_TypeDef  *GPIOx, uint32_t GPIO_Pin);
    6 N, `% c$ P( M
  3. GPIO_PinState     HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);  //端口输入读取函数! [% c$ e- Y7 m& Q
  4. void              HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); //端口输出控制函数7 E+ [) k$ G% Z- j+ s/ w
  5. void              HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);  //端口输出翻转函数
    ' D% W& [- O$ ^' q$ q
  6. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
    $ Q; A5 o3 l& Q. H" E3 Q) d
  7. void              HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);
    ; a3 p: s5 l& j' f$ @1 B
  8. void              HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
复制代码
解释:
7 r6 k$ K* t* `0 N9 p, `" x4 T* a) i5 N1 t
HAL_GPIO_Init
9 K& ]6 o0 G1 D' X& R6 q7 ]初始化我们需要用到的引脚的工作模式,包括具体引脚的工作速度、是否复用模式、上下拉等等参数。4 g' ^/ j, j4 e/ y" s8 U
  1. void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
复制代码
3 W: N9 l6 P7 z. d+ Z
HAL_GPIO_DeInit
! V8 Q5 v0 H% p. N0 s将初始化之后的引脚恢复成默认的状态–各个寄存器复位时的值  g6 J% `; [5 D. J
  1. void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)- \- I1 v% c) p5 ?+ I
  2. 例:HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);
复制代码

8 J1 w& s7 C1 y" x! k( x( nHAL_GPIO_ReadPin
* @# Q; I6 ~6 d! E4 l$ e读取我们想要知道的引脚的电平状态、函数返回值为0或1。' F' q2 v& B- i  A9 z$ O
  1. GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)" o6 F+ i+ Z4 s- Q% `, M
  2. 例:pin_State = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_9);
复制代码
  z: T$ d: t' Z! V" I$ X6 w
HAL_GPIO_WritePin
. }2 {3 u/ K( s4 |0 P给某个引脚写0或1,但是不要理解成,写1就是使能之类的意思,有些寄存器写1是擦除的意思3 |7 h* X# x+ j0 l. |4 |' R# v
  1. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
    ) y' X( N7 o( I
  2. 例:HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9,GPIO_PIN_RESET)
复制代码
, F7 h+ m* {  Z  L; w
HAL_GPIO_TogglePin
7 S6 n' a/ p  T翻转某个引脚的电平状态
6 c# h; Z4 J( ?
  1. void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
    * |! F2 o: l6 [3 T( X0 @
  2. 例:HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9);
复制代码

7 V4 B0 w$ [: H$ j. g0 z+ mHAL_GPIO_LockPin
/ W( c* l0 \1 n) o; {! x& F5 B如果一个管脚的当前状态是1,读管脚值使用锁定,当这个管脚电平变化时保持锁定时的值,直到重置才改变! n9 y0 `" _" P. J& y/ @3 ~/ Q5 l
  1. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)8 A/ U; B% p; l2 }- M
  2. 例:
    / W6 p4 Q5 `6 g) J  B4 m2 K$ @
  3. HAL_StatusTypeDef hal_State;0 c( ~2 X3 p& K4 E. D
  4. hal_State = HAL_GPIO_LockPin(GPIOF, GPIO_PIN_9);
复制代码

. _6 S& M7 e) |) @* q& o; o# YHAL_GPIO_EXTI_IRQHandler/ o: m' f" ?$ s4 _- Y- D; c
这个函数是外部中断服务函数,用来响应外部中断的触发,函数实体里面有两个功能,1是清除中断标记位,2是调用下面要介绍的回调函数。实际调用的是下边的中断回调函数
0 w2 M0 c; l6 G/ O
  1. void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)! t& u3 b8 @! G3 p4 `, |2 j6 i* a
  2. 例:HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
复制代码
; h! n: |- l5 E5 q* l
HAL_GPIO_EXTI_Callback/ s& s# N" j6 W" c/ o
中断回调函数,可以理解为中断函数具体要响应的动作。2 |* e( j+ |+ K' n
  1. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)) `7 \$ b% R6 G+ U/ n- W
  2. 例:HAL_GPIO_EXTI_Callback(GPIO_Pin);
复制代码
0 C  n6 z- p. n1 [7 E' ]* F
4.LED工程; S: a4 s: [1 N" x  d
1.LED电路原理图& X  k/ o/ i& e2 V: O1 w

9 R' ]* E, O! s6 f
20210424110119129.png

" Y/ f; B9 O! p5 S/ H) C; ?8 I. D) t: X6 y$ Z7 E6 V
2.GPIO_PIN_SET与GPIO_PIN_RESET3 a! |; n6 O- B$ v
  1. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
    1 K: w! C4 `0 a$ N
  2. {
    ' z8 T: k4 |% Z: N. @
  3.   /* Check the parameters */3 ~- V2 T6 P, \" G
  4.   assert_param(IS_GPIO_PIN(GPIO_Pin));
    5 U- c+ M  n4 p# s
  5.   assert_param(IS_GPIO_PIN_ACTION(PinState));. k# l2 S8 A+ \) ?' C
  6. 9 F. J- Y; P. z# G0 q8 s. L
  7.   if (PinState != GPIO_PIN_RESET)
    ( g, v4 ^7 n6 j- F( w8 n, r: _
  8.   {7 `3 X/ v  k: X! Q/ y8 U* \' q' I
  9.     GPIOx->BSRR = (uint32_t)GPIO_Pin;//如果是GPIO_PIN_SET,则将GPIO的BSRR寄存器低16位置为GPIO_Pin- O. }% o% ^  o; |- x8 w7 p
  10.   }
    . y# D7 ]! f7 i/ g: E; N# h
  11.   else
    ' n/ i1 Q7 ]" J0 P8 E6 j) h# X9 n7 H
  12.   {0 ]# @( j) ?' |3 W5 A
  13.     GPIOx->BSRR = (uint32_t)GPIO_Pin << 16 ;//如果是GPIO_PIN_RESET,则将GPIO的BSRR寄存器的高16位置为GPIO_Pin
    2 l# u! ^1 M5 H& K/ K' O* c& A
  14.   }( L4 I2 L0 f9 Z% }
  15. }
复制代码
" I4 [- z. D: {$ D  @. j
例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_SET,则GPIOA->BSRR=((uint32_t)0x0002U);即把二进制0000000000000010转换为32位数赋值给BSRR,对应的GPIO_Pin_1管脚置高;% g- O7 R! C8 J: B  s3 T

# K* P% [0 Z- s! h例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_RESET,则GPIOA->BSRR=((uint32_t)0x0002U<<16);即把二进制数0000000000000010左移16位并转换为32位数赋值给BSRR,高16位对应的GPIO_Pin_1为1,对应管脚被清零,置低;
: T4 C5 X: t5 R; r. h+ ]- u7 X3 c3 H' u. T( Z
3.锁存器# U. l6 [* N1 I# W2 F! ^
锁存使能(LE)输入和输出使能(OE)输入对于所有锁存器是公共的。4 K* y/ f$ `/ G7 B9 V9 O
LE为高电平时,Dn输入端的数据进入锁存器。 在这种情况下,锁存器是透明的,即每当其对应的D输入改变时,锁存器输出就改变状态;4 ]# {! g3 T; D7 Z3 _
当LE为低电平时,锁存器将存在于D输入端的信息存储在LE的高电平至低电平转换之前的建立时间;
* |9 \  `. ~- P* |5 B" B: }& }1 k0 \当OE为低电平时,8个锁存器的内容在输出端可用;
6 g+ ]  H1 h  @9 w当OE为高电平时,输出变为高阻态关闭状态。OE输入的操作不会影响锁存器的状态。+ C" |/ G- X/ i

3 ^, U7 T4 q7 n% P$ s4.用端口输出控制函数控制LED闪烁; t( q4 ?& `: l' V8 |0 S+ n
  1.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET);                //端口输出控制函数,PC8端口输出高电平,使LD1熄灭
    8 Y- Y( U- G& D/ j
  2.         HAL_Delay(300);
    8 ]9 t5 P- h$ y+ ?. j" X
  3.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);        + k% ^) |1 X. }
  4.         HAL_Delay(300);1 Z9 ?& Q3 L4 x0 R8 {+ f
复制代码
0 h% r9 @! ^" a/ c% g
* S; _/ X6 [- f. f  U% G# B
5.用端口输出翻转函数控制LED闪烁
6 N* w1 U- l* A1 R( d4 E
  1.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_8);    //端口输出翻转函数 0 s2 f% q# k0 k7 i4 O3 c" v
  2.         HAL_Delay(300);
复制代码
& b- b2 ?! x$ S4 R/ a5 ^
! ~. {" U3 s3 U0 G6 x* Y
6.使用锁存器' p7 v& M0 n- K% B2 i4 |3 d& y7 x# ~
  1.         HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);                  //锁存器输出高电平9 D4 ^2 g! D" ]) p' L, l5 z
  2.         HAL_GPIO_TogglePin(GPIOC,LD1_Pin);                   //端口输出翻转函数
    $ h$ ^- g/ U# t) A  {& U; {
  3.     HAL_Delay(300);
    ! j( R7 _& b% }
  4.         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);                //锁存器输出低电平
复制代码
) C" c- F) L1 G) u
7.LED跑马灯
4 f1 y2 k3 i7 A0 H  Y/ S! R* q: U
  1. #define DELAY_TIME        100; i6 g0 Q. N( M1 b
  2. void LED_test(void)
    + V  c2 u" \% Z; g
  3. {  B! T$ R( ~, @8 [) O
  4.            HAL_GPIO_TogglePin(GPIOC, LD1_Pin);; L. E# L( r$ f1 q0 {
  5.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    ' \$ ]2 y. ~# I( D, {
  6.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);1 r( }, R) f8 @: q2 b* Y4 c1 Y% e) t, D
  7.                 HAL_Delay(DELAY_TIME);4 @; m1 i! \* w7 [6 F( O$ r, c
  8.                
    , Z# ^. u, _% W/ S! {
  9.                 HAL_GPIO_TogglePin(GPIOC, LD2_Pin);
    0 Y& L6 `9 G! u# E5 W
  10.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);1 U. |/ l9 C9 _. F) S: o+ R& }
  11.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    8 A1 I( s# z# K: a; L' B
  12.                 HAL_Delay(DELAY_TIME);! E$ t' k% G6 {  R3 Z: ?" ^* Z
  13.                 & D6 L' X$ d2 w
  14.                 HAL_GPIO_TogglePin(GPIOC, LD3_Pin);
    - I/ S* {  K( \3 i
  15.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    , A7 }, O/ \4 d1 m2 W
  16.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    1 |; T2 U; N6 H, b
  17.                 HAL_Delay(DELAY_TIME);
    ! \3 x9 z4 F' T- c+ \
  18.                 + X: J2 `( `! E. y
  19.                 HAL_GPIO_TogglePin(GPIOC, LD4_Pin);
    ' X2 W, |* ?7 t) \6 B& [. _$ {$ |4 W7 Z
  20.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    - Z9 ~$ ?. T. q+ o. `$ Y
  21.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);6 ]. {  i( f# {* x! Y7 k7 \
  22.                 HAL_Delay(DELAY_TIME);* B8 `5 s$ X% B! ~3 B, {8 F
  23.                
    - a" K7 g2 L8 Z- ]+ \
  24.                 HAL_GPIO_TogglePin(GPIOC, LD5_Pin);
    5 p5 ^7 Y* q7 j& s% S
  25.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);* a4 s: l' L8 p# E
  26.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);* I2 w# w' }) T1 {# n
  27.                 HAL_Delay(DELAY_TIME);
    6 k' `" a* N: K) L( F. I" P
  28.                
    0 c# t) c) F; {- A; i7 ~
  29.                 HAL_GPIO_TogglePin(GPIOC, LD6_Pin);' y& K% P8 E0 M( ~4 P. d2 |9 x
  30.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);* B+ u+ L9 `1 j0 y4 L6 y( Z
  31.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);  \1 x' j  }; O! j/ [8 q. E
  32.                 HAL_Delay(DELAY_TIME);8 k: P) J/ S- m4 i( l/ g: U; y/ O* z
  33.                 . L: T4 t. V# Z2 y* ^
  34.                 HAL_GPIO_TogglePin(GPIOC, LD7_Pin);/ y/ ?! ~! }# v: V, W& Y
  35.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);5 e$ O7 S! C8 o  O2 w
  36.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);$ x- [2 _' s3 L0 v$ R) m' V  t0 Q
  37.                 HAL_Delay(DELAY_TIME);; l7 W, W9 [% D7 {0 n) I
  38.                
    & O; Z& R5 p3 V  a; M$ d; @
  39.                 HAL_GPIO_TogglePin(GPIOC, LD8_Pin);0 b  K6 ?$ N! J0 m; o$ m/ U5 O
  40.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);4 v/ ]$ ?( m: g# n# k! [/ W0 j- A
  41.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    4 [8 _" J# x9 M( o; W
  42.                 HAL_Delay(DELAY_TIME);        + J1 t* O) j, p$ K% r7 ]8 Y( V
  43. }
    " b& h5 }. {( f  J6 M8 ?1 d+ f3 }
复制代码

" z7 Q4 b. d& ]: W: s' Y' m7 i
4 F. [. V% y; O3 s- p2 [8 I' i+ S6 P* r1 p5 ~( }
收藏 评论0 发布时间:2021-11-13 00:01

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版