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

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

[复制链接]
STMCU小助手 发布时间:2021-12-8 22:00
1.使用keil5的注意事项
& O! |) e. D" A9 {. b% k  S. U用STM32Cube生成程序驱动后 将程序写到以下范围内,以程序保证用STM32Cube重新生成工程后不被删除 。
& ^5 Y, B4 O, n$ D
  1. /* USER CODE BEGIN 1 */     //代码开始5 g$ l  z6 J( X

  2. + p5 i$ e8 K8 L# y* f2 I
  3. /* USER CODE END 1 */                //代码结束
复制代码
+ m( q+ ^1 o/ g- Q' B
2.HAL库延时函数
& o' s# j8 w% }; A# R; S1、HAL库自带延时函数(毫秒,阻塞)
" Y7 ]2 Y- @/ T( u& z! J
  1. HAL_Delay(x);
    . z& Y# Z  B# z9 }4 J, ]. ]2 K: m
  2. 实际延时时间为(x+1)ms
复制代码
- F4 q/ b7 M4 l* P! o, V9 a
HAL库函数为了防止无意义延时(即0ms延时)的产生,在HAL_Delay函数传入参数之后会对参数加1。 如果使用HAL库默认延时函数进行延时,实际延时时间将会比预期时间多1ms。换句话说,HAL_Delay函数至少会产生1ms的延时。
4 r! B: ]! f4 h# L) ?; {/ Z$ m- a6 h& {( l
) n$ r8 I" k5 C: a2、重新定义延时函数,非阻塞式延时
/ o, l. h" t0 [8 ^/ [# k( |
  1. void Delay_us(int16_t nus)
    ) |0 d! q( A7 n# Z" w% v- j
  2. {) T( P, a7 t5 d
  3.   int32_t temp; % |* h/ A: f' u- P6 r& p9 Z1 V
  4.   SysTick->LOAD = nus*9; //72MHz; E+ S3 f  r4 P  G7 Z. j
  5.   SysTick->VAL=0X00;4 D4 b5 u/ P6 R+ E7 ?' L! @& ?( Z2 O
  6.   SysTick->CTRL=0X01;6 w8 q4 R: j- q9 |, s
  7.   do + J( w$ W5 W: Y: X% y/ u
  8.   { $ m5 D( E) h0 I4 f) V; d; K, ^( e. B
  9.     temp=SysTick->CTRL;
    * P% e0 e7 Y  f4 T! Z. k0 B
  10.   }# T4 U: c" R- y0 M
  11.   while((temp&0x01)&&(!(temp&(1<<16))));5 o7 X' B3 `4 `+ m* P
  12. 9 o2 }, v8 i9 M. @; J7 i
  13.   SysTick->CTRL=0x00; 9 V1 X& T" p6 u2 l: K% [0 E
  14.   SysTick->VAL =0X00; 5 M9 _4 y& o: {& Y& r" E2 _
  15. }, y$ l0 S' o1 _' A# g2 S% `/ I/ Q6 j
复制代码

& L9 p, K# B( v* Z3.HAL库配置GPIO- @: g1 Z& d6 `+ b% s0 y/ {5 z
  1. void              HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init);
    # }9 j$ D( x# x6 V% [
  2. void              HAL_GPIO_DeInit(GPIO_TypeDef  *GPIOx, uint32_t GPIO_Pin);  O' g  y/ J, R  I6 k! p2 v* D
  3. GPIO_PinState     HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);  //端口输入读取函数; k* f% A4 t) e4 u/ E7 _
  4. void              HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); //端口输出控制函数
    + n+ q% J& x& z8 c+ d& s
  5. void              HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);  //端口输出翻转函数 0 P3 m0 w/ r: E% ]; a
  6. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
    . g$ N1 e3 |" r7 _; V
  7. void              HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);9 m, V7 j4 a7 ]( J4 p
  8. void              HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
复制代码

3 k. C# \" c- \' S- ^0 `解释:
  d, A5 |# M" M2 F% c  s9 V; q+ Y( h
HAL_GPIO_Init
: N# \1 v5 D0 l! s' s初始化我们需要用到的引脚的工作模式,包括具体引脚的工作速度、是否复用模式、上下拉等等参数。
$ |7 k( t! K$ c. C# g/ @
  1. void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
复制代码

2 Q% x0 i8 |' T$ k) `9 uHAL_GPIO_DeInit" C! U; F0 i3 M% Z3 S  p4 N6 [
将初始化之后的引脚恢复成默认的状态–各个寄存器复位时的值, S. b) o0 p+ j$ m: i  u+ M: ~! ~
  1. void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)
    6 b/ Z: i% ?5 [7 s; R
  2. 例:HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);
