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

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

[复制链接]
STMCU小助手 发布时间:2021-12-8 22:00
1.使用keil5的注意事项
* H  }9 Y1 v7 e5 t; _7 }用STM32Cube生成程序驱动后 将程序写到以下范围内,以程序保证用STM32Cube重新生成工程后不被删除 。  `% Z" v" Y% o: c6 V/ z" b
  1. /* USER CODE BEGIN 1 */     //代码开始
    # z! ^% f/ L2 U4 s# i
  2. . \5 P& \( b! J4 z5 W& E
  3. /* USER CODE END 1 */                //代码结束
复制代码
9 V* Z4 B7 \/ T7 l7 R
2.HAL库延时函数
1 O6 d  @. o' b% g1、HAL库自带延时函数(毫秒,阻塞)9 \8 a. p" G; Z! t" X3 k6 [
  1. HAL_Delay(x);
    8 C% [/ v/ F3 K9 t0 ?5 S
  2. 实际延时时间为(x+1)ms
复制代码
" J$ d# _0 o) }* [, ?0 Y+ A6 ]8 `3 L
HAL库函数为了防止无意义延时(即0ms延时)的产生,在HAL_Delay函数传入参数之后会对参数加1。 如果使用HAL库默认延时函数进行延时,实际延时时间将会比预期时间多1ms。换句话说,HAL_Delay函数至少会产生1ms的延时。& s4 D+ M4 k1 L9 j* q% a

8 V) @5 g/ \- A) \6 f2、重新定义延时函数,非阻塞式延时
* l5 R% a2 I$ ~/ @; t, K  ^, d
  1. void Delay_us(int16_t nus) 0 R: C  f$ `. e8 d, f- z
  2. {
    # z! R& Y8 t0 ~5 h3 g6 Q/ D8 @
  3.   int32_t temp; 7 @/ ]- M( n; f) ^" q& Q" S
  4.   SysTick->LOAD = nus*9; //72MHz
    : J. D  Y# R% _- V# G2 x3 T! d7 Z
  5.   SysTick->VAL=0X00;
    - B7 z' b$ {/ E5 f* N- j# i5 P1 U
  6.   SysTick->CTRL=0X01;- q  J  G/ K  Z) f/ `9 P3 h* l( b
  7.   do & M' _3 W5 o. }& R  L
  8.   {
    1 z9 i! D( Z' H6 ^8 N8 |
  9.     temp=SysTick->CTRL;% o* P# J. f3 }# p( \
  10.   }, `  O6 Q. l0 I0 T
  11.   while((temp&0x01)&&(!(temp&(1<<16))));+ U2 D! w$ Q( j6 g7 H; G
  12. 2 C/ A7 D: b. r( {8 X7 \" C" K9 l
  13.   SysTick->CTRL=0x00; * }1 T# n: r4 [) P2 h
  14.   SysTick->VAL =0X00; $ z3 r, R: Z# r! G! `9 A3 S
  15. }
    ( {* \; `9 X, U  \
复制代码

" w* a+ U# B% q5 R3.HAL库配置GPIO: L% h6 F0 a6 |5 H& N! g% H: s
  1. void              HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init);
    9 f& I( {3 e% s) \/ T
  2. void              HAL_GPIO_DeInit(GPIO_TypeDef  *GPIOx, uint32_t GPIO_Pin);
    ! o( @9 F( _; N$ F# x/ K- m' m/ Q
  3. GPIO_PinState     HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);  //端口输入读取函数0 ]" ], Z3 {" X) j8 ~6 ^& q; q% |* J' q- s) D
  4. void              HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); //端口输出控制函数
    * Q" `) m# |9 w" K) v# f
  5. void              HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);  //端口输出翻转函数
    ( a6 s: D3 ?" c0 E4 P
  6. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);( a" C4 j0 Y2 Z. @6 s
  7. void              HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);
    1 I1 T9 C4 Z6 D1 _+ j
  8. void              HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
复制代码
) L& s4 F0 Z4 D' Y3 V
解释:
% k% Q! w$ _6 H& t9 g" f4 h7 m- |( O$ [8 O' d  R" p7 t
HAL_GPIO_Init
! m0 \) B; a$ m7 G初始化我们需要用到的引脚的工作模式,包括具体引脚的工作速度、是否复用模式、上下拉等等参数。' F. H' y( |- L/ F# O! f% b: \& G
  1. void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
复制代码

6 }" F8 R; c2 j& OHAL_GPIO_DeInit: m( f) f" f3 C+ l3 J6 n
将初始化之后的引脚恢复成默认的状态–各个寄存器复位时的值
2 C% a# s4 O" R' `% c2 Y9 ]
  1. void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)% r6 o9 a1 ^* ~" ~& Q
  2. 例:HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);
