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

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

[复制链接]
STMCU小助手 发布时间:2021-11-13 00:01
1.使用keil5的注意事项( x' v- E6 V, A" w$ \
用STM32Cube生成程序驱动后 将程序写到以下范围内,以程序保证用STM32Cube重新生成工程后不被删除 。
  a6 ?8 y4 I3 ]. q+ O: V
  1. /* USER CODE BEGIN 1 */     //代码开始% X# B# \& Y6 T/ a& z$ }
  2. : \# C+ s: {- A1 o4 ^( Z
  3. /* USER CODE END 1 */                //代码结束
复制代码

' z/ p% y; p7 p0 c/ I! K

& s% f/ m6 K# a5 z4 W0 f$ k2.HAL库延时函数
& {# E4 W& {% {; M% ]8 u; YHAL库自带延时函数(毫秒,阻塞)% X" k" j( L' K/ _$ I) u4 S
  1. HAL_Delay(x);
    . q1 _/ m, X4 K" f5 V5 S
  2. 实际延时时间为(x+1)ms
复制代码
HAL库函数为了防止无意义延时(即0ms延时)的产生,在HAL_Delay函数传入参数之后会对参数加1。 如果使用HAL库默认延时函数进行延时,实际延时时间将会比预期时间多1ms。换句话说,HAL_Delay函数至少会产生1ms的延时。
9 `- h$ n* y( Q& \0 Q7 r
1 ~: C6 `) l0 s8 t! i- R重新定义延时函数,非阻塞式延时
; A' B8 z9 ]: G( n  z: B2 `7 |
  1. void Delay_us(int16_t nus)
    ) n7 L  S2 A! C9 X; A4 ~
  2. {
    5 [' O3 T( Q" d/ Q4 h6 Q7 d( N% ~
  3.   int32_t temp;
    ! T/ {/ Q2 q, z6 L2 i
  4.   SysTick->LOAD = nus*9; //72MHz
    , H' I- D* G4 \2 `
  5.   SysTick->VAL=0X00;& t  q& _# |) I1 p
  6.   SysTick->CTRL=0X01;
      p, R% H! F8 I4 Q4 W& S
  7.   do ; T4 c# M; y3 ?0 T  K7 _9 p5 z
  8.   { ' R) L! t) R0 Z, @$ ^
  9.     temp=SysTick->CTRL;
    7 C5 m) A8 s3 e- l" v
  10.   }
    ; s3 J3 \7 d6 p% l% h
  11.   while((temp&0x01)&&(!(temp&(1<<16))));
      U! D- J& C8 q: n: C# Q$ U
  12. 2 n  X' _7 P. _& N2 s9 W
  13.   SysTick->CTRL=0x00;
    4 y. h6 R. S% g0 P0 Y
  14.   SysTick->VAL =0X00; 8 e1 k; B5 _  b( D% U$ L# ]
  15. }
    % M" `% Q' U, X, _6 {! C
复制代码
0 ?1 Y3 R" M. g" s6 ^/ Z
3.HAL库配置GPIO9 H3 u5 p5 W: F# E$ ]# W4 t- x  `! |
  1. void              HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init);/ ?( {1 X0 H% P1 J  b" {' J
  2. void              HAL_GPIO_DeInit(GPIO_TypeDef  *GPIOx, uint32_t GPIO_Pin);
    # ^+ Z4 D2 V' g0 f. D
  3. GPIO_PinState     HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);  //端口输入读取函数
      e% e  D; t, m
  4. void              HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); //端口输出控制函数
    ; P2 Q& }) o5 E8 K+ y; }
  5. void              HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);  //端口输出翻转函数
    ' ?  W( S3 O3 g' e0 M
  6. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
    5 l) A- Y: {4 O+ u( s5 Q& `. Q* _
  7. void              HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);8 y* K' n* w5 |. `7 B1 D1 f5 z
  8. void              HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
复制代码
解释:
2 g# ]6 W% N" F* S' _$ w& c. p' ^# E% Z7 d
HAL_GPIO_Init
; D" P: T, u- z0 h( l7 D+ B, J' ~/ i/ z初始化我们需要用到的引脚的工作模式,包括具体引脚的工作速度、是否复用模式、上下拉等等参数。
0 @. v$ e0 k4 r8 h9 l- E9 P8 }
  1. void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
复制代码
: x; m- J, p2 F* U! Q
HAL_GPIO_DeInit
3 O6 P. ?; @7 A( q, p4 W2 q/ K9 n* _将初始化之后的引脚恢复成默认的状态–各个寄存器复位时的值! ?9 x0 c: l! h  o
  1. void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)4 P3 S( ^1 k# e
  2. 例:HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);
复制代码

9 |; H' P3 P& k/ e( w. [* \  oHAL_GPIO_ReadPin* w7 D# r% n+ S! }/ G, I
读取我们想要知道的引脚的电平状态、函数返回值为0或1。' V' i# ^: r3 l1 G  d
  1. GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)6 b1 l# c: G+ O( u0 q
  2. 例:pin_State = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_9);