复制代码
3 w5 k. r1 P4 C0 A8 a9 n7 h8 H5 B6 y
HAL_GPIO_ReadPin
3 G) s$ p) k, l# R7 {. F* V读取我们想要知道的引脚的电平状态、函数返回值为0或1。9 h3 \9 S- d7 K' m
  1. GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)' E  T8 ?! ]7 E* }
  2. 例:pin_State = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_9);
复制代码

  F% Q6 i  ^8 Q  [' ?HAL_GPIO_WritePin
7 b% b- J0 l0 }+ ]2 \- D给某个引脚写0或1,但是不要理解成,写1就是使能之类的意思,有些寄存器写1是擦除的意思/ I7 _) \3 f0 r0 l4 s, w; w
  1. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)7 A; [! f9 V( K1 S  t
  2. 例:HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9,GPIO_PIN_RESET)
复制代码

! C0 x- s: r: {0 ]( KHAL_GPIO_TogglePin: I& M/ ?* F; i. X: o
翻转某个引脚的电平状态- r- F( A# X4 v7 l
  1. void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
    - g, B# T5 u% j/ q' m+ b" V
  2. 例:HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9);
复制代码
: D9 \+ e+ U0 I( j
HAL_GPIO_LockPin0 C3 e2 ]; t4 X- c, f  K
如果一个管脚的当前状态是1,读管脚值使用锁定,当这个管脚电平变化时保持锁定时的值,直到重置才改变+ V0 ?- e! z, ^+ J* y
  1. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
    . |- e" T, m4 F& A
  2. 例:
    , i2 _. @4 h: K) e/ n4 u
  3. HAL_StatusTypeDef hal_State;
    ! D- o/ p8 T# o$ J' N
  4. hal_State = HAL_GPIO_LockPin(GPIOF, GPIO_PIN_9);
    6 l1 q9 L8 `3 K( [

  5. 2 G; t( c! A1 u9 `
复制代码

( y; o5 W. ?+ u4 ]& tHAL_GPIO_EXTI_IRQHandler
) C( @- l9 [' o7 F% a  [这个函数是外部中断服务函数,用来响应外部中断的触发,函数实体里面有两个功能,1是清除中断标记位,2是调用下面要介绍的回调函数。实际调用的是下边的中断回调函数
9 x$ |0 ]6 ^* \
  1. void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
    0 m( U/ K2 r# u1 y
  2. 例:HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
复制代码
7 z& j5 l/ e4 E; T3 |; |4 K
HAL_GPIO_EXTI_Callback
/ l1 I* k. a7 ]3 o中断回调函数,可以理解为中断函数具体要响应的动作。
8 N7 e4 `; J; G6 q# I8 d9 H2 A
  1. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    * E' J- S% j2 K' L  ?) B6 T" h  n
  2. 例:HAL_GPIO_EXTI_Callback(GPIO_Pin);
复制代码
& q* s3 g5 c4 g" Q2 R
1 u+ F4 o0 H/ ^1 t. W
4.LED工程
* g2 b% ?8 F9 @0 ~1.LED电路原理图
5 c( P+ q3 C7 n. e' s
" I' A  N% D( u+ u  Y$ N# R
20210424110119129.png
7 {& M8 ~  W) M" K" s* `7 Y
' ^9 z/ [% T: _
2.GPIO_PIN_SET与GPIO_PIN_RESET  w/ o2 |" `& ]: a/ n) j" W+ X
2 a0 F0 j' `( n. i4 J
  1. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)3 z+ ?7 O" X6 S7 [
  2. {
    ! v9 J- n' @! z4 l" z9 k+ R
  3.   /* Check the parameters */& ]+ M# w. `( {: U+ Q5 ?
  4.   assert_param(IS_GPIO_PIN(GPIO_Pin));+ e  X3 d, R$ q- ^) p
  5.   assert_param(IS_GPIO_PIN_ACTION(PinState));' @! @! O0 v' \" T/ C% x
  6. 0 f& ~9 J$ _$ U5 k$ U
  7.   if (PinState != GPIO_PIN_RESET)
    7 \- t: G7 F( [, Y
  8.   {5 z% c2 I3 E+ Q
  9.     GPIOx->BSRR = (uint32_t)GPIO_Pin;//如果是GPIO_PIN_SET,则将GPIO的BSRR寄存器低16位置为GPIO_Pin0 v; ?9 ]5 W" J) L' Q/ J9 L
  10.   }! B' U4 M) U+ g+ w, }" {
  11.   else
    4 n- T' Y) j8 f1 V0 n$ \: N+ }
  12.   {7 n, C4 l8 C  V: b! P& R3 ]- @
  13.     GPIOx->BSRR = (uint32_t)GPIO_Pin << 16 ;//如果是GPIO_PIN_RESET,则将GPIO的BSRR寄存器的高16位置为GPIO_Pin. s0 H. ~3 ^$ M! f- j
  14.   }2 q0 x) g8 x  t" g
  15. }
