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

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

[复制链接]
STMCU小助手 发布时间:2021-12-8 22:00
1.使用keil5的注意事项
2 d& r" t9 M" y/ n8 s( V! Q用STM32Cube生成程序驱动后 将程序写到以下范围内,以程序保证用STM32Cube重新生成工程后不被删除 。
6 H7 [. i  s$ Y& k
  1. /* USER CODE BEGIN 1 */     //代码开始
    5 b, H  f' [+ w9 g4 x8 f( p
  2. $ L0 D6 V" I# g8 e3 T( }
  3. /* USER CODE END 1 */                //代码结束
复制代码
2 K. G( [5 m9 q: ]! o
2.HAL库延时函数
' y4 e! l3 l3 j# x1、HAL库自带延时函数(毫秒,阻塞)
) Z5 R: H+ B# I7 D
  1. HAL_Delay(x);  z: W% S1 T0 ?' ]
  2. 实际延时时间为(x+1)ms
复制代码

( h  O" X8 B! C) T8 R9 z7 W( h& aHAL库函数为了防止无意义延时(即0ms延时)的产生,在HAL_Delay函数传入参数之后会对参数加1。 如果使用HAL库默认延时函数进行延时,实际延时时间将会比预期时间多1ms。换句话说,HAL_Delay函数至少会产生1ms的延时。
* P5 t; n% W. g+ t9 Z! @9 h* X) C: }1 F" [
2、重新定义延时函数,非阻塞式延时
7 k" G% F2 e6 G# @8 j
  1. void Delay_us(int16_t nus)
    2 Z& P  \; q' v0 g+ w' g! F
  2. {
    5 s2 \1 x+ G  Y2 j
  3.   int32_t temp; ' T. @$ m& b% T0 V3 J5 Y
  4.   SysTick->LOAD = nus*9; //72MHz
    $ R7 w& F" N( }
  5.   SysTick->VAL=0X00;
    ' F3 x4 w* N) A2 }
  6.   SysTick->CTRL=0X01;
    * M" k7 q+ F! @. Z
  7.   do
    ) f( w2 U/ n9 ]. m8 ?! O7 p
  8.   {
    . T1 s- j. G- }/ u* ]+ `7 F0 G
  9.     temp=SysTick->CTRL;
    % {' n) {; J- `; O: r4 `5 A. I: B
  10.   }, H& j- w$ @" H% I: V0 p6 f, W5 M
  11.   while((temp&0x01)&&(!(temp&(1<<16))));1 y7 r9 y! S" q5 }  n! B7 M1 S
  12. ! W$ M4 r8 H1 B! d, o: G0 D
  13.   SysTick->CTRL=0x00;
    5 f% Y3 n6 I; b; I) X
  14.   SysTick->VAL =0X00;
    8 P* _/ I! K* U* k% h
  15. }
    $ Z/ T6 C# e* X( _) ^
复制代码

8 q- |6 N3 o/ n2 k3.HAL库配置GPIO
8 q5 v% K3 @6 A+ c7 q$ C' v5 l
  1. void              HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init);) P) ], K) k" |5 t
  2. void              HAL_GPIO_DeInit(GPIO_TypeDef  *GPIOx, uint32_t GPIO_Pin);8 k9 P1 y- W! N9 _
  3. GPIO_PinState     HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);  //端口输入读取函数
    9 Y1 @# R$ _; m* e
  4. void              HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); //端口输出控制函数" g0 |, g& v/ r7 O, y  H
  5. void              HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);  //端口输出翻转函数
    5 O4 m/ K4 s; q! w& x) t
  6. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);. z0 d% f$ ^2 z" T3 j3 k
  7. void              HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);* h; L( |4 W2 L" {) r( y. R8 m1 p
  8. void              HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
复制代码
1 d8 {) K$ x; k% r. C
解释:5 `/ l( ^3 N. p5 x; M# e8 Q5 A2 w/ T
6 S- f* S$ w. c, V, r/ K- c' a. w
HAL_GPIO_Init
+ i: K  w6 @8 @  P9 a1 ^初始化我们需要用到的引脚的工作模式,包括具体引脚的工作速度、是否复用模式、上下拉等等参数。: W  C0 }7 a8 m  Q' l" T
  1. void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
复制代码