复制代码
3 c: G/ D8 O) F9 P$ m# C+ H
HAL_GPIO_WritePin" A9 ~. U% |0 y. b  d8 w
给某个引脚写0或1,但是不要理解成,写1就是使能之类的意思,有些寄存器写1是擦除的意思$ e+ p/ {) ~2 E. ?' h
  1. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
    : u6 ~5 V& F6 ?/ r7 ?
  2. 例:HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9,GPIO_PIN_RESET)
复制代码
' T$ f' x: @( W& n( ?, U9 w
HAL_GPIO_TogglePin( x2 R0 }. g* f" |
翻转某个引脚的电平状态: z5 N3 O* t0 {; U0 c
  1. void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
    3 o, f% y# x2 w' j5 B
  2. 例:HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9);
复制代码
! j. [: \$ _/ y! o
HAL_GPIO_LockPin
+ _% r9 Q4 n- u如果一个管脚的当前状态是1,读管脚值使用锁定,当这个管脚电平变化时保持锁定时的值,直到重置才改变
# K' {4 L$ I" l. [' m
  1. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)6 n: h- n, }3 i9 A* ?3 Z. C
  2. 例:. }1 |) a- K* c7 i4 S- `
  3. HAL_StatusTypeDef hal_State;
    % k; d3 z7 q, T$ a4 t0 v! J
  4. hal_State = HAL_GPIO_LockPin(GPIOF, GPIO_PIN_9);
复制代码

! ^& N& Y+ U# [. [" |/ @& M) }HAL_GPIO_EXTI_IRQHandler
. N9 }( {# W/ u0 J! C7 B这个函数是外部中断服务函数,用来响应外部中断的触发,函数实体里面有两个功能,1是清除中断标记位,2是调用下面要介绍的回调函数。实际调用的是下边的中断回调函数
+ m1 O% B+ g8 i% y8 `- A" `0 ~$ a
  1. void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
    ; E; y' @, t- I+ T' X
  2. 例:HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
