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

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

[复制链接]
STMCU小助手 发布时间:2021-11-13 00:01
1.使用keil5的注意事项. y/ u0 t: @3 `; Z7 m* `4 s
用STM32Cube生成程序驱动后 将程序写到以下范围内,以程序保证用STM32Cube重新生成工程后不被删除 。% z. G! i2 i: Z7 n2 n  V7 ]! g$ ^
  1. /* USER CODE BEGIN 1 */     //代码开始
    8 W1 J) E' |! a  _. v1 o
  2. 1 d4 C/ w8 G1 ?4 B! h9 a
  3. /* USER CODE END 1 */                //代码结束
复制代码

7 K, H. U8 \0 q9 Z3 o  \

- x& D& x% `) q2.HAL库延时函数0 r# _3 h- ~& R9 ?  H
HAL库自带延时函数(毫秒,阻塞)
  G9 @' O/ _  Z( z3 U
  1. HAL_Delay(x);
    " S6 O' ^7 j7 T# p
  2. 实际延时时间为(x+1)ms
复制代码
HAL库函数为了防止无意义延时(即0ms延时)的产生,在HAL_Delay函数传入参数之后会对参数加1。 如果使用HAL库默认延时函数进行延时,实际延时时间将会比预期时间多1ms。换句话说,HAL_Delay函数至少会产生1ms的延时。$ N" ?1 D8 X5 L; d& g- e% S
, S5 \# |2 ~5 c
重新定义延时函数,非阻塞式延时9 R8 p4 Z: e6 D
  1. void Delay_us(int16_t nus) 2 h7 @; ?4 T& o4 R
  2. {
    ' s4 ]  D( ?: _6 J4 n
  3.   int32_t temp; - c. K6 T0 i, d# u
  4.   SysTick->LOAD = nus*9; //72MHz/ y* H% _7 h  v' P
  5.   SysTick->VAL=0X00;
    + D/ O! Z1 k% d3 ~, }* J
  6.   SysTick->CTRL=0X01;  n4 q' d" v! L. b: k
  7.   do ! P- Q* ?7 d6 \3 R0 {  @
  8.   {
    6 ]  k4 J. W, u! N8 e
  9.     temp=SysTick->CTRL;3 e& j' w- I9 J2 R  R
  10.   }4 U+ u* {1 J& a
  11.   while((temp&0x01)&&(!(temp&(1<<16))));( w, O& a+ T: O' s

  12. 1 K5 g: w% w8 C1 U4 h1 |! ?
  13.   SysTick->CTRL=0x00; ; ?* \- A! r  @, F7 }
  14.   SysTick->VAL =0X00; 6 y  \  a6 s+ W7 I3 d$ w
  15. }
    # m, K6 D+ e# O/ ^" @
复制代码
9 T# a* d3 a: R+ Y+ Q# I
3.HAL库配置GPIO
) i/ y- E( j# \4 a
  1. void              HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init);  f9 P' \& k& o+ l% Q2 x
  2. void              HAL_GPIO_DeInit(GPIO_TypeDef  *GPIOx, uint32_t GPIO_Pin);. v4 p7 R; s$ L1 a0 {: I! l
  3. GPIO_PinState     HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);  //端口输入读取函数. ~. m+ p. z' S; C+ {
  4. void              HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); //端口输出控制函数
    4 V. ], {+ G( z& F+ B& ?5 c
  5. void              HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);  //端口输出翻转函数
    , E, b# U) R- ^& g7 I; R4 @
  6. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
    + f% K  A5 H# G
  7. void              HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);1 b) E( I# w3 ?5 N6 c
  8. void              HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
复制代码
解释:
9 P8 W7 m# c5 s& `- [1 Z1 z  Z
1 `' J+ A6 L9 qHAL_GPIO_Init
5 W# u% C8 g' Z3 Y* c初始化我们需要用到的引脚的工作模式,包括具体引脚的工作速度、是否复用模式、上下拉等等参数。0 g, t  E* q7 x# ^# Y
  1. void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
复制代码

1 O& X$ L) _& V4 k1 c6 yHAL_GPIO_DeInit/ P: O% _5 k6 c0 ]
将初始化之后的引脚恢复成默认的状态–各个寄存器复位时的值3 {6 H6 {" y; z/ h. L) h
  1. void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)8 m8 [% }( e; @/ ~" I, I
  2. 例:HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);
复制代码

( k8 X8 Y% S7 S+ [  s, YHAL_GPIO_ReadPin7 Z$ U! F+ ]7 @4 b
读取我们想要知道的引脚的电平状态、函数返回值为0或1。0 k$ J8 o  ~  t% e5 P5 r" L
  1. GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
    * n; c/ @; x  m/ f1 u& u' I
  2. 例:pin_State = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_9);
复制代码

5 V: w5 k/ C) q5 X& z3 Z" D* MHAL_GPIO_WritePin
( u* `- G7 x& [4 S9 j0 q  f2 a给某个引脚写0或1,但是不要理解成,写1就是使能之类的意思,有些寄存器写1是擦除的意思
' A( O- U: c* Y2 H$ ?
  1. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
    ! Z; t% i& O, ?2 T9 S4 q
  2. 例:HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9,GPIO_PIN_RESET)
复制代码
" c1 J9 V7 Q; ^0 k4 j. @2 o
HAL_GPIO_TogglePin7 \; Q0 l  b- W; p1 T6 k3 }! ]
翻转某个引脚的电平状态
; l3 }: `+ v' ]" b
  1. void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
    / K& F- X+ l9 W. [
  2. 例:HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9);
复制代码
  O! i% d" n0 O$ a
HAL_GPIO_LockPin5 Q- [1 u9 h' e
如果一个管脚的当前状态是1,读管脚值使用锁定,当这个管脚电平变化时保持锁定时的值,直到重置才改变/ z- s% J' E9 W& u  e! l
  1. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
    / r' w( i& A7 C# X2 |
  2. 例:
    / U! r" i( m0 K
  3. HAL_StatusTypeDef hal_State;
    - d' B3 f; F: R+ A9 d5 f4 {% o% e
  4. hal_State = HAL_GPIO_LockPin(GPIOF, GPIO_PIN_9);
复制代码
1 t# @" q+ L8 V6 e6 Y: q: Y
HAL_GPIO_EXTI_IRQHandler8 |3 @  k- @% _2 w+ R. s  H
这个函数是外部中断服务函数,用来响应外部中断的触发,函数实体里面有两个功能,1是清除中断标记位,2是调用下面要介绍的回调函数。实际调用的是下边的中断回调函数
' p0 Z7 P4 R7 @/ l  _
  1. void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin): U: {& g$ B( e. P
  2. 例:HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
复制代码
  e/ g6 F4 A9 g5 h. D3 a
HAL_GPIO_EXTI_Callback
- m& [, s# L. j$ R+ O  U中断回调函数,可以理解为中断函数具体要响应的动作。. W  x) q7 h9 k
  1. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    3 k  e5 I0 H7 \1 X2 T; [/ l
  2. 例:HAL_GPIO_EXTI_Callback(GPIO_Pin);
复制代码

* A5 K% _- T3 Y, m4.LED工程
& v: V0 P$ r9 S" i1.LED电路原理图
, D( h4 e# X9 S( M/ J% }, H* A& X/ \* e& R
20210424110119129.png

) Q5 g+ z! O, v( C0 q- L) S
8 C0 c9 r+ T. K4 v6 k8 g4 A2.GPIO_PIN_SET与GPIO_PIN_RESET1 f. ~& F5 Z* R" Y& J9 C. p
  1. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
      t+ I7 M3 S* U2 T0 j
  2. {; h/ N4 J  p  p* W; M8 L% Z% @
  3.   /* Check the parameters */+ v  q! l; W3 @& b0 p
  4.   assert_param(IS_GPIO_PIN(GPIO_Pin));& `( {" h# }/ K; M
  5.   assert_param(IS_GPIO_PIN_ACTION(PinState));6 f* _0 m7 i2 a; N9 P
  6. 9 a$ f& D9 c1 n
  7.   if (PinState != GPIO_PIN_RESET)- e1 y9 \% j' ]0 w
  8.   {1 G6 p8 I( S8 a) V. O, `1 B1 V9 ?
  9.     GPIOx->BSRR = (uint32_t)GPIO_Pin;//如果是GPIO_PIN_SET,则将GPIO的BSRR寄存器低16位置为GPIO_Pin# _- m, @7 P6 N; t3 x( Q) u1 g
  10.   }* l" u7 F+ i: q
  11.   else: a2 _* i0 `: t  z
  12.   {" v9 k- d% _  x; S) I9 s2 W
  13.     GPIOx->BSRR = (uint32_t)GPIO_Pin << 16 ;//如果是GPIO_PIN_RESET,则将GPIO的BSRR寄存器的高16位置为GPIO_Pin
    * Y9 E: i$ s3 B2 `
  14.   }
    5 p( m& L9 V  f# D& q
  15. }
复制代码

+ L. H4 m! ^2 p( A( y例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_SET,则GPIOA->BSRR=((uint32_t)0x0002U);即把二进制0000000000000010转换为32位数赋值给BSRR,对应的GPIO_Pin_1管脚置高;
1 G5 h2 l- V) g; z- \' S' O* r! L6 f6 H8 [/ h1 }
例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_RESET,则GPIOA->BSRR=((uint32_t)0x0002U<<16);即把二进制数0000000000000010左移16位并转换为32位数赋值给BSRR,高16位对应的GPIO_Pin_1为1,对应管脚被清零,置低;
0 n; m% e% y1 S4 ?) [. d7 A, ^
8 j; _) ]. l4 N9 H3.锁存器% I( g5 D! v, X
锁存使能(LE)输入和输出使能(OE)输入对于所有锁存器是公共的。, _6 B$ v  e" m/ W* K4 f% N
LE为高电平时,Dn输入端的数据进入锁存器。 在这种情况下,锁存器是透明的,即每当其对应的D输入改变时,锁存器输出就改变状态;
6 O! T/ h% S: f8 C: C当LE为低电平时,锁存器将存在于D输入端的信息存储在LE的高电平至低电平转换之前的建立时间;
6 @; J) E( k2 c9 E- b当OE为低电平时,8个锁存器的内容在输出端可用;- h0 m  n6 j6 \* {* g
当OE为高电平时,输出变为高阻态关闭状态。OE输入的操作不会影响锁存器的状态。1 G) Q! Q1 i) y$ X: T6 t
" w0 c2 M. m" E- i1 O- m
4.用端口输出控制函数控制LED闪烁
1 p1 p) D( Q$ e0 V% B/ v- `
  1.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET);                //端口输出控制函数,PC8端口输出高电平,使LD1熄灭* H- I- q/ f: \1 c$ m3 d# F
  2.         HAL_Delay(300);: D0 j* `/ o$ U3 ~! f5 [# _
  3.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);        & r+ j6 S! i3 U
  4.         HAL_Delay(300);
    ' A+ S7 {  L: o) V: n( q
复制代码
# V) G8 \1 g7 j0 j: }
3 ?; w2 j/ [( n' @
5.用端口输出翻转函数控制LED闪烁: M. G: W( _0 j0 C( t( J
  1.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_8);    //端口输出翻转函数
    5 o3 f) c8 q5 v. O$ U0 {9 K- m
  2.         HAL_Delay(300);
复制代码

7 h/ @' s6 Z4 S$ h$ p. _+ i7 @6 y9 |& _: I8 E4 d' b9 Z
6.使用锁存器2 J; J3 v+ X# M6 W4 x2 C
  1.         HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);                  //锁存器输出高电平
    5 I5 R! y6 g) i. ]1 d
  2.         HAL_GPIO_TogglePin(GPIOC,LD1_Pin);                   //端口输出翻转函数 * ^& y: y) b8 ^6 g" ^9 ~
  3.     HAL_Delay(300);
      b1 q; R: `9 R
  4.         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);                //锁存器输出低电平
复制代码

5 D& C: }0 G$ K2 Y: m* |7.LED跑马灯5 t; T$ }$ C3 B
  1. #define DELAY_TIME        100
    : ?. J4 f' ?8 A( S$ l' }; V
  2. void LED_test(void)
    4 l0 y; e% Z, I. X  r
  3. {- B. j& `2 g' N+ ]+ w7 ?# s
  4.            HAL_GPIO_TogglePin(GPIOC, LD1_Pin);
    5 b! z/ J) F! U# {( N
  5.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);: D1 C& P) q) u9 U
  6.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);: j1 U& M3 P2 M2 y8 p
  7.                 HAL_Delay(DELAY_TIME);
    3 p8 o+ R! n( D) ?4 D, {. Z
  8.                 " N- C* D/ V. q3 b" c. f9 u7 e: F2 u
  9.                 HAL_GPIO_TogglePin(GPIOC, LD2_Pin);
    + G4 ^- U$ O$ _
  10.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    % R- ]# c! N  \3 x
  11.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);: U8 n( k- s! {6 ~; Q/ T4 k. L7 y: T& ]
  12.                 HAL_Delay(DELAY_TIME);# c% x3 u* M8 J. J: K
  13.                
    + i: F1 e7 p% N, g! S8 e2 _
  14.                 HAL_GPIO_TogglePin(GPIOC, LD3_Pin);
    + p, }5 ~6 y, ]8 ^
  15.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);* ^* f4 t2 H& z' ^4 B
  16.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    $ I1 {* k1 x6 a/ I( |! a
  17.                 HAL_Delay(DELAY_TIME);
    ; I8 ?  H+ Y9 y2 D
  18.                 0 G- _( |' X7 w2 N/ S
  19.                 HAL_GPIO_TogglePin(GPIOC, LD4_Pin);1 y( T# q$ ~/ c4 v. R0 Y' w& F9 _
  20.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    8 p- U! H9 L7 B7 y2 v& C
  21.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);. z1 n8 p8 x! E
  22.                 HAL_Delay(DELAY_TIME);# v, j" j; C( Z# m, y* h: c! F
  23.                
    4 i$ \- n+ G/ `5 H9 c( o
  24.                 HAL_GPIO_TogglePin(GPIOC, LD5_Pin);
    ! t: z7 I4 j! X, Q% n3 C
  25.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    ( g9 b+ o6 o+ y6 f& f3 G
  26.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);5 l% R7 v. r7 L
  27.                 HAL_Delay(DELAY_TIME);
    - M* A8 T2 g, b/ c; ~- @
  28.                 : x) _- t9 D4 b3 B# S- a
  29.                 HAL_GPIO_TogglePin(GPIOC, LD6_Pin);
    1 ]( t9 ]8 L1 v- F
  30.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    $ q2 [  |# r, q. P, ]
  31.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    2 W8 ~2 f8 C! y% b# m
  32.                 HAL_Delay(DELAY_TIME);
    + S/ h" D; j0 W3 E' _
  33.                 1 W8 Z8 f/ E5 ~9 \0 @6 @
  34.                 HAL_GPIO_TogglePin(GPIOC, LD7_Pin);
    ; b5 _" h& `' P9 ?
  35.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    & r8 r2 x2 g# m3 F4 _
  36.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);& a8 }' H3 R. n4 Q" t5 m
  37.                 HAL_Delay(DELAY_TIME);1 u4 G( V) k1 l* s- T& B
  38.                 7 V0 ?; V9 H; V+ @9 r( j) A
  39.                 HAL_GPIO_TogglePin(GPIOC, LD8_Pin);# y) f  m" s  |! h4 J
  40.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    6 {+ f  B6 v' }1 |' @$ E* w
  41.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    ! |+ Q7 G8 P/ g8 q7 d$ f4 |
  42.                 HAL_Delay(DELAY_TIME);        
    * m9 y; T  J* N) u4 O* _
  43. }
    . L5 `% E/ C4 I9 K3 t# w9 P9 Q& M) \8 w
复制代码
* `1 G! O7 L" \

- M  b& r3 d* }
( ~+ k: H& c. O1 T5 w. R3 i) i
收藏 评论0 发布时间:2021-11-13 00:01

举报

0个回答

所属标签

相似分享

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