复制代码
) o" s1 t3 e5 U/ l7 ]; X/ @: s
例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_SET,则GPIOA->BSRR=((uint32_t)0x0002U);即把二进制0000000000000010转换为32位数赋值给BSRR,对应的GPIO_Pin_1管脚置高;# r3 _! l2 m+ g& k+ l9 s

4 e" c* L9 B: m  i! [8 b$ W例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_RESET,则GPIOA->BSRR=((uint32_t)0x0002U<<16);即把二进制数0000000000000010左移16位并转换为32位数赋值给BSRR,高16位对应的GPIO_Pin_1为1,对应管脚被清零,置低;0 l% X  m% ~$ P' Y: |- ~3 ]
+ u5 t8 X" E: L& x  Z) A* l
3.锁存器
2 Z# p) w* E. D锁存使能(LE)输入和输出使能(OE)输入对于所有锁存器是公共的。) _( m8 H7 D) A9 U8 a# ~2 a7 a5 d% O
/ U- h9 o2 J4 ]0 c6 ]
LE为高电平时,Dn输入端的数据进入锁存器。 在这种情况下,锁存器是透明的,即每当其对应的D输入改变时,锁存器输出就改变状态;
# D: j0 V' k; G# z当LE为低电平时,锁存器将存在于D输入端的信息存储在LE的高电平至低电平转换之前的建立时间;
( \! A* p- w( k当OE为低电平时,8个锁存器的内容在输出端可用;
! j1 ^0 S- L6 d( M3 i- f当OE为高电平时,输出变为高阻态关闭状态。OE输入的操作不会影响锁存器的状态。
7 D5 B: r0 q8 M% P0 {: W. c( V0 E4.用端口输出控制函数控制LED闪烁
: x5 I+ |* j+ j1 [; a, L+ Z3 i; T4 n" A
  1.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET);                //端口输出控制函数,PC8端口输出高电平,使LD1熄灭/ \' k4 I, r4 Z0 n/ E/ y1 I
  2.         HAL_Delay(300);
    9 |8 G9 N  D' X  m- i# v
  3.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);        3 |+ h1 r) b9 V  e0 J+ u/ n
  4.         HAL_Delay(300);
复制代码
$ E: M" Q1 W' [2 ?
5.用端口输出翻转函数控制LED闪烁
# F; ~) `' U  a" s, h! n
  1.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_8);    //端口输出翻转函数
    1 e- ~  A5 ^* Y7 U
  2.         HAL_Delay(300);
复制代码
8 \' t* ]" R) i3 w& Y
6.使用锁存器
  1.         HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);                  //锁存器输出高电平0 x! z( p7 U! s; _( Y
  2.         HAL_GPIO_TogglePin(GPIOC,LD1_Pin);                   //端口输出翻转函数 , Z) f. `5 t( A- p) k5 @
  3.     HAL_Delay(300);
    9 N% }) O( S: e8 J
  4.         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);                //锁存器输出低电平