+ z/ ^. `# Y2 l' S) M+ lHAL_GPIO_DeInit2 G  w8 U1 W4 ~& c" ^) t
将初始化之后的引脚恢复成默认的状态–各个寄存器复位时的值* J4 v8 U& n' R% F/ P# f4 c' u
  1. void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)
    . w3 C9 x3 r$ o% K: W# P  N  B' U
  2. 例:HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);
复制代码
5 Z9 O& D& `  o, w- p' F5 L* q  [
HAL_GPIO_ReadPin; A/ P. l( J6 n% J
读取我们想要知道的引脚的电平状态、函数返回值为0或1。
. Z7 J. ]( Q7 v, A2 y
  1. GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
    " J/ M5 S( A$ z: w) b! c
  2. 例:pin_State = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_9);
复制代码

; O& ^7 q/ U, u! mHAL_GPIO_WritePin1 b. {6 w2 x  V
给某个引脚写0或1,但是不要理解成,写1就是使能之类的意思,有些寄存器写1是擦除的意思# n8 x8 f( z/ L! s" h6 S  J
  1. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)7 S8 b) }0 D+ q, M: b/ Z0 F* Y5 m
  2. 例:HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9,GPIO_PIN_RESET)
复制代码
: q. ?3 |* Q- }# C7 T% T2 q5 V
HAL_GPIO_TogglePin
5 h8 r2 N4 S! M; Z, A7 f翻转某个引脚的电平状态
7 ~* n. o3 X) ]$ l  B* ]. a- W$ C' o; i
  1. void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
    $ r( S$ u! R1 A, y
  2. 例:HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9);
复制代码
1 W9 B! N, o1 H
HAL_GPIO_LockPin! G8 F: E" |; @2 G6 o  Z
如果一个管脚的当前状态是1,读管脚值使用锁定,当这个管脚电平变化时保持锁定时的值,直到重置才改变
7 V0 d# J3 `* k. G& ]3 p4 I
  1. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)$ x. e( f. T8 X3 [) u4 O  F
  2. 例:, \7 H% ?8 I% j! i  y% R# O
  3. HAL_StatusTypeDef hal_State;
    ' w5 S7 x- F- X' L2 F
  4. hal_State = HAL_GPIO_LockPin(GPIOF, GPIO_PIN_9);
    5 `" [( Y. |0 X( O+ e& ^

  5. ! p- G3 F/ }7 w2 b1 o- i
复制代码
7 z3 a0 X+ ~) n" w3 |# {1 r
HAL_GPIO_EXTI_IRQHandler
5 d) g/ a3 y$ O' m, e这个函数是外部中断服务函数,用来响应外部中断的触发,函数实体里面有两个功能,1是清除中断标记位,2是调用下面要介绍的回调函数。实际调用的是下边的中断回调函数
/ T" v9 A& `* s& U
  1. void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
    ) A( P+ s4 q# b, T+ T8 {
  2. 例:HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
复制代码

$ U3 X) Q. B1 y  l3 U8 \HAL_GPIO_EXTI_Callback
  l6 Z/ t5 y1 o$ Q% K6 ~0 D中断回调函数,可以理解为中断函数具体要响应的动作。
