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

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

[复制链接]
STMCU小助手 发布时间:2021-12-8 22:00
1.使用keil5的注意事项
, ^. k* Y( l$ w% `# k$ P用STM32Cube生成程序驱动后 将程序写到以下范围内,以程序保证用STM32Cube重新生成工程后不被删除 。; n" u5 D: N- {9 @
  1. /* USER CODE BEGIN 1 */     //代码开始
    , Z6 O7 @0 R4 [: W! g

  2. . e3 U8 m8 V4 o. h* O
  3. /* USER CODE END 1 */                //代码结束
复制代码

+ S8 W# N3 s/ `" G2.HAL库延时函数" F! t5 O3 v2 j
1、HAL库自带延时函数(毫秒,阻塞)" B& Z1 t5 G2 F0 l. \4 o" ], B) @
  1. HAL_Delay(x);( i2 K$ Z3 M! I: K5 W  ], C4 f
  2. 实际延时时间为(x+1)ms
复制代码
. j$ I4 A* y6 e. D! z: i6 D& T2 @* p
HAL库函数为了防止无意义延时(即0ms延时)的产生,在HAL_Delay函数传入参数之后会对参数加1。 如果使用HAL库默认延时函数进行延时,实际延时时间将会比预期时间多1ms。换句话说,HAL_Delay函数至少会产生1ms的延时。
; ?* S5 |7 }7 |4 h& C3 n0 q* Q: @
: e8 W8 A1 `4 C$ u2、重新定义延时函数,非阻塞式延时" I7 \& x6 F/ }/ z+ Q
  1. void Delay_us(int16_t nus) 0 t/ ]4 P. v  `
  2. {+ u2 o; P+ P6 p
  3.   int32_t temp; * o  E1 N7 P3 [+ T
  4.   SysTick->LOAD = nus*9; //72MHz
    5 {5 T7 e2 n# P$ c0 e
  5.   SysTick->VAL=0X00;
    , u) z  T& a6 k% o$ u. l: j% V
  6.   SysTick->CTRL=0X01;; Y- I" ^- J/ n' `0 L" G
  7.   do
    2 j+ S: {5 x" R4 }$ p
  8.   { / k; x* ^# @6 R' F/ `5 ~1 L
  9.     temp=SysTick->CTRL;
      ~' w2 P  J- |
  10.   }" W0 h# N" Q' v3 G8 V$ t6 e5 s
  11.   while((temp&0x01)&&(!(temp&(1<<16))));
    1 T( y) v( S2 a9 F! ]: g* |- T
  12. $ M# I: D# ^: g( a9 g% `* ?! D4 J9 \
  13.   SysTick->CTRL=0x00;
    ! ~: K  x( v3 z: `- H; B
  14.   SysTick->VAL =0X00; : ^$ e4 z7 U+ Y( Y  @4 G
  15. }
    3 P3 ~8 d  u. ^6 s% u7 o
复制代码

( X& H$ S' f3 k& q, E2 ^5 g& f3.HAL库配置GPIO
# e; v, b/ C' E# m0 l% h
  1. void              HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init);( R( r# u5 `4 @
  2. void              HAL_GPIO_DeInit(GPIO_TypeDef  *GPIOx, uint32_t GPIO_Pin);% f7 S  [' ]5 J4 Y) n
  3. GPIO_PinState     HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);  //端口输入读取函数
    - x- l6 F6 F) @% Q; u+ n/ ?0 E
  4. void              HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); //端口输出控制函数
    3 w7 a0 q+ l0 z/ ]6 i( u- Q1 K
  5. void              HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);  //端口输出翻转函数
    6 B* m) m7 [2 U! ~2 a$ f1 z
  6. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);, e% X: k& \1 J; \4 m4 _# N" z
  7. void              HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);
    : ~/ s- g6 U/ m! d
  8. void              HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
复制代码
# Q, Y6 g. m+ E5 p
解释:- y8 ~" q3 b5 L; t3 P
) n: J  ?/ Q6 d
HAL_GPIO_Init) }# }; E* O/ e
初始化我们需要用到的引脚的工作模式,包括具体引脚的工作速度、是否复用模式、上下拉等等参数。
, n; D6 R* V; P: V. A3 b
  1. void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
