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

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

[复制链接]
STMCU小助手 发布时间:2021-12-8 22:00
1.使用keil5的注意事项# B% t9 X/ [' x8 R
用STM32Cube生成程序驱动后 将程序写到以下范围内,以程序保证用STM32Cube重新生成工程后不被删除 。# K$ y* F8 o! |9 n$ i
  1. /* USER CODE BEGIN 1 */     //代码开始( [( R- V6 j* c# p0 V$ l
  2. ' W0 J' i# f" O1 Y( v
  3. /* USER CODE END 1 */                //代码结束
复制代码
) W% j' k. o5 t/ I9 g7 ]+ o
2.HAL库延时函数: n: E, K; w+ X: U& k7 ]% O3 I- `+ [
1、HAL库自带延时函数(毫秒,阻塞)& Y( [1 `! b+ }/ |/ b. \, J; n
  1. HAL_Delay(x);8 c" g; a  j* g  |
  2. 实际延时时间为(x+1)ms
复制代码

' \* j9 h% h6 J  ^2 v% dHAL库函数为了防止无意义延时(即0ms延时)的产生,在HAL_Delay函数传入参数之后会对参数加1。 如果使用HAL库默认延时函数进行延时,实际延时时间将会比预期时间多1ms。换句话说,HAL_Delay函数至少会产生1ms的延时。
5 ~7 N0 d7 ?! m" ~- n) e# r
! L8 E+ L) I9 h2 c* c, p3 d/ k) C! O2、重新定义延时函数,非阻塞式延时6 n# W& E. I& H/ W
  1. void Delay_us(int16_t nus) 4 C* S& Q+ G: G/ I* P
  2. {
    4 \8 r8 _9 a" Q) W; J
  3.   int32_t temp;
    $ ]  l" y0 g( B
  4.   SysTick->LOAD = nus*9; //72MHz1 y. H* k1 B  E$ t3 i
  5.   SysTick->VAL=0X00;
    ' x% t8 L1 U/ x4 ?  o7 N; D
  6.   SysTick->CTRL=0X01;
    + y. z% f. \% Y4 C6 y2 [7 O
  7.   do
    . |  s/ c+ l# R' ?9 x
  8.   {
    6 V5 P: e4 z, I" a) t3 w
  9.     temp=SysTick->CTRL;; Z8 j$ a) X5 _" c6 m2 R
  10.   }
    ) J* K  X0 k7 P5 P+ _# z4 Y& Z
  11.   while((temp&0x01)&&(!(temp&(1<<16))));
    & {  R( e3 B' R4 n/ C

  12. " Z! G" L, {1 u6 [% D2 H
  13.   SysTick->CTRL=0x00; ; R: O$ x- `5 s8 Z
  14.   SysTick->VAL =0X00; ) Y" {, f( P. i: l4 ]- t$ W4 R: @
  15. }1 E! L/ J% @; ]" p" P+ f
复制代码

$ x5 C" h& v- A3.HAL库配置GPIO* l3 {- ~/ q# z' j
  1. void              HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init);  X. q; z$ o1 N+ I& A, M& e, v( ]
  2. void              HAL_GPIO_DeInit(GPIO_TypeDef  *GPIOx, uint32_t GPIO_Pin);$ M1 y; E) W& r9 S# E# ^. B
  3. GPIO_PinState     HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);  //端口输入读取函数
    ( |$ O* T3 a& N* l6 e# p" I+ m9 i3 m
  4. void              HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); //端口输出控制函数
    % S' b; h& ?) y! [7 Q/ E8 c
  5. void              HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);  //端口输出翻转函数 / h/ ]" u/ |! F) I8 d* x1 K: s
  6. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);" c" i- B3 v: \0 U4 A6 L/ D0 o
  7. void              HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);' n, z$ B2 v2 t2 l* }. B! ~
  8. void              HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
复制代码

% e" l$ ]' I9 i# ?* m2 m! P5 J& E解释:$ q  k! V3 {6 g  e
0 w9 X, A) t' W8 y) c
HAL_GPIO_Init
1 ?7 Q: G1 z! b* j3 ]( @" R  }. l初始化我们需要用到的引脚的工作模式,包括具体引脚的工作速度、是否复用模式、上下拉等等参数。5 }- M6 C7 J- h2 q
  1. void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
复制代码
' j, k0 T* U" Y) ]+ W1 [( ^4 [
HAL_GPIO_DeInit) A5 b$ k% e8 ~2 D5 g0 S
将初始化之后的引脚恢复成默认的状态–各个寄存器复位时的值4 q/ {- Y' A0 R
  1. void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)
      ~, o4 v: R- n2 z$ a
  2. 例:HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);
复制代码

* l2 i; ~% H9 v9 a3 SHAL_GPIO_ReadPin
! l. y7 U7 L) `# {- ?读取我们想要知道的引脚的电平状态、函数返回值为0或1。
8 H, ]9 ~9 H; q( ^: p7 |0 g, j
  1. GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
    ) @% O6 H1 D5 W' x
  2. 例:pin_State = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_9);
复制代码
* u2 j+ w! }/ |! k# {! O9 |- ]
HAL_GPIO_WritePin# @" y6 S2 Y# P/ I' x2 W& c; z( F
给某个引脚写0或1,但是不要理解成,写1就是使能之类的意思,有些寄存器写1是擦除的意思  Q- h, w! h/ Y8 L  Z! u
  1. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)5 V. n* v" u; T
  2. 例:HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9,GPIO_PIN_RESET)