复制代码
1 F$ }! G: V# N6 N/ b% _" w% Y* _* t
7.LED跑马灯
( Q4 {& v( Q% L$ `$ d. K6 a2 G
3 J/ \7 H; L6 m0 B9 a7 |/ B
  1. #define DELAY_TIME        100
    5 x" i6 c# J2 v  T2 M% I, |" U
  2. void LED_test(void)
    * K! X8 _5 j( Y
  3. {( l$ B* z+ x0 }8 v5 _6 D
  4.            HAL_GPIO_TogglePin(GPIOC, LD1_Pin);
    4 R7 g- j& t$ p3 V' e
  5.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);8 [# {3 V! O, `0 V
  6.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);  R$ n6 L2 J: `+ j8 t# `
  7.                 HAL_Delay(DELAY_TIME);
    - f8 p2 `& h7 S+ r. |! M2 f
  8.                
    # q. C+ ~1 s; k5 j# q, y$ v
  9.                 HAL_GPIO_TogglePin(GPIOC, LD2_Pin);) t4 I; g7 n  s1 v1 H
  10.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    1 c4 n4 i9 Z' S! c% }6 q
  11.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    & G' S- e0 Y8 W5 b5 b+ Z1 z: X
  12.                 HAL_Delay(DELAY_TIME);. Z7 }9 d8 X4 p* c
  13.                
    * K0 D  i- \2 S0 S# X2 w$ g& w1 M: @$ R
  14.                 HAL_GPIO_TogglePin(GPIOC, LD3_Pin);( A3 I: a; Y- H! O: W5 |; `
  15.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    * S& l) R  ^! M$ a1 N, J; m' D( \
  16.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);! \9 v& x0 L9 K# l
  17.                 HAL_Delay(DELAY_TIME);
    1 w) N1 [5 e0 |/ u
  18.                 0 L5 P  Q# a1 c6 w# G
  19.                 HAL_GPIO_TogglePin(GPIOC, LD4_Pin);
    . x4 ~* T: D. @
  20.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);0 Z# q4 K2 d. J6 G! z
  21.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    3 i* `* `- u! X( ^) l8 [* P
  22.                 HAL_Delay(DELAY_TIME);- {# }9 L$ i3 G5 ~* I& V0 |* z; F
  23.                
    ( Z; l# S7 `5 v2 K/ Q: O
  24.                 HAL_GPIO_TogglePin(GPIOC, LD5_Pin);
      ]! i% ?0 p, J2 a
  25.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    1 }8 ?+ q8 i+ p, }+ d6 ~! p, M
  26.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    , Y. h" ]! y" r1 j- r
  27.                 HAL_Delay(DELAY_TIME);' ?7 W9 v! @1 i" o/ q
  28.                 0 U  d1 P+ H2 q$ W% V) U
  29.                 HAL_GPIO_TogglePin(GPIOC, LD6_Pin);
    1 s6 l# h% n% t+ h2 _
  30.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);+ N" S3 N9 q9 ?6 T
  31.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    # Q& ~; R' Y8 _! f
  32.                 HAL_Delay(DELAY_TIME);' [5 }! K7 y: E
  33.                
    * V2 {  A6 V# S
  34.                 HAL_GPIO_TogglePin(GPIOC, LD7_Pin);1 c" u2 E4 K3 C% L7 N
  35.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);2 c1 H: m+ x# p# l/ F
  36.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    % q* i6 E+ W% X
  37.                 HAL_Delay(DELAY_TIME);+ e. ^4 M0 {- i2 P
  38.                 4 r+ P0 [! {7 o
  39.                 HAL_GPIO_TogglePin(GPIOC, LD8_Pin);7 t: \$ ?7 n0 N) k
  40.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    * d% R9 A. r6 a6 b: c9 O
  41.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);" `; b( N  o& ]2 S* a9 n
  42.                 HAL_Delay(DELAY_TIME);        
    6 c8 G; K0 W+ R' g5 f/ c
  43. }6 l: Z2 ?3 O$ v& q$ e- l
  44. ) f" S6 C" K" K
复制代码

) v( S& M6 H1 g) ~7 A. F6 e: f. e& m$ Q7 R% m
赞 收藏 评论0 发布时间:2021-12-8 22:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版