复制代码

) X( y% R8 R. e1 ^, t  ]HAL_GPIO_ReadPin
% i: y7 s0 u0 q读取我们想要知道的引脚的电平状态、函数返回值为0或1。+ B1 p- T/ N& M# v% I; t
  1. GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)% r, K2 z3 m9 [; ]1 P
  2. 例:pin_State = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_9);
复制代码
( c+ Y- O. }, C' {
HAL_GPIO_WritePin, B4 ?3 W4 E3 _) ^  U3 I
给某个引脚写0或1,但是不要理解成,写1就是使能之类的意思,有些寄存器写1是擦除的意思
  \- z0 V1 [9 U) I) G4 _. x
  1. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)0 f3 m0 P  g- l' ~$ B+ f- v' B
  2. 例:HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9,GPIO_PIN_RESET)
复制代码
! _2 @5 m! z+ o2 b. Y9 |) ^9 K
HAL_GPIO_TogglePin
/ ~* S. Q- \/ J5 d; ~翻转某个引脚的电平状态( ~8 ^. T; c  Q& Q$ Z" d
  1. void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
    2 n! {- ^& e) [) S. S/ P/ w9 K
  2. 例:HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9);
复制代码
4 ]2 N* f! |4 T
HAL_GPIO_LockPin; |4 D/ t# r) U( R, I+ Q% S
如果一个管脚的当前状态是1,读管脚值使用锁定,当这个管脚电平变化时保持锁定时的值,直到重置才改变
3 T6 y7 [3 H5 e$ X& s) j
  1. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)$ W$ u. h7 }% ?9 e" r+ t
  2. 例:
    $ z0 V% }0 \3 V# g3 h
  3. HAL_StatusTypeDef hal_State;2 d* ]1 |; G4 Y
  4. hal_State = HAL_GPIO_LockPin(GPIOF, GPIO_PIN_9);
    # Y# H7 n" }+ T
  5. 4 {0 L* R6 U& v
复制代码

- A) S& w' |# C9 RHAL_GPIO_EXTI_IRQHandler1 h1 m9 l" L4 O. W: O( e/ U" i; m
这个函数是外部中断服务函数,用来响应外部中断的触发,函数实体里面有两个功能,1是清除中断标记位,2是调用下面要介绍的回调函数。实际调用的是下边的中断回调函数
% L( O8 w9 T# t7 y! p  U- F
  1. void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
    6 M' Y4 y4 z, Q3 G/ [2 f
  2. 例:HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
复制代码

+ Q. G7 P) c( n0 Y7 e* {' |- W, [) ZHAL_GPIO_EXTI_Callback" D* C/ C: X: z- D- m& Q; o
中断回调函数,可以理解为中断函数具体要响应的动作。( R: I7 G4 M2 y" B  \2 i
  1. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    % R( K( l! f. A9 x& ]
  2. 例:HAL_GPIO_EXTI_Callback(GPIO_Pin);
复制代码

- r( p# o" @$ V! L) ~) F$ K6 @# _$ C0 @: s7 L6 k5 c3 d) X8 m5 a
4.LED工程
4 \( G3 J$ l& L6 {: H7 _1.LED电路原理图( M& j9 g% J4 c5 f! Q% j
9 ^7 V$ w: Y5 V+ E
20210424110119129.png

" F: a9 e& Y, X  S, a, j  S; y/ H& z
2.GPIO_PIN_SET与GPIO_PIN_RESET8 V& g: s  N" f9 V7 f/ `9 }
) [; Z+ f" B! _* J! O* ]; f7 [
  1. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)$ i5 ~/ `/ p7 A) Y, C  U
  2. {- M8 f3 i  j/ ]
  3.   /* Check the parameters */9 m5 R  }; ?$ g  ]' _
  4.   assert_param(IS_GPIO_PIN(GPIO_Pin));1 J& E' }. _3 @; ^: U
  5.   assert_param(IS_GPIO_PIN_ACTION(PinState));
      q) C8 d$ V: ]- u! m( k% O% P7 q1 {
  6. + s3 E  ?: |, Q( y, q4 V
  7.   if (PinState != GPIO_PIN_RESET)4 ]+ d& m, J3 ?- ]
  8.   {9 F' s* S% g" y
  9.     GPIOx->BSRR = (uint32_t)GPIO_Pin;//如果是GPIO_PIN_SET,则将GPIO的BSRR寄存器低16位置为GPIO_Pin
    9 |" ~7 E2 R% y) e9 T3 ^( f
  10.   }
    1 w" r4 ~* z- a$ [: F
  11.   else
    4 F/ T7 E5 [' [3 ]! O4 P0 `( x
  12.   {
    : r6 Z* {) f+ r/ u' t
  13.     GPIOx->BSRR = (uint32_t)GPIO_Pin << 16 ;//如果是GPIO_PIN_RESET,则将GPIO的BSRR寄存器的高16位置为GPIO_Pin8 m# W1 l8 A# J- |( O
  14.   }
      ?1 l  y* F8 Y0 E7 l
  15. }
复制代码
5 M7 h6 `4 }7 ?) |( D
例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_SET,则GPIOA->BSRR=((uint32_t)0x0002U);即把二进制0000000000000010转换为32位数赋值给BSRR,对应的GPIO_Pin_1管脚置高;+ X/ @$ J4 g  m* O
5 d7 D, g6 P6 J8 C0 P3 W) D
例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_RESET,则GPIOA->BSRR=((uint32_t)0x0002U<<16);即把二进制数0000000000000010左移16位并转换为32位数赋值给BSRR,高16位对应的GPIO_Pin_1为1,对应管脚被清零,置低;
  J0 R3 u3 R( y& r9 l1 Z
5 q1 y& ^! ~+ z, _- ~/ g2 E% B, @3.锁存器5 u; Z7 G( y5 t& z. o
锁存使能(LE)输入和输出使能(OE)输入对于所有锁存器是公共的。9 r4 W+ g  X. y
- m% S$ x+ r9 E
LE为高电平时,Dn输入端的数据进入锁存器。 在这种情况下,锁存器是透明的,即每当其对应的D输入改变时,锁存器输出就改变状态;7 S8 f- q' P1 h7 s2 k* [4 f
当LE为低电平时,锁存器将存在于D输入端的信息存储在LE的高电平至低电平转换之前的建立时间;
. Y$ q2 B5 V& B+ s当OE为低电平时,8个锁存器的内容在输出端可用;6 _& u+ z8 z( u4 G( T3 k, v5 t& q: C
当OE为高电平时,输出变为高阻态关闭状态。OE输入的操作不会影响锁存器的状态。1 [/ P! ]' f0 @! ?9 n0 B* w
4.用端口输出控制函数控制LED闪烁
: h4 q0 [: B% N% i4 e
3 u/ u0 B4 y" T* q  W
  1.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET);                //端口输出控制函数,PC8端口输出高电平,使LD1熄灭. t1 O  g8 L  y: ]' I  |$ j3 F
  2.         HAL_Delay(300);
    , G  \' d1 C& e6 s9 G2 ]
  3.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);        
    & b: e0 O( D  Y9 B
  4.         HAL_Delay(300);
复制代码

( }: {( x2 O: T4 u" ]5.用端口输出翻转函数控制LED闪烁8 h6 b- U) ]5 `7 l. p  U" v6 c+ J% K
  1.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_8);    //端口输出翻转函数
    6 E6 b0 H+ Y, b
  2.         HAL_Delay(300);
复制代码
- F3 u) W: }/ Y, j+ {& ~+ Y2 R1 d1 E
6.使用锁存器
  1.         HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);                  //锁存器输出高电平
    3 g$ E" R- {$ d; O1 C
  2.         HAL_GPIO_TogglePin(GPIOC,LD1_Pin);                   //端口输出翻转函数
    " {/ x$ F* x1 c
  3.     HAL_Delay(300);0 O( G' L# U' M2 {" H$ A" K1 {, c- Y# i
  4.         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);                //锁存器输出低电平
复制代码

+ @$ n& n3 v4 M" _/ t  S& Q7.LED跑马灯
% F/ m* O3 J  F- G$ I9 T* `
* U7 `# ?/ @: q( u! j
  1. #define DELAY_TIME        100" o' t( s( i8 v* V% c% A! X2 K
  2. void LED_test(void)# Y/ J( d+ D' A, b* D
  3. {
    ( f2 D; R, K+ V) k' a5 S) L' e. i
  4.            HAL_GPIO_TogglePin(GPIOC, LD1_Pin);
    9 H" p$ D- R0 c- k" W1 C* l
  5.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);# X" K- E0 w. y% b
  6.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    # m; q# F/ W5 x9 k0 b
  7.                 HAL_Delay(DELAY_TIME);) p' T$ ~, X3 A/ f6 Z0 S- f# G
  8.                 + D6 R$ ^6 J) e/ A, q
  9.                 HAL_GPIO_TogglePin(GPIOC, LD2_Pin);4 C7 D- i: t5 {* j1 [9 W0 z4 z
  10.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    6 J: S/ q: f+ j. X
  11.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    + `9 r8 P9 d/ M5 W3 e& i
  12.                 HAL_Delay(DELAY_TIME);
      l1 B( J0 @+ x9 k1 k; ~, W
  13.                
    4 B# a) p) Z% v
  14.                 HAL_GPIO_TogglePin(GPIOC, LD3_Pin);
    * e! I8 Y$ {+ c. ?9 C+ T
  15.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    / e/ \% u6 M' w1 d
  16.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    6 y" i% D4 l& M. q
  17.                 HAL_Delay(DELAY_TIME);
    $ x: B7 d( P2 U. _; ?
  18.                
    $ T9 W0 b/ l/ B% Z4 d
  19.                 HAL_GPIO_TogglePin(GPIOC, LD4_Pin);- P' k# Q! A4 F, h4 M8 f7 i
  20.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);7 R& G$ K; R! P: ~% T) ?5 d$ g% o
  21.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    3 j" j5 d5 u. o1 ^
  22.                 HAL_Delay(DELAY_TIME);. S) h! Y5 ?* N3 ~, q! X
  23.                
    , t" r9 L/ T+ Q; L' y
  24.                 HAL_GPIO_TogglePin(GPIOC, LD5_Pin);" f% ?. V+ p6 [- q; M# V$ P9 S
  25.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);1 }3 t7 i# m' Q
  26.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);$ p, V* A) ^  c
  27.                 HAL_Delay(DELAY_TIME);% \! e1 L* g' B# g% P# n  u
  28.                 + E9 E& C$ C2 O
  29.                 HAL_GPIO_TogglePin(GPIOC, LD6_Pin);3 T7 P2 u& ?7 x! z% d0 n' o2 h
  30.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    3 r6 r1 t+ m9 N3 i
  31.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);7 C+ h2 K& G# Z3 S4 x
  32.                 HAL_Delay(DELAY_TIME);& I6 S5 J: K8 p6 M
  33.                
    * r* W" L0 e9 x# N0 ]/ r: v
  34.                 HAL_GPIO_TogglePin(GPIOC, LD7_Pin);" d7 C) o9 y# V; X; |1 S
  35.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);9 S2 D! K& h! R+ U+ n7 e
  36.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);( B6 j8 O& a& ^3 |- s
  37.                 HAL_Delay(DELAY_TIME);4 t- |  `6 g4 w/ @9 W. ?
  38.                 ( r. b6 j% Q+ t# L
  39.                 HAL_GPIO_TogglePin(GPIOC, LD8_Pin);; A4 S9 W- K$ u9 O/ \' j
  40.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    # X7 _' i9 ~  S7 ?: s2 G- Z: B. h
  41.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);. z, y: U% {' b6 {" p# S' s- l
  42.                 HAL_Delay(DELAY_TIME);        
    8 A+ @$ @( \3 S3 V: F
  43. }
    ! Y. `, O3 }0 S6 O4 |

  44. 5 {" Z' |, d2 C% |1 k0 s
复制代码
' S& p! w" r  ?( d. W

, e9 \( q" v# b
收藏 评论0 发布时间:2021-12-8 22:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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