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

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

[复制链接]
STMCU小助手 发布时间:2021-12-8 22:00
1.使用keil5的注意事项( B# k" [3 W. g/ A1 y& d
用STM32Cube生成程序驱动后 将程序写到以下范围内,以程序保证用STM32Cube重新生成工程后不被删除 。
/ c2 r  L$ B& t7 d; K& m7 n/ r# s
  1. /* USER CODE BEGIN 1 */     //代码开始
    ( f! W1 I4 P) ]! Z) h
  2. * O! O, i# |, t2 t0 b/ |
  3. /* USER CODE END 1 */                //代码结束
复制代码
4 J% d/ u2 f' j+ o5 r
2.HAL库延时函数
. ]$ R/ `5 g$ E; O; d: f) h4 E6 }1、HAL库自带延时函数(毫秒,阻塞): M) k$ M8 Q' K" V3 F) X4 Y. I0 B7 p
  1. HAL_Delay(x);
    . Y: O) A9 S' @
  2. 实际延时时间为(x+1)ms
复制代码

! F6 ], J- v8 y8 v4 f0 GHAL库函数为了防止无意义延时(即0ms延时)的产生,在HAL_Delay函数传入参数之后会对参数加1。 如果使用HAL库默认延时函数进行延时,实际延时时间将会比预期时间多1ms。换句话说,HAL_Delay函数至少会产生1ms的延时。; p4 k; T' k/ h6 u: a2 y

+ [4 p5 H: Z% i0 |- u% ?5 q: Y# V2、重新定义延时函数,非阻塞式延时
/ S0 g! o3 n* C7 C! |" z! V) L' Q
  1. void Delay_us(int16_t nus) ' ~5 }6 s) Q. y5 }# Q' ?
  2. {
    ; F7 m* L- P6 H9 N, U
  3.   int32_t temp; & y- _+ l, p5 W) T3 i
  4.   SysTick->LOAD = nus*9; //72MHz
    " c7 Y0 ]9 ^) I9 U% W) z
  5.   SysTick->VAL=0X00;
    , q, m4 [" h9 t, u% G7 O4 d; v
  6.   SysTick->CTRL=0X01;
    & B: _9 R4 c6 F+ x* U7 Z# F3 B
  7.   do
    + r4 T+ P9 E% M7 T
  8.   {
    5 F4 w/ }/ P5 h. K8 H4 S# g2 i' n
  9.     temp=SysTick->CTRL;
    1 c0 K* C, W; {6 N, O, }0 N
  10.   }* s& K/ ~7 V  ]* F3 L: h  M
  11.   while((temp&0x01)&&(!(temp&(1<<16))));
    ; E- c. V* l4 X

  12. $ F3 f3 P% s3 x; _9 N% Q1 y
  13.   SysTick->CTRL=0x00;
    ' s7 G+ x; Q. G" ^
  14.   SysTick->VAL =0X00;
    % Y  B0 g' h' C" c" Y2 J! q
  15. }
    # {( J4 a3 O8 g( j1 V  o) K: L
复制代码

  s4 S+ |/ o) J/ u! }  s3.HAL库配置GPIO
8 A1 ?3 J# j- ?( P; A
  1. void              HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init);
    - B' {# E  q2 @- K0 H& {7 j
  2. void              HAL_GPIO_DeInit(GPIO_TypeDef  *GPIOx, uint32_t GPIO_Pin);& f+ a# w9 B" U  Q
  3. GPIO_PinState     HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);  //端口输入读取函数, q0 G) Z) x% e, n8 }) J
  4. void              HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); //端口输出控制函数) h# ?+ Q) f/ w- a! w
  5. void              HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);  //端口输出翻转函数 0 ]' y: }* r6 r9 }! [5 R( m8 H
  6. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);  h# h6 @, {3 E& r  K
  7. void              HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);  M( I$ M* R9 h! J" ?5 N
  8. void              HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
复制代码
9 k) N# r& J, U7 r
解释:
% ^' V# T& y& ]) e' C/ L% _; b4 F% ~* E! V& ^' \9 n
HAL_GPIO_Init
' Q* G$ Y. z  c7 `3 n7 \初始化我们需要用到的引脚的工作模式,包括具体引脚的工作速度、是否复用模式、上下拉等等参数。. T9 z8 j, _$ x; {& F. k
  1. void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
复制代码

. k/ p- D( w3 o% JHAL_GPIO_DeInit
( o" B7 s; ]3 Q将初始化之后的引脚恢复成默认的状态–各个寄存器复位时的值
* ?: K- `$ Q1 }- y% m
  1. void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)
    ! d- k3 Y5 L! }# X' k7 f, F$ a6 u
  2. 例:HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);
复制代码

1 {. h! X: A! {3 t; W+ I: XHAL_GPIO_ReadPin
. T: }" z! x+ Y# T0 c5 u) j读取我们想要知道的引脚的电平状态、函数返回值为0或1。/ p" [" I; r" F5 L+ y! |5 f8 g
  1. GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
    4 w0 m7 C6 c8 z5 W- E* U( I! }
  2. 例:pin_State = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_9);
复制代码

+ j7 I+ t% R& v- n( z" wHAL_GPIO_WritePin
- t8 X  c" B7 ^, |2 J. v  q给某个引脚写0或1,但是不要理解成,写1就是使能之类的意思,有些寄存器写1是擦除的意思
) H8 \- m: `0 S& ^- @
  1. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
    - O. e+ }6 F: H# F
  2. 例:HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9,GPIO_PIN_RESET)
复制代码
6 [# G" E8 s3 [+ _; h9 J
HAL_GPIO_TogglePin8 y  J" c# g" o) |+ A* Z9 H
翻转某个引脚的电平状态
" L( V% V( {  V
  1. void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
    * U  }5 {* `2 H6 D' A8 n# A
  2. 例:HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9);
复制代码

: E: l& _, ?" q  gHAL_GPIO_LockPin
3 Q; G: C5 n9 C' W如果一个管脚的当前状态是1,读管脚值使用锁定,当这个管脚电平变化时保持锁定时的值,直到重置才改变0 H2 \& n8 V. y& Y1 F4 \- T
  1. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)3 R/ p$ e: T+ ~; w
  2. 例:0 P1 i, |/ Z* t/ Y. F4 J, p
  3. HAL_StatusTypeDef hal_State;0 X/ }" u5 H& h/ j; ]: {- O* W
  4. hal_State = HAL_GPIO_LockPin(GPIOF, GPIO_PIN_9);9 z0 b; S5 D: o: {- u6 @" f* T4 D

  5. $ u& k$ O" ^/ M1 V
复制代码
1 E  m) S3 |9 {3 b
HAL_GPIO_EXTI_IRQHandler% S" b$ E' z0 E+ @$ v
这个函数是外部中断服务函数,用来响应外部中断的触发,函数实体里面有两个功能,1是清除中断标记位,2是调用下面要介绍的回调函数。实际调用的是下边的中断回调函数* K& ]1 h+ m4 w+ c, u1 u0 d
  1. void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
    0 Z7 \$ V8 I5 p! E8 f  |
  2. 例:HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
复制代码

- i* p$ s: Q! ~$ t0 B- ?$ gHAL_GPIO_EXTI_Callback: F. s! H( P8 z) W8 a/ d9 Z$ K' d
中断回调函数,可以理解为中断函数具体要响应的动作。& k/ |" @  r( G
  1. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    2 l1 D) E0 O) D& H: B$ ~
  2. 例:HAL_GPIO_EXTI_Callback(GPIO_Pin);
复制代码
5 C( G. A. J; p9 |9 G' b8 Z; |) U. o

- b# w# }0 [6 z& v- W3 B4.LED工程6 q% s& q' G% y. s  P
1.LED电路原理图
/ X7 J8 v, k$ i7 a) l' U! T
4 W9 o& Z; R' p: }- s
20210424110119129.png

! m0 B) p9 A7 O! p4 s# W: m  S) {0 h" G$ E
2.GPIO_PIN_SET与GPIO_PIN_RESET& _; U4 O- h4 j8 e

7 @4 ]1 ?6 d" I0 Z
  1. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState). {3 V2 w5 u/ g- o, D4 p, a6 ~
  2. {
    $ x  k. x9 N% m% U; a
  3.   /* Check the parameters */0 N8 i% I/ a$ ^2 [% N( M5 m
  4.   assert_param(IS_GPIO_PIN(GPIO_Pin));
    ) x( ~8 \# Q. F8 d; C+ q4 K' m
  5.   assert_param(IS_GPIO_PIN_ACTION(PinState));
    - d' R( P/ f' E. S' l2 N! q# w# S

  6. ' ?1 R/ R! i: x/ W2 i3 z/ Z
  7.   if (PinState != GPIO_PIN_RESET)% T5 H1 u- J- Z9 [9 Y
  8.   {
    . {  t# N) a- G, ]% h
  9.     GPIOx->BSRR = (uint32_t)GPIO_Pin;//如果是GPIO_PIN_SET,则将GPIO的BSRR寄存器低16位置为GPIO_Pin) g/ p* J: R% {" ]5 c. |9 Z6 z$ M
  10.   }
    # G# G3 U$ q  U( h- Z, O6 k% z
  11.   else
    : r* z+ U$ ^: w% s. m" a
  12.   {7 [( t1 Q" }2 Y3 `
  13.     GPIOx->BSRR = (uint32_t)GPIO_Pin << 16 ;//如果是GPIO_PIN_RESET,则将GPIO的BSRR寄存器的高16位置为GPIO_Pin
    6 o4 T& W: v( @- [$ |( g9 t. F
  14.   }) x* D: V; x+ s+ V. v6 T
  15. }
复制代码
& y, s0 @. x: Z  V; y
例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_SET,则GPIOA->BSRR=((uint32_t)0x0002U);即把二进制0000000000000010转换为32位数赋值给BSRR,对应的GPIO_Pin_1管脚置高;  J% n3 S# e; {2 K! u- v& y9 p

( p* P, E8 g! e6 W7 E0 f例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_RESET,则GPIOA->BSRR=((uint32_t)0x0002U<<16);即把二进制数0000000000000010左移16位并转换为32位数赋值给BSRR,高16位对应的GPIO_Pin_1为1,对应管脚被清零,置低;+ M7 o* e6 P, E

& r: P1 d+ r- P* O3.锁存器
0 a: q+ L: h. `" l- W3 z4 y锁存使能(LE)输入和输出使能(OE)输入对于所有锁存器是公共的。- l: U0 |7 e' u' m
3 o4 C+ k3 x  Q  |; `  o7 Q1 j
LE为高电平时,Dn输入端的数据进入锁存器。 在这种情况下,锁存器是透明的,即每当其对应的D输入改变时,锁存器输出就改变状态;
: _; o8 a( ?2 @4 i当LE为低电平时,锁存器将存在于D输入端的信息存储在LE的高电平至低电平转换之前的建立时间;
* `$ M5 O+ M% B3 p* D0 W当OE为低电平时,8个锁存器的内容在输出端可用;, A- W- K; S5 Y+ ?4 ~
当OE为高电平时,输出变为高阻态关闭状态。OE输入的操作不会影响锁存器的状态。
$ L; M7 e2 O9 N7 g4.用端口输出控制函数控制LED闪烁: I! x6 k% k2 M
' [  f- M' o$ O
  1.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET);                //端口输出控制函数,PC8端口输出高电平,使LD1熄灭% d* Y$ }, |" D# C; G6 p+ W% h& G
  2.         HAL_Delay(300);
    1 a& W2 W' R( Y# n
  3.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);        ; z0 }, }# W1 z1 n
  4.         HAL_Delay(300);
复制代码
. Q, |$ ]# X# Y' o
5.用端口输出翻转函数控制LED闪烁, O5 p8 V5 ~8 ~* j7 `" h. L
  1.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_8);    //端口输出翻转函数
    & [1 X+ `% k3 ]  R
  2.         HAL_Delay(300);
复制代码
# l" g/ j+ [* ~# V( D# O' S
6.使用锁存器
  1.         HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);                  //锁存器输出高电平8 h* W% n( j$ y) A& W
  2.         HAL_GPIO_TogglePin(GPIOC,LD1_Pin);                   //端口输出翻转函数 8 `! Z9 {2 V" f( ?& q3 ]
  3.     HAL_Delay(300);( @, Z3 |7 S; D$ A2 P
  4.         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);                //锁存器输出低电平
复制代码

$ \! @3 w2 r3 H8 h7.LED跑马灯& Y  e" G, @) w7 m4 V

- k! P+ @, f3 z5 t9 e
  1. #define DELAY_TIME        100# e! G  T, A' c" N$ n% t
  2. void LED_test(void)
    1 A9 Q1 H+ q+ _; L9 \" h
  3. {2 q  `0 m+ ]4 j4 }, o% P
  4.            HAL_GPIO_TogglePin(GPIOC, LD1_Pin);
      q! _; ~# u3 {% Y) i
  5.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    ; p: w$ n  a  g5 V; e
  6.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    + P" l5 W& z! S1 L7 P, ^0 F
  7.                 HAL_Delay(DELAY_TIME);
    3 ~) x( f2 x5 {7 U. T, Z
  8.                
    / V" c* s/ i6 x. z
  9.                 HAL_GPIO_TogglePin(GPIOC, LD2_Pin);8 |5 U" X* i% z) r# W
  10.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    * }9 S4 [4 l5 [- a
  11.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    8 o7 |7 {$ C$ u' ?: ^7 k# p
  12.                 HAL_Delay(DELAY_TIME);8 N, i) `" P+ Q# c/ f, s  J) V! V
  13.                 . ]5 `' q. C0 Z1 {0 W0 p( N; G
  14.                 HAL_GPIO_TogglePin(GPIOC, LD3_Pin);
    % T& y- Z3 S1 d8 \0 T% {
  15.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    1 j, t, ~: L2 ]0 o) o
  16.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    6 M7 y; W+ W0 P, U/ I& D$ |0 N) `) u0 }+ r
  17.                 HAL_Delay(DELAY_TIME);
    3 Z0 w- l4 G5 x8 S  O; a  ~
  18.                
    " ?/ D0 r. L' T" i, y0 ?& {
  19.                 HAL_GPIO_TogglePin(GPIOC, LD4_Pin);
    / {2 |# s4 H: ?. q$ u
  20.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);1 S% s6 }+ G; ~8 Y' ]  o
  21.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);/ R- c( ^' d7 m0 o8 B- Q
  22.                 HAL_Delay(DELAY_TIME);. m/ j+ x7 s  W
  23.                
    1 M- C: f3 C8 a3 m, y  A
  24.                 HAL_GPIO_TogglePin(GPIOC, LD5_Pin);
    ! j- \6 J5 }: n. l/ k( j1 q
  25.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);3 @% i+ |, J8 y+ m
  26.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    ; Q. }8 B( Q. b7 k0 l; G
  27.                 HAL_Delay(DELAY_TIME);
    0 D  Y# W, c- Z2 c
  28.                
    ( N* l! S, N* F
  29.                 HAL_GPIO_TogglePin(GPIOC, LD6_Pin);+ z. k: Z$ k$ J+ g9 n; y7 A
  30.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    & o* m2 Y  @2 x7 q- _
  31.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);  n" E5 C  [; v6 Z" T6 [. R( \4 Q
  32.                 HAL_Delay(DELAY_TIME);
    / s6 Y6 P0 Z/ s- G& p* H& Y# l
  33.                 . m! l( {8 s7 Q$ u( S2 q, r" I# ~
  34.                 HAL_GPIO_TogglePin(GPIOC, LD7_Pin);" P* g! l0 O( e  @4 V) y. x: u
  35.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    - {* A2 [) H0 I5 V
  36.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);5 @7 y3 N  z  o9 z5 d
  37.                 HAL_Delay(DELAY_TIME);/ b5 P( ~* }: i2 ?& k( ~' P
  38.                
    : e' H* ^0 T9 [+ D0 q% D9 o' u
  39.                 HAL_GPIO_TogglePin(GPIOC, LD8_Pin);
    0 ~: f  K5 q0 u, |2 c4 ~% Q
  40.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);8 m$ k7 j2 l' j# W8 M8 l' U% {
  41.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);% X3 r- \  t; y- g- e+ M
  42.                 HAL_Delay(DELAY_TIME);        
    1 J/ ~( V+ T% f2 @
  43. }
    * l6 Y. q5 K0 y0 a* z* f; _0 h
  44. * x  i8 L2 i% ~) R$ N6 S
复制代码
3 U- C: \" t8 Y( w/ N

+ o( G& `1 a- e/ Z( W# y
收藏 评论0 发布时间:2021-12-8 22:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版