复制代码
+ W; E( E( g4 r) O  i$ t* r
HAL_GPIO_DeInit) ?# W: Z- R6 O# {* X( ~
将初始化之后的引脚恢复成默认的状态–各个寄存器复位时的值
3 r3 _  H/ B/ }0 x6 H  m& ~
  1. void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)
    ( R3 t( I% {7 H# J( c. K5 }
  2. 例:HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);
复制代码
% y  Z/ J4 ^+ i$ y) Q
HAL_GPIO_ReadPin; R; Q- N& g& f5 E
读取我们想要知道的引脚的电平状态、函数返回值为0或1。' H* E9 D, R$ E; ]- Z
  1. GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
    : v, e4 Z" w( o. Q
  2. 例:pin_State = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_9);
复制代码
# q- _) v5 P* X$ Z
HAL_GPIO_WritePin" Q& f1 V. m% M! F/ K5 X. b
给某个引脚写0或1,但是不要理解成,写1就是使能之类的意思,有些寄存器写1是擦除的意思
- k3 ~. G5 z# \+ b" B
  1. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)8 G) i0 ]7 V; ]' W6 ?
  2. 例:HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9,GPIO_PIN_RESET)
复制代码
; G& }- G5 l0 R1 X+ [6 d5 U4 U
HAL_GPIO_TogglePin
. K4 C: M) @( R翻转某个引脚的电平状态1 d# ?4 Q0 v/ q; _+ `) F+ a* J2 `3 B) z
  1. void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)' b. o" m3 L9 ^2 H
  2. 例:HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9);
复制代码

& D' l/ v, A6 fHAL_GPIO_LockPin
) A/ w9 ^, G- R" |如果一个管脚的当前状态是1,读管脚值使用锁定,当这个管脚电平变化时保持锁定时的值,直到重置才改变$ j7 @7 b' b1 q% A1 t
  1. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
    4 Q6 b; T$ Z( {/ ~7 m3 V
  2. 例:
    8 y( ]  t& I" s% P7 \. X
  3. HAL_StatusTypeDef hal_State;5 ?. @" `( r- [7 ?
  4. hal_State = HAL_GPIO_LockPin(GPIOF, GPIO_PIN_9);; v+ K& U( v7 o8 ?' W

  5. & |8 _( c. |: G2 B1 U0 m) |, t) q
复制代码

5 z6 {- s9 `; f- Y* A1 F  X# r: THAL_GPIO_EXTI_IRQHandler+ S7 T- f; `7 J
这个函数是外部中断服务函数,用来响应外部中断的触发,函数实体里面有两个功能,1是清除中断标记位,2是调用下面要介绍的回调函数。实际调用的是下边的中断回调函数
8 G; G, ]% X$ |9 _' y' A
  1. void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
    , D* S7 K; V. c8 z3 x+ k: I
  2. 例:HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
复制代码
4 F6 Q9 c( d' [0 j0 N! A8 g6 r
HAL_GPIO_EXTI_Callback7 x2 F+ ?0 o* _: h: \
中断回调函数,可以理解为中断函数具体要响应的动作。6 G; K7 u1 _$ M: p$ `" P
  1. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)3 D# x) u( j! k4 }5 X( J' \
  2. 例:HAL_GPIO_EXTI_Callback(GPIO_Pin);
复制代码
" ^+ g8 J9 |, Q

8 H+ N4 H+ k* B4.LED工程" f  H# q$ m8 q2 T$ l- P
1.LED电路原理图8 T! s& d. r3 L8 n4 |7 b

1 V) H) I. j2 T) P# I* I' u5 C
20210424110119129.png

4 l9 Z! Z9 e/ ]3 v. ^6 M( Q! s
  |( ?2 b/ Y$ a  ]- c2.GPIO_PIN_SET与GPIO_PIN_RESET
, J& m$ E0 T/ u
' \: W3 \1 z' v* A" a. M( F
  1. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
    9 E/ v6 Y4 i8 H
  2. {- E; ]6 i9 h+ [# {  i
  3.   /* Check the parameters */
    8 E9 \, }5 ]2 H6 t% s3 w1 c
  4.   assert_param(IS_GPIO_PIN(GPIO_Pin));
    4 Z3 n6 A0 x( ~5 w, j
  5.   assert_param(IS_GPIO_PIN_ACTION(PinState));
    7 w. x) o# Q7 [. r& i

  6. / \/ ]9 {. e( y. {! y4 P( L
  7.   if (PinState != GPIO_PIN_RESET)
    / C/ s: ]5 r3 B3 A7 G
  8.   {5 x$ M6 p3 E; Z) ]
  9.     GPIOx->BSRR = (uint32_t)GPIO_Pin;//如果是GPIO_PIN_SET,则将GPIO的BSRR寄存器低16位置为GPIO_Pin! {( n! Q$ x8 o* X
  10.   }/ G' c' n  {6 ~2 ~( Z& Y
  11.   else
    9 X1 e( e; R: j# e
  12.   {
      k8 ]: y; C# M' ?" X0 s
  13.     GPIOx->BSRR = (uint32_t)GPIO_Pin << 16 ;//如果是GPIO_PIN_RESET,则将GPIO的BSRR寄存器的高16位置为GPIO_Pin
    1 P5 O. R5 F$ F( ~1 \# L
  14.   }5 ^! K4 k6 x% X% `5 @& D  D
  15. }
复制代码
! i( Y1 y" \2 A3 B
例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_SET,则GPIOA->BSRR=((uint32_t)0x0002U);即把二进制0000000000000010转换为32位数赋值给BSRR,对应的GPIO_Pin_1管脚置高;* D' \5 q, b1 v. U9 \  l* V% j  b
7 u6 z; B) z2 m) ]( F: Q7 u
例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_RESET,则GPIOA->BSRR=((uint32_t)0x0002U<<16);即把二进制数0000000000000010左移16位并转换为32位数赋值给BSRR,高16位对应的GPIO_Pin_1为1,对应管脚被清零,置低;
+ ]/ k0 w" B, r2 C0 {' m4 {: A8 k* \& Q: r- j; d. N1 d" |
3.锁存器# D" ?, I% @0 |* k) M! a
锁存使能(LE)输入和输出使能(OE)输入对于所有锁存器是公共的。/ B" C5 r- I& B! \