复制代码
9 E1 z8 i/ l9 y
HAL_GPIO_EXTI_Callback7 @5 b  ~) e! `2 A4 P
中断回调函数,可以理解为中断函数具体要响应的动作。6 Y; E+ J) y- g
  1. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)1 r+ n; Y. d- G" m
  2. 例:HAL_GPIO_EXTI_Callback(GPIO_Pin);
复制代码
- u2 R0 j8 @5 q- L7 n  d. o
4.LED工程6 z& q: M! M! @. f9 W3 w
1.LED电路原理图
: e1 H) d. D, q9 H+ V8 E$ e9 K# c+ b- ?
20210424110119129.png
+ l& q# ?4 w3 F" \% g4 f: Z
' M3 Y- e, P+ R4 s" T+ R
2.GPIO_PIN_SET与GPIO_PIN_RESET
; E$ C7 r, ^3 ^. Y+ D
  1. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)+ M+ f7 a; T4 a1 V3 ~
  2. {
    - h. B. l4 z* j, @0 n, v& W
  3.   /* Check the parameters */& T' s! r& J0 K8 g
  4.   assert_param(IS_GPIO_PIN(GPIO_Pin));
    . s+ c3 d) H7 }5 J+ l( A
  5.   assert_param(IS_GPIO_PIN_ACTION(PinState));
    . p5 }8 ~1 p% j
  6. % Y  }3 j# K% N) n; B
  7.   if (PinState != GPIO_PIN_RESET)
    - N; S9 A9 e- S7 x! S
  8.   {4 t8 o. f$ d7 a, W
  9.     GPIOx->BSRR = (uint32_t)GPIO_Pin;//如果是GPIO_PIN_SET,则将GPIO的BSRR寄存器低16位置为GPIO_Pin
    $ W. P4 }2 |2 y/ B' N
  10.   }0 o* K5 {/ }. _6 m$ P1 a: I
  11.   else
    3 k. s( E; X: x$ j$ S5 C
  12.   {
    9 y$ \+ h3 U2 m7 a0 w; F
  13.     GPIOx->BSRR = (uint32_t)GPIO_Pin << 16 ;//如果是GPIO_PIN_RESET,则将GPIO的BSRR寄存器的高16位置为GPIO_Pin
    ! e6 i2 y# h% g6 g4 |. N; h
  14.   }6 ?8 k1 U: r. U1 s+ L
  15. }
复制代码
% x0 N+ m. P2 `8 j( P) @+ i  B( K" q* `! b
例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_SET,则GPIOA->BSRR=((uint32_t)0x0002U);即把二进制0000000000000010转换为32位数赋值给BSRR,对应的GPIO_Pin_1管脚置高;
+ L% H7 Q6 g( w5 i3 ^. B# @4 T! X; i4 r6 u2 b
例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_RESET,则GPIOA->BSRR=((uint32_t)0x0002U<<16);即把二进制数0000000000000010左移16位并转换为32位数赋值给BSRR,高16位对应的GPIO_Pin_1为1,对应管脚被清零,置低;8 N! g7 l( @9 r) X
: M( b3 O# `. X3 s" n/ ~2 S- [
3.锁存器
6 [4 k+ @. e, h2 q8 s锁存使能(LE)输入和输出使能(OE)输入对于所有锁存器是公共的。; q$ R3 u( c6 [0 P! I
LE为高电平时,Dn输入端的数据进入锁存器。 在这种情况下,锁存器是透明的,即每当其对应的D输入改变时,锁存器输出就改变状态;
- g8 r6 d' A- }3 E3 @9 {. C8 ^当LE为低电平时,锁存器将存在于D输入端的信息存储在LE的高电平至低电平转换之前的建立时间;
: g+ O/ z/ q  A+ }3 @* M$ Z当OE为低电平时,8个锁存器的内容在输出端可用;
5 G! k5 Z; W  a- C3 E3 k3 b+ J5 `" u当OE为高电平时,输出变为高阻态关闭状态。OE输入的操作不会影响锁存器的状态。4 I* X8 G2 e1 Y6 ?0 J3 r
2 B0 ~" X8 S' t; m( j' t7 X& G$ ^/ z
4.用端口输出控制函数控制LED闪烁
2 x6 Q  y& l; j  m
  1.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET);                //端口输出控制函数,PC8端口输出高电平,使LD1熄灭
    , X& C/ m" D. _" ^* n
  2.         HAL_Delay(300);
    9 [  p- U+ l7 `- m+ F3 ?7 r! i$ p/ \( a
  3.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);        ' Y- A/ x( H% E" R' g) H5 ~
  4.         HAL_Delay(300);" N2 P- v0 F7 S- {* Q
复制代码

+ q( p1 c5 R# m# g" z1 Z6 w4 L( u& l8 @
5.用端口输出翻转函数控制LED闪烁9 d6 j! p& R* p* p4 T
  1.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_8);    //端口输出翻转函数
    ! M( r$ Q& b' _1 [& T' r
  2.         HAL_Delay(300);
复制代码
5 L; P5 j( ]7 n1 O( U9 W" Q) ~. p8 R4 q

! o3 ^9 f4 Q5 Y1 r* ]5 O6.使用锁存器; H( A) e' S# S& e$ P8 Z
  1.         HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);                  //锁存器输出高电平
    2 w9 n: [- x  n' t" g% ]
  2.         HAL_GPIO_TogglePin(GPIOC,LD1_Pin);                   //端口输出翻转函数 + W# O& m9 J3 }0 e' b( K$ x  f- K
  3.     HAL_Delay(300);  U* E8 T3 x& h8 v# W
  4.         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);                //锁存器输出低电平
复制代码

8 Y- Y* o4 h3 w3 n" s7.LED跑马灯
" R8 \" d  D. N9 A1 f
  1. #define DELAY_TIME        1008 q# p; n% c" u1 h8 v( Q
  2. void LED_test(void)) h& }) Z3 ^* B- k# t3 ]
  3. {1 T# Z' _! W+ k+ L" J& D7 i
  4.            HAL_GPIO_TogglePin(GPIOC, LD1_Pin);
    ) g$ y! w% P4 p2 d% d+ B4 l
  5.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);$ ~2 E; y: I2 T5 j2 I7 L5 k
  6.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    7 C* u! V7 ]5 D( u/ v
  7.                 HAL_Delay(DELAY_TIME);* l2 N: l7 m# U# u5 A
  8.                 # N' Q, Y( I3 k' [' R+ g8 F2 a: l$ r
  9.                 HAL_GPIO_TogglePin(GPIOC, LD2_Pin);$ Y) K6 x( s* L: W- I$ z' A( u
  10.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);* j6 J2 Y6 \9 ]* F/ Y9 T' E
  11.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    / f: P3 S' P) s) ]
  12.                 HAL_Delay(DELAY_TIME);9 s& H4 l+ t, X/ R7 ~* D7 u
  13.                 % |2 d$ O7 ^6 _. a! d0 s0 h- P2 v- @+ w
  14.                 HAL_GPIO_TogglePin(GPIOC, LD3_Pin);
    % W; m( V5 v1 y7 l0 b0 r
  15.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);2 D2 P( |- `8 z4 ]
  16.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    2 Y( {8 `) X9 C: ?8 q
  17.                 HAL_Delay(DELAY_TIME);
    $ U% {; ~* D" j7 [' t  Q; [& a
  18.                
    % W7 l$ b) Y% w
  19.                 HAL_GPIO_TogglePin(GPIOC, LD4_Pin);) P3 w* s( J  q& G
  20.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);1 |1 u$ G+ z% q1 V+ F- w/ r
  21.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);3 `/ g8 o9 D$ Y. a
  22.                 HAL_Delay(DELAY_TIME);7 e/ V) q4 t1 m. n- T
  23.                 7 f  C1 I$ F* ]' y
  24.                 HAL_GPIO_TogglePin(GPIOC, LD5_Pin);* p3 r0 N+ J2 e- v5 Z' s
  25.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);) ]* U5 x$ h$ M* D8 v
  26.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);( g! A7 T) c! G- }8 Q) v
  27.                 HAL_Delay(DELAY_TIME);+ a, q( j3 f& q" n
  28.                
    : E6 @7 k2 V: I9 o; O* P7 n
  29.                 HAL_GPIO_TogglePin(GPIOC, LD6_Pin);
    & s" h, `1 h' E$ ^# v2 q% i+ A
  30.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);+ C+ w( G  [1 c* \% ]6 S
  31.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    ; h; m5 ]- @- g. Q( E; U% w
  32.                 HAL_Delay(DELAY_TIME);3 o. n3 v+ F$ H* v& O8 r7 Q
  33.                 $ {' ~- R! ?6 k/ w8 d/ b; G8 K
  34.                 HAL_GPIO_TogglePin(GPIOC, LD7_Pin);8 c- P6 i; W, |; v0 A
  35.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    6 z6 j- f% O& @) G& ^
  36.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    7 P! i" F0 X4 G( A8 o
  37.                 HAL_Delay(DELAY_TIME);
    * Z& Q( m" N+ S- V
  38.                 8 `4 u* h7 k3 `9 l: x
  39.                 HAL_GPIO_TogglePin(GPIOC, LD8_Pin);7 F6 Q3 M" x% ]. b) D& [6 J
  40.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    % W- {& a) t  A" f- y' c
  41.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    * w2 w* ?! y* _9 y
  42.                 HAL_Delay(DELAY_TIME);        ( K1 T7 X3 Y( R, v3 P1 K4 g
  43. }9 M1 S( x5 N1 t7 p
复制代码

* @& {) c' ?" F+ }/ U# u9 ^
4 q3 I# M) e+ h4 O% I; l% `
$ n; T8 t$ |+ o- S' J' i1 Q
收藏 评论0 发布时间:2021-11-13 00:01

举报

0个回答

所属标签

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