. M3 C& ^2 B! Q2 D# \9 }4 c
  1. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    3 g2 B; Z( y& [5 N  H, |
  2. 例:HAL_GPIO_EXTI_Callback(GPIO_Pin);
复制代码
5 E# x" Q# S% I( T5 R9 [" u

, [2 \7 W& r( e( H" @; Y: L; V4.LED工程
. U# ^9 U4 n5 I/ R1.LED电路原理图6 m) R& q$ k1 s5 z$ T
- n9 d0 B: `4 D% S3 F; [
20210424110119129.png
2 l' s1 K: J6 w
% N3 x( u7 ~2 Z8 V$ R# Q
2.GPIO_PIN_SET与GPIO_PIN_RESET
2 q  R9 ?+ D$ z+ j/ J0 g( o. m" g6 s3 v/ k$ ?1 b1 W
  1. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)/ o9 F' n. W1 n0 y; @. X0 }, y2 B
  2. {1 q6 M# z0 f, j% X6 O
  3.   /* Check the parameters */
    * X  [4 Z2 b& q) p
  4.   assert_param(IS_GPIO_PIN(GPIO_Pin));& u: p+ U6 Y4 F0 s  z% Q
  5.   assert_param(IS_GPIO_PIN_ACTION(PinState));
    : i& V) O0 ]* d7 L* `7 F1 G
  6. 2 l* i. V, y6 R& M, r& [
  7.   if (PinState != GPIO_PIN_RESET)
    & O" M- L+ e2 s' o( m) k
  8.   {, M+ M( W8 d" E+ U. ?
  9.     GPIOx->BSRR = (uint32_t)GPIO_Pin;//如果是GPIO_PIN_SET,则将GPIO的BSRR寄存器低16位置为GPIO_Pin% M5 U& z# Q/ b% M2 s6 u* F' C
  10.   }& q5 q  e4 }; I! j3 X
  11.   else
    % [: |( O" w2 `+ p2 U0 |6 X. C/ S
  12.   {
    . j, c, Y2 _, F+ x
  13.     GPIOx->BSRR = (uint32_t)GPIO_Pin << 16 ;//如果是GPIO_PIN_RESET,则将GPIO的BSRR寄存器的高16位置为GPIO_Pin
    % {2 v# O- ~5 j4 `& l( p1 T
  14.   }" j# c* [! \* Y* t7 t4 K# s
  15. }
复制代码
. N1 Z% \  D( z' Z
例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_SET,则GPIOA->BSRR=((uint32_t)0x0002U);即把二进制0000000000000010转换为32位数赋值给BSRR,对应的GPIO_Pin_1管脚置高;* z$ S6 e! d, \9 n, ?4 H- U4 i
. G0 S5 W; B# N
例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_RESET,则GPIOA->BSRR=((uint32_t)0x0002U<<16);即把二进制数0000000000000010左移16位并转换为32位数赋值给BSRR,高16位对应的GPIO_Pin_1为1,对应管脚被清零,置低;2 |3 n6 M( T2 B, M3 ^/ t8 a& y! b  [

6 ~+ X9 Q/ D/ v+ P' ^3.锁存器- {  l5 g7 u1 u+ t6 ^  m- a5 {3 K
锁存使能(LE)输入和输出使能(OE)输入对于所有锁存器是公共的。. ^: c, \! u5 l- C7 T& h( n' Y
5 v( r7 p8 P- U* k3 N6 Z3 K. b
LE为高电平时,Dn输入端的数据进入锁存器。 在这种情况下,锁存器是透明的,即每当其对应的D输入改变时,锁存器输出就改变状态;
  L9 K: n7 ?4 v/ ~5 F( n& n当LE为低电平时,锁存器将存在于D输入端的信息存储在LE的高电平至低电平转换之前的建立时间;
" c5 S1 Q& y7 ~+ w当OE为低电平时,8个锁存器的内容在输出端可用;/ i: @9 `3 x+ |. }
当OE为高电平时,输出变为高阻态关闭状态。OE输入的操作不会影响锁存器的状态。0 T% s$ K- s3 Y) o3 v
4.用端口输出控制函数控制LED闪烁) d( J5 L! d. P: ^0 g
/ u6 z& E/ e3 R! @! }# w+ g
  1.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET);                //端口输出控制函数,PC8端口输出高电平,使LD1熄灭$ w( L0 t0 ?5 v/ o' Q! F
  2.         HAL_Delay(300);7 Z: G2 H. |+ @
  3.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);        3 ?& O0 ~3 ~1 j2 {5 b
  4.         HAL_Delay(300);
复制代码

5 S4 T- |( S6 d  _. x/ l5.用端口输出翻转函数控制LED闪烁# _! D9 t+ D, p& w, T+ z" K+ m+ c4 x) a
  1.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_8);    //端口输出翻转函数 , H: y  ]' j. T: D  r3 G
  2.         HAL_Delay(300);
复制代码
$ W. V2 a3 g+ [  P0 z+ {! j& y
6.使用锁存器
  1.         HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);                  //锁存器输出高电平
    ( K$ A" I% [6 V
  2.         HAL_GPIO_TogglePin(GPIOC,LD1_Pin);                   //端口输出翻转函数
    5 H" n+ o( A7 h- h
  3.     HAL_Delay(300);
    & a, f2 ^$ W* |2 }& @
  4.         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);                //锁存器输出低电平
复制代码
) X7 \) c6 N+ S
7.LED跑马灯, _7 I! {  M  \* d6 G4 F8 p; {
7 c( u2 q% I( W( O5 d' m' J( T
  1. #define DELAY_TIME        100
    ! \$ F7 ?0 [4 i
  2. void LED_test(void)
    3 }$ b' g0 R$ h0 k- w1 {5 Z
  3. {
      s- }( J* Z9 {  N. G! B
  4.            HAL_GPIO_TogglePin(GPIOC, LD1_Pin);1 y/ z$ S# _1 w* M$ \( N8 F  B
  5.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);: \7 L. h, x0 y' [* s" b7 ?2 d
  6.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    / o3 q0 H8 O$ }& {' a- |( @0 z
  7.                 HAL_Delay(DELAY_TIME);
    ' m4 m, c4 R1 t- [+ e" n1 N- y
  8.                 ! M% D$ g" I2 h7 G4 w  e
  9.                 HAL_GPIO_TogglePin(GPIOC, LD2_Pin);
    ; _! p. F7 Y0 T  s8 w
  10.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);2 `  W! a9 o9 f  r8 k$ o
  11.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    9 }, u5 v, Z# w1 J3 Z
  12.                 HAL_Delay(DELAY_TIME);; b+ z+ h5 i, c9 A3 Z9 r$ `% f
  13.                 & G" N; U- y: V" M6 V6 ]
  14.                 HAL_GPIO_TogglePin(GPIOC, LD3_Pin);
    - X. h8 f& m# @0 \
  15.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);. d, I; K! P/ l! o( X: h  s( Q- D, }1 P5 n
  16.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);% R' `5 G/ s4 u0 i8 |) r
  17.                 HAL_Delay(DELAY_TIME);
    7 H3 [  B' p8 ~! `: y8 H
  18.                
    , A4 K  H+ g  m) c0 ~- [/ g$ V
  19.                 HAL_GPIO_TogglePin(GPIOC, LD4_Pin);1 T. M+ o  R+ u# a! i
  20.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);! d: S1 J+ I. P3 _2 p& C; @
  21.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);' ^8 Z# ^& {( {1 I
  22.                 HAL_Delay(DELAY_TIME);: n0 O5 C( N. p- n$ F+ V* d
  23.                 $ r" @- d/ i  S& s$ o# ^# K
  24.                 HAL_GPIO_TogglePin(GPIOC, LD5_Pin);
    5 z$ r& v) y) A: b
  25.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);7 S8 H) G# d6 }$ P! Q
  26.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);4 L) {" S& q$ o$ u$ V7 a, e1 Q
  27.                 HAL_Delay(DELAY_TIME);, _6 e- w, A: M* y/ e
  28.                
    6 W& n2 C- z  b+ l) y" }
  29.                 HAL_GPIO_TogglePin(GPIOC, LD6_Pin);
    ' L/ |0 |1 d0 x
  30.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);, [$ N6 s5 B! v/ q- O4 ]
  31.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);0 Y0 B' J9 Q, N; Y6 L- n" \
  32.                 HAL_Delay(DELAY_TIME);- d4 |5 |/ T% V( J, L! x: |
  33.                
    2 q! b/ z- Z6 D- M  K
  34.                 HAL_GPIO_TogglePin(GPIOC, LD7_Pin);! O3 _7 Y2 _- P% @- i) A! m) S; {
  35.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);. y$ T$ G5 p. p* I/ Y9 [9 S* Q
  36.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);0 y% ]6 n7 A6 r
  37.                 HAL_Delay(DELAY_TIME);
    5 ]8 D, @/ _' K) B( ^
  38.                 # d5 k3 ]6 ?3 C2 l; D3 Z
  39.                 HAL_GPIO_TogglePin(GPIOC, LD8_Pin);
    7 R  D, ~% e1 I+ w" q6 J2 [/ r
  40.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    9 n5 v$ n5 a/ c) |5 F/ p5 e8 K# @9 N
  41.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);, G* Y- Y2 o+ J* A, k
  42.                 HAL_Delay(DELAY_TIME);        
    ( q1 _  K, P! c- J' ^3 p
  43. }
    ( n3 k6 L( p, ?4 i9 V; t; m
  44. + J) W& h2 q2 j0 e4 N3 e- S5 S
复制代码
. E& I  A7 s6 b/ b6 [  ?
+ S0 |6 H. _" K7 X" b
收藏 评论0 发布时间:2021-12-8 22:00

举报

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