; Q5 }1 B0 X: {" q' ]! `LE为高电平时,Dn输入端的数据进入锁存器。 在这种情况下,锁存器是透明的,即每当其对应的D输入改变时,锁存器输出就改变状态;+ S" }1 A5 p5 p) P
当LE为低电平时,锁存器将存在于D输入端的信息存储在LE的高电平至低电平转换之前的建立时间;* l/ k# u% }0 @
当OE为低电平时,8个锁存器的内容在输出端可用;
; [4 m; [  |! ~当OE为高电平时,输出变为高阻态关闭状态。OE输入的操作不会影响锁存器的状态。
; D; |/ Z; V6 f* Z7 C7 Q) C3 ~4.用端口输出控制函数控制LED闪烁8 S: ?: i) y  Y, q  l( {8 W9 r

! x* f8 p6 Z! x) V" B. S8 S
  1.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET);                //端口输出控制函数,PC8端口输出高电平,使LD1熄灭& i! w/ Y; S, @# J, H8 A
  2.         HAL_Delay(300);
    . B9 l: V6 K5 e2 d- A
  3.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);        3 i4 X) f; B" s1 [* ]; r+ C
  4.         HAL_Delay(300);
复制代码

) n/ Y2 l# L- b6 \9 O5.用端口输出翻转函数控制LED闪烁# F  c! k* f# y- v2 T
  1.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_8);    //端口输出翻转函数 8 P, m' ~9 R& G, ^8 x& n1 r! Q- x
  2.         HAL_Delay(300);