复制代码

+ g+ D4 z" Y( ]2 t$ KHAL_GPIO_TogglePin
1 i! h' p/ D) k. c: K翻转某个引脚的电平状态( ~# L. q. N% `4 R) P1 B
  1. void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
    : {; o0 b, i( U$ W) P; @' W
  2. 例:HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9);
复制代码
& @  s" l0 n5 N8 a3 [
HAL_GPIO_LockPin  I- P4 ?* |, l4 A6 P
如果一个管脚的当前状态是1,读管脚值使用锁定,当这个管脚电平变化时保持锁定时的值,直到重置才改变
- Q1 N6 r) A- D& x4 s$ E2 G0 r
  1. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)1 T5 t- x$ @2 k$ [/ N' u
  2. 例:% u+ x9 a/ [; S" R
  3. HAL_StatusTypeDef hal_State;
    ) V& E' I. A3 j
  4. hal_State = HAL_GPIO_LockPin(GPIOF, GPIO_PIN_9);9 l+ i3 [/ u; w. |* j

  5. : H  ^1 ^0 l2 T" F; P* J9 C) m
复制代码

, x7 G# B6 l( ]9 d2 |, D, oHAL_GPIO_EXTI_IRQHandler6 N3 K; x% z. U, M2 J4 k. H
这个函数是外部中断服务函数,用来响应外部中断的触发,函数实体里面有两个功能,1是清除中断标记位,2是调用下面要介绍的回调函数。实际调用的是下边的中断回调函数
* i2 H  t/ B4 C' r0 n. f6 N4 x* [
  1. void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)" |& Q/ m$ b3 c. G
  2. 例:HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
复制代码

; Y( T8 F8 \# x+ }5 l: _HAL_GPIO_EXTI_Callback
& K8 k. C$ C; @7 w( @0 E  h" L5 y中断回调函数,可以理解为中断函数具体要响应的动作。; y! o  u- D0 m: A
  1. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    + `) P. _$ ~: I) r9 I# i
  2. 例:HAL_GPIO_EXTI_Callback(GPIO_Pin);
复制代码

8 [' ]5 A/ h' J% p
7 F2 P0 @( d3 ?' n4 T4.LED工程
8 t* j7 Q! h) e6 t; A5 b1.LED电路原理图
* a* |; C1 G$ D, {2 K" X$ C7 k0 R9 A" H
20210424110119129.png

/ D5 ?8 F/ G+ a. @8 ]+ Z
* l: u8 z' y$ c3 k* p2.GPIO_PIN_SET与GPIO_PIN_RESET" k. p1 e5 v6 }, ^6 L
# D$ |9 m* I& ?/ U  t
  1. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState): Q+ d# v8 J# d$ l
  2. {! `, L4 w( a, q) {8 G" G
  3.   /* Check the parameters */- h+ v1 `, T# C5 ~6 X
  4.   assert_param(IS_GPIO_PIN(GPIO_Pin));
    5 A3 n9 O; L. `  ]( X: P2 M- }& ?
  5.   assert_param(IS_GPIO_PIN_ACTION(PinState));4 U% Q1 {+ t. z9 [

  6. 7 t4 t: _% U. W$ ^" W
  7.   if (PinState != GPIO_PIN_RESET)
    " D: k; D) I! g0 c5 @& @' Y: v: [
  8.   {1 `0 V+ m: B/ }$ @  M3 ?3 u8 y4 }' c
  9.     GPIOx->BSRR = (uint32_t)GPIO_Pin;//如果是GPIO_PIN_SET,则将GPIO的BSRR寄存器低16位置为GPIO_Pin
    + U7 R# t0 y9 ^; m, \
  10.   }
    ' A- X1 `# [4 u& v5 Q
  11.   else- h7 m! s5 N) I" V
  12.   {
    8 O+ n/ C% C9 S) G
  13.     GPIOx->BSRR = (uint32_t)GPIO_Pin << 16 ;//如果是GPIO_PIN_RESET,则将GPIO的BSRR寄存器的高16位置为GPIO_Pin1 w/ p8 {5 `: u' T3 R7 V' ^7 ?
  14.   }0 w5 w& `8 }3 C3 C8 R
  15. }
复制代码
: S3 d5 R- N/ T* Z( P" Z
例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_SET,则GPIOA->BSRR=((uint32_t)0x0002U);即把二进制0000000000000010转换为32位数赋值给BSRR,对应的GPIO_Pin_1管脚置高;/ a/ @. k1 i: D9 p# i' o: @

: [+ P& l) D; Q+ W例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_RESET,则GPIOA->BSRR=((uint32_t)0x0002U<<16);即把二进制数0000000000000010左移16位并转换为32位数赋值给BSRR,高16位对应的GPIO_Pin_1为1,对应管脚被清零,置低;
2 F" W% S9 L/ V$ S6 @" d/ `5 z  a' _, G
3.锁存器! F7 w4 m7 n, G2 B3 m6 R8 L2 s6 S
锁存使能(LE)输入和输出使能(OE)输入对于所有锁存器是公共的。
  ~0 |3 M$ D5 `5 c3 @/ z- g
3 h, k9 v* D5 l/ S2 ], O2 G) LLE为高电平时,Dn输入端的数据进入锁存器。 在这种情况下,锁存器是透明的,即每当其对应的D输入改变时,锁存器输出就改变状态;) [' R. k" |" I% g
当LE为低电平时,锁存器将存在于D输入端的信息存储在LE的高电平至低电平转换之前的建立时间;! F3 m4 m, b9 Q" }
当OE为低电平时,8个锁存器的内容在输出端可用;$ B( t7 M1 j  ~
当OE为高电平时,输出变为高阻态关闭状态。OE输入的操作不会影响锁存器的状态。1 l- q5 I) O" {! u2 B
4.用端口输出控制函数控制LED闪烁
: j* Q: d' Y# `8 r1 j! A% ?0 C7 t' V" ]8 b3 ^( w$ Z; S& h
  1.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET);                //端口输出控制函数,PC8端口输出高电平,使LD1熄灭% Y. ~- n) U' U
  2.         HAL_Delay(300);
    : v0 n7 O* ~, c- h/ m7 h( D
  3.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);        - X  g# w. k. \& R* O2 u1 J% i
  4.         HAL_Delay(300);
复制代码
% I: p/ Q) g( O
5.用端口输出翻转函数控制LED闪烁+ H, `; c$ Z# z' V! t' q$ r
  1.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_8);    //端口输出翻转函数 , {1 ^/ U$ d4 U6 M' U# i
  2.         HAL_Delay(300);
复制代码
5 t9 x" i7 F8 P; Z
6.使用锁存器
  1.         HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);                  //锁存器输出高电平
    # L% ]3 n2 B# c  t
  2.         HAL_GPIO_TogglePin(GPIOC,LD1_Pin);                   //端口输出翻转函数
    6 {4 ]; Z' A0 }0 ]( F, I1 p
  3.     HAL_Delay(300);0 S8 D( y6 x+ @) K
  4.         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);                //锁存器输出低电平
复制代码

; D- v, N8 A. u# t2 _  _7.LED跑马灯6 M! i2 C2 R" n, H) o

/ v* a7 Z7 C; t# D. g: \
  1. #define DELAY_TIME        100+ {) I" s# \. z6 F, q
  2. void LED_test(void)
    3 m! g; L" g# D5 n
  3. {
    ! S* X' B  b* Q, X" t% o  r
  4.            HAL_GPIO_TogglePin(GPIOC, LD1_Pin);( K! W7 Q/ r- Y
  5.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    / x# U( z4 `" d/ }) J: [+ _
  6.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);' w' N2 }- f3 O6 z. k
  7.                 HAL_Delay(DELAY_TIME);
    ! j, i/ @4 i9 N. d
  8.                 4 z) C8 e, t, z$ }% ~) U( x
  9.                 HAL_GPIO_TogglePin(GPIOC, LD2_Pin);
    . a- X, F6 X5 n! E) i
  10.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    % }( B5 e. F5 S- y# T8 L
  11.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);8 Z% o4 u. ^- p
  12.                 HAL_Delay(DELAY_TIME);
    ; ~* B7 N/ B# `# c0 n5 F3 }2 K2 m
  13.                 6 J5 V& F& J2 a& U
  14.                 HAL_GPIO_TogglePin(GPIOC, LD3_Pin);
    9 X" u/ v+ K4 `* V4 B
  15.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);( I% c% V1 ~) l/ \
  16.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    $ r) A  s1 |# ?; q
  17.                 HAL_Delay(DELAY_TIME);
    * ^6 K, w5 f# J: [' c& c% Y( {
  18.                
    * S. u$ \$ d+ S1 r: z0 K4 L
  19.                 HAL_GPIO_TogglePin(GPIOC, LD4_Pin);
    1 ~3 C2 Q( ~& ^0 z# F. W7 ~7 |
  20.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    9 I, \( ?% a( p( C2 d, c' V6 S4 W7 V& f
  21.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    & j) v6 A" p' {( H$ T  ~
  22.                 HAL_Delay(DELAY_TIME);
    0 R* ?3 F$ X2 o; N+ c
  23.                 8 n  h! f' I, F6 [" X, {
  24.                 HAL_GPIO_TogglePin(GPIOC, LD5_Pin);
    3 n) C. [8 `- {$ F9 r
  25.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    " F4 S2 [9 ?9 J- N0 J7 L
  26.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    2 x/ F# y  C1 n
  27.                 HAL_Delay(DELAY_TIME);
    ; I3 |4 n6 i1 N3 v
  28.                 : z6 A0 [2 c) o: h. A$ s. x; u
  29.                 HAL_GPIO_TogglePin(GPIOC, LD6_Pin);
    , a" p5 u+ M! F' z
  30.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);; Z0 o# }2 A" }
  31.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    # q2 K5 z9 w+ h( o6 `/ g
  32.                 HAL_Delay(DELAY_TIME);
    : E5 D6 {( i/ {2 Q( E. H8 Q
  33.                 4 i# {" T( ?, g+ |+ u
  34.                 HAL_GPIO_TogglePin(GPIOC, LD7_Pin);& e, M( Q8 ]6 W% ?
  35.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);! M+ c4 E: S; ]- u
  36.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);+ b4 i6 d! J8 j+ z1 l! a( `
  37.                 HAL_Delay(DELAY_TIME);
    # g6 }3 k: k/ a3 w
  38.                 & r. C* K# d3 s# u" `8 t
  39.                 HAL_GPIO_TogglePin(GPIOC, LD8_Pin);  M- g( I$ W: g1 u8 T- V
  40.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    1 ^& v2 o$ a& U! P( L. p) P1 b
  41.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);" J: ^! @, b& {
  42.                 HAL_Delay(DELAY_TIME);        0 R/ Z) U4 P. U/ ^
  43. }9 i1 u1 k% ~* B& u5 R8 O
  44. + I* J: G" D: q' P
复制代码

# E+ A+ ~+ R! [  b6 [5 |6 d$ K8 n3 F& z8 P
收藏 评论0 发布时间:2021-12-8 22:00

举报

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