复制代码
! @5 b; ~) l( D3 S3 F( G& v
6.使用锁存器
  1.         HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);                  //锁存器输出高电平( e7 l/ O" Z" w& ]: Z1 |
  2.         HAL_GPIO_TogglePin(GPIOC,LD1_Pin);                   //端口输出翻转函数 ( b9 i6 X- d! T  ?0 n/ w& \
  3.     HAL_Delay(300);8 {& F5 F- B- _$ R: y
  4.         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);                //锁存器输出低电平
复制代码

7 Q& G% N! a7 }$ q* F! z. [7.LED跑马灯0 a5 ^& q! b( b9 Z  k

- c6 D1 t' u4 ^4 ^' c
  1. #define DELAY_TIME        100+ Y7 q) Q1 L2 @! o$ n
  2. void LED_test(void)
    3 ?9 Q; _$ f0 W$ r: R4 T
  3. {
    ; e8 T" R( S$ J* I
  4.            HAL_GPIO_TogglePin(GPIOC, LD1_Pin);+ w) W0 F8 h6 q" H1 E  \- n% V
  5.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);5 S6 X  c" V, m0 m( C1 n
  6.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    # {" \0 N2 R1 H
  7.                 HAL_Delay(DELAY_TIME);. M* a! u& x) A5 A+ z  m' z
  8.                
      D/ u1 o/ g7 a
  9.                 HAL_GPIO_TogglePin(GPIOC, LD2_Pin);
      r/ }1 c' M, B7 ^0 u: r2 C+ u
  10.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);$ O( U+ C5 i0 D" \3 g3 K. C
  11.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    $ r9 f" g* K+ ]
  12.                 HAL_Delay(DELAY_TIME);
    6 \) @5 `; _( ]$ S1 Q+ h
  13.                
    # [3 J; H6 w3 h, @
  14.                 HAL_GPIO_TogglePin(GPIOC, LD3_Pin);
    # ~- U1 b+ t% J( u8 q' v& x0 t8 c9 t* G
  15.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    # u" s8 Y: F5 q
  16.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    2 `; y. i% m, x+ m( E9 n
  17.                 HAL_Delay(DELAY_TIME);. F# {1 |- f$ I2 a: c6 Y1 s3 _5 g
  18.                 6 ?9 p3 c. {" `, L& t
  19.                 HAL_GPIO_TogglePin(GPIOC, LD4_Pin);
    0 b( l5 W4 _; d/ M: }2 c9 V( i
  20.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);" ^8 x1 d# o4 J' y
  21.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    ; b+ j# B8 O/ K4 c' G) i# S
  22.                 HAL_Delay(DELAY_TIME);
    - D" E' k  \% R5 X9 @0 [
  23.                 " l" H  O% `0 T
  24.                 HAL_GPIO_TogglePin(GPIOC, LD5_Pin);& x. F4 ^4 F4 a0 O
  25.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    ; J9 `" }3 O' s+ Q3 v  C
  26.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    & _, ]! w; ]$ K; H6 V: R
  27.                 HAL_Delay(DELAY_TIME);
    6 ]! S/ @- k# @9 K7 m: W
  28.                 % a" F$ I+ I) Q
  29.                 HAL_GPIO_TogglePin(GPIOC, LD6_Pin);
    5 ~" H0 \* K5 w, o7 @
  30.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    4 G* y& a1 k) _3 M+ M! n
  31.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    # n% k/ o$ w% i
  32.                 HAL_Delay(DELAY_TIME);
    # G1 k( {1 b5 ^6 d+ Y
  33.                
      ~8 c5 R  v& A. W5 h% c8 v
  34.                 HAL_GPIO_TogglePin(GPIOC, LD7_Pin);
    % m5 l  I2 t5 Q# w* E% v5 F6 o) i
  35.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    # W% v4 O. l# v" @9 h  j
  36.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    2 Z/ l% @% ~5 ~
  37.                 HAL_Delay(DELAY_TIME);
    + H3 X# H8 b. }- f9 a
  38.                
    1 ?4 D- _- l. O- B9 N# P
  39.                 HAL_GPIO_TogglePin(GPIOC, LD8_Pin);
    ( g  f6 Q: |3 D, ~
  40.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);# m1 c# D9 P0 Z; a: A& \
  41.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    & o; u, J4 U6 ^- _. Z. p; m
  42.                 HAL_Delay(DELAY_TIME);        / U+ _, y7 [. f
  43. }
    $ n5 R' B. _6 E" _  i2 j/ o

  44. ! _; @& B! |0 y6 S7 _" ?  S: M) O
复制代码

. y) S/ [! M* |, I5 U) z& W) i8 W0 d& H
收藏 评论0 发布时间:2021-12-8 22:00

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版