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

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

[复制链接]
STMCU小助手 发布时间:2021-12-8 22:00
1.使用keil5的注意事项
" s. Z7 Y$ c7 ^& u/ v7 E6 j& {, J用STM32Cube生成程序驱动后 将程序写到以下范围内,以程序保证用STM32Cube重新生成工程后不被删除 。- R. C+ L& g  {9 u8 Z- \
  1. /* USER CODE BEGIN 1 */     //代码开始
    ; _  x6 o- s" P& T3 H

  2. # @1 ~" o! M  ]; V& c/ B0 q# H
  3. /* USER CODE END 1 */                //代码结束
复制代码

, g1 `7 x" D! A! h, F2.HAL库延时函数
" n& D( w4 o. i' z4 U1、HAL库自带延时函数(毫秒,阻塞)! }9 k% |; G$ C0 x
  1. HAL_Delay(x);8 t- h" @% S4 a* R; d8 ?. O; L& Z: x
  2. 实际延时时间为(x+1)ms
复制代码

$ J4 F1 }! |  G- D+ `" kHAL库函数为了防止无意义延时(即0ms延时)的产生,在HAL_Delay函数传入参数之后会对参数加1。 如果使用HAL库默认延时函数进行延时,实际延时时间将会比预期时间多1ms。换句话说,HAL_Delay函数至少会产生1ms的延时。
0 ]" }. C8 x" Z0 w, a1 s) y, P4 V
) d# P+ N1 }' o) K3 F8 o2、重新定义延时函数,非阻塞式延时% y. s: P" c" z
  1. void Delay_us(int16_t nus) 8 U: |  v3 F1 W9 J3 z" d
  2. {
    8 E3 T% s1 J$ z' K# f! s
  3.   int32_t temp;
    5 ^( q+ b! {3 W. D3 z, D
  4.   SysTick->LOAD = nus*9; //72MHz
    & G! H" a7 [: A4 f! O5 N- e. z) K
  5.   SysTick->VAL=0X00;
    ' o0 _. Q3 N% o/ B2 j8 j
  6.   SysTick->CTRL=0X01;
    % t8 u* X6 D0 T; M* K* `
  7.   do ' }0 P% L6 {, a' y3 _3 y! z5 _
  8.   {
    3 T. s) F6 H8 D. x7 p3 ~
  9.     temp=SysTick->CTRL;1 [$ d9 B; x& a
  10.   }
    5 Z1 n4 e: b+ W6 o& G, z/ z
  11.   while((temp&0x01)&&(!(temp&(1<<16))));( Y- m* t. w* X; y8 M9 Y/ R) B  U# S
  12. # i7 ?* C9 Q" }# c$ w0 Y
  13.   SysTick->CTRL=0x00; " |$ E: H5 f% u
  14.   SysTick->VAL =0X00;
    - s5 m/ t# b+ G% U
  15. }) N9 X; I5 b- y4 i, d$ X
复制代码
9 S& B/ O3 d- T! I, h
3.HAL库配置GPIO9 i! ^4 g# Q. ?  ~% C6 ~3 E0 q6 r; b
  1. void              HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init);0 }; B! f* u' j0 M" H3 A
  2. void              HAL_GPIO_DeInit(GPIO_TypeDef  *GPIOx, uint32_t GPIO_Pin);9 M5 L+ h$ `6 O" k6 N5 Z
  3. GPIO_PinState     HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);  //端口输入读取函数
    9 x7 y; c2 P, k/ Z. U6 `9 J" g  C
  4. void              HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); //端口输出控制函数
    . b; G2 D1 o5 }  f: i
  5. void              HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);  //端口输出翻转函数 - q$ k0 K! @/ F/ k5 H' z: M7 n
  6. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
    9 ]% P5 [7 p/ j5 i5 D8 W: x& x
  7. void              HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);0 d2 B$ Y+ l; C$ L
  8. void              HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
复制代码

: |4 N4 ^4 m& Y/ T解释:8 P+ c" R' }1 J, C% S

; M7 O; y+ ?/ E8 G+ uHAL_GPIO_Init6 b5 [3 U  A; g" q7 H# n8 y
初始化我们需要用到的引脚的工作模式,包括具体引脚的工作速度、是否复用模式、上下拉等等参数。1 |* P. j8 j: \0 e1 O' H; i( [
  1. void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
复制代码
" F# L. D" P% }/ H% t# o# J- f
HAL_GPIO_DeInit
' C% K3 q6 k1 @2 v0 d% w7 J4 T将初始化之后的引脚恢复成默认的状态–各个寄存器复位时的值$ i/ t% P& D3 O. d+ H" H5 R" M
  1. void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)/ D! C  u8 q' P4 V4 O8 d
  2. 例:HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);
复制代码
8 {; G6 F- J* g6 B4 g
HAL_GPIO_ReadPin
1 g! B' @! x/ o  [读取我们想要知道的引脚的电平状态、函数返回值为0或1。9 Q5 \! ~8 d7 s' t4 R8 l
  1. GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)4 ?! `  Y, b+ v3 ^& I3 [7 L
  2. 例:pin_State = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_9);
复制代码

# P" q5 `8 s) qHAL_GPIO_WritePin. h/ H7 a/ n0 _/ D
给某个引脚写0或1,但是不要理解成,写1就是使能之类的意思,有些寄存器写1是擦除的意思
$ F3 g% A& g: a) i2 p
  1. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)- I. n- i5 S1 t7 U8 i8 [8 c! q2 ]' w
  2. 例:HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9,GPIO_PIN_RESET)
复制代码
; \% a+ y5 Y5 r+ \$ t7 U
HAL_GPIO_TogglePin$ }! l& Y+ V" I; x! H5 l- Z7 V
翻转某个引脚的电平状态( Y2 c/ Y5 e+ r+ `  c( {2 q
  1. void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin), K, g0 G3 M' d8 r+ v" A' w
  2. 例:HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9);
复制代码
8 ?: c+ y' x) u
HAL_GPIO_LockPin
, S0 W  |* b5 E8 [7 T3 u如果一个管脚的当前状态是1,读管脚值使用锁定,当这个管脚电平变化时保持锁定时的值,直到重置才改变. R! K3 B7 l# m9 Z& y
  1. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
    0 w3 M4 [2 B9 P5 n( ?
  2. 例:
    0 X0 R5 q7 b, d3 e( w
  3. HAL_StatusTypeDef hal_State;
    ' [% \3 `/ T( q' l
  4. hal_State = HAL_GPIO_LockPin(GPIOF, GPIO_PIN_9);1 {! o: H3 t9 `9 t1 p! U

  5. - r7 M- X' S0 c+ {
复制代码

! O9 ~4 @3 z( d# m% }HAL_GPIO_EXTI_IRQHandler
  r  e5 u5 J0 ^& u5 w- J这个函数是外部中断服务函数,用来响应外部中断的触发,函数实体里面有两个功能,1是清除中断标记位,2是调用下面要介绍的回调函数。实际调用的是下边的中断回调函数
+ f( K4 D$ ]; i6 W3 B0 d$ `
  1. void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
    / P5 n' A7 B7 Q. I  X8 O8 `
  2. 例:HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
复制代码

: \) h: ]7 q/ vHAL_GPIO_EXTI_Callback
, U& d* C) e) f, l; _& H5 \3 C8 ]  p中断回调函数,可以理解为中断函数具体要响应的动作。7 Z9 Q$ R4 t1 z
  1. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)0 ~, N: b2 X, I( i5 }- Y! u
  2. 例:HAL_GPIO_EXTI_Callback(GPIO_Pin);
复制代码

! C& h0 U0 o, c& f: ?% O
1 Q$ Y& }" m& O$ z3 |8 o) W4.LED工程
0 u" v* w; j7 W0 D1.LED电路原理图
5 P7 m/ Q' W3 p5 z
8 X! I/ l& T! `
20210424110119129.png

5 ?% v" ]- J1 V2 x9 f6 j, V9 u/ [/ ?: q) `; |$ ]
2.GPIO_PIN_SET与GPIO_PIN_RESET1 ^0 N) k: l# W5 A$ }5 s) G

. O- O1 T, N+ \# V9 V
  1. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
    . J: u) x, Y1 `' {
  2. {
    3 C% d& h0 x* e1 Y* U, q: \
  3.   /* Check the parameters */
    7 o, J) k. |- d1 q8 O
  4.   assert_param(IS_GPIO_PIN(GPIO_Pin));
    # n  ?2 }0 w/ c# ~3 ]" H/ ^, L! s
  5.   assert_param(IS_GPIO_PIN_ACTION(PinState));
    9 P, p( ]6 b4 |, }

  6. 1 \6 W/ K% U& v8 G( V6 s+ [
  7.   if (PinState != GPIO_PIN_RESET)
      _$ C2 s' S* h' y# r: m; V
  8.   {( T3 _2 T; h' X7 T: K9 p8 A3 }* g8 \
  9.     GPIOx->BSRR = (uint32_t)GPIO_Pin;//如果是GPIO_PIN_SET,则将GPIO的BSRR寄存器低16位置为GPIO_Pin
    8 P1 `+ K& p' r
  10.   }
    & t/ ?' M% R+ W, E
  11.   else  X6 s4 J/ P  a
  12.   {, X/ ^- h5 l9 R
  13.     GPIOx->BSRR = (uint32_t)GPIO_Pin << 16 ;//如果是GPIO_PIN_RESET,则将GPIO的BSRR寄存器的高16位置为GPIO_Pin
    ' I; ?9 H9 \6 U. y! ^0 G2 r5 h1 {
  14.   }$ K( U- Q! `  k, Q
  15. }
复制代码
9 D8 s5 h$ W1 g6 `& G! N
例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_SET,则GPIOA->BSRR=((uint32_t)0x0002U);即把二进制0000000000000010转换为32位数赋值给BSRR,对应的GPIO_Pin_1管脚置高;6 ^! p" T- }- o$ r: U

* I, R; `; i: f  S例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_RESET,则GPIOA->BSRR=((uint32_t)0x0002U<<16);即把二进制数0000000000000010左移16位并转换为32位数赋值给BSRR,高16位对应的GPIO_Pin_1为1,对应管脚被清零,置低;
2 s, i$ s+ H, v6 t' N4 ~8 C, W, f. S; g. I
3.锁存器3 Y9 v4 }* f( R" i) d% u
锁存使能(LE)输入和输出使能(OE)输入对于所有锁存器是公共的。
$ r9 m4 K# r. ?: n4 U, U& |2 |. b  ^7 P4 P
LE为高电平时,Dn输入端的数据进入锁存器。 在这种情况下,锁存器是透明的,即每当其对应的D输入改变时,锁存器输出就改变状态;# i9 ~# A- w, [1 m0 ~
当LE为低电平时,锁存器将存在于D输入端的信息存储在LE的高电平至低电平转换之前的建立时间;
3 a. Y) H7 b8 W8 \# E% l当OE为低电平时,8个锁存器的内容在输出端可用;. K; F8 R  {3 M' y6 D7 |5 v
当OE为高电平时,输出变为高阻态关闭状态。OE输入的操作不会影响锁存器的状态。  ~# }* ?2 Q( q) Y
4.用端口输出控制函数控制LED闪烁
  l: m! ?8 k( B  C. h6 E: ~) H( P/ e: @4 {/ L
  1.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET);                //端口输出控制函数,PC8端口输出高电平,使LD1熄灭
    9 t0 h- T# L( c% l! D) Y2 I
  2.         HAL_Delay(300);
    ! Y/ U* @9 a, j! f9 m" a
  3.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);        : i2 P5 A2 z9 i1 i5 U! a, p) [4 I0 ~
  4.         HAL_Delay(300);
复制代码
: }7 P# M* v& I+ x% I% c) U
5.用端口输出翻转函数控制LED闪烁
. b  d  U+ u$ u  B7 q6 Q6 S. Q  A( b
  1.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_8);    //端口输出翻转函数
    % l9 b- J) j% @' b
  2.         HAL_Delay(300);
复制代码

" r- t* e1 M" A& l$ ~* Q6.使用锁存器
  1.         HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);                  //锁存器输出高电平1 q- `* K" H1 y
  2.         HAL_GPIO_TogglePin(GPIOC,LD1_Pin);                   //端口输出翻转函数 - c4 k2 U2 k0 Y& O3 r
  3.     HAL_Delay(300);/ Q. }4 y4 a3 K6 \
  4.         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);                //锁存器输出低电平
复制代码
% g- R1 w1 j5 N( e
7.LED跑马灯
) w; }& m* E- O. |
) U5 }# i9 V. j: C, D4 A+ b
  1. #define DELAY_TIME        100
    ! R/ O! l! s4 A1 B# W, a5 }& U
  2. void LED_test(void)
    0 L5 O8 o% y. f$ o. O, q/ X0 t! }
  3. {, B1 `4 {( d7 L7 x+ ]- n
  4.            HAL_GPIO_TogglePin(GPIOC, LD1_Pin);
    % E$ ~2 f: e6 p3 L+ O4 y! h
  5.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);7 X, o$ p0 ?9 Y) y, A9 a0 V% b
  6.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    ( @0 \  @, ~5 v5 Z( y/ P$ Z  h
  7.                 HAL_Delay(DELAY_TIME);
    3 I2 z) m' k! l7 p* P9 H. F( u
  8.                
    - O) E+ A( l/ k+ R' B5 Z' s
  9.                 HAL_GPIO_TogglePin(GPIOC, LD2_Pin);1 `( i4 ~( W3 J4 r
  10.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    ) {8 A0 o* y% V* r
  11.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);3 f- \: W5 v( ^1 D
  12.                 HAL_Delay(DELAY_TIME);  J& i& r. N9 {! T2 y* ~
  13.                
    2 q  F! |. L; v( T
  14.                 HAL_GPIO_TogglePin(GPIOC, LD3_Pin);
    " r) }% U4 T) R
  15.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);* K- Q$ g5 @- W
  16.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);* Z( Q0 u' }& X9 Y8 }3 Y) m: f
  17.                 HAL_Delay(DELAY_TIME);
    9 Y3 v: W7 p! s8 e
  18.                
    & ~4 \2 A7 ?' {& f
  19.                 HAL_GPIO_TogglePin(GPIOC, LD4_Pin);
    ; @) I7 K$ V; [3 K3 Z, v
  20.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    1 A3 T3 g6 f7 P: \
  21.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);! A) o/ R0 e- F7 q4 Z, f
  22.                 HAL_Delay(DELAY_TIME);
    8 R/ y5 Z* G2 j" ?
  23.                
    9 ?. _' f1 z/ `* ~, v# O6 ?' c/ Y9 j
  24.                 HAL_GPIO_TogglePin(GPIOC, LD5_Pin);
    . L9 t; O* q" Y( I3 f
  25.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    ! U  `2 z7 [; S2 b; A  V/ N
  26.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);% G8 i" |. |5 N
  27.                 HAL_Delay(DELAY_TIME);& c. D5 z; {3 X. O% N5 a% n6 ~
  28.                 ; R" }  a" o8 v+ s% F9 i  v9 Q7 `
  29.                 HAL_GPIO_TogglePin(GPIOC, LD6_Pin);
    * T+ w% h2 S: m; C5 [2 }' u$ {
  30.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);6 M3 _1 Y9 l5 @6 O
  31.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    5 Y5 c. J# r* E) w- d2 f, j
  32.                 HAL_Delay(DELAY_TIME);( `' I7 R3 R' A! t& T" K: ~) ]0 I
  33.                
    9 @: h; G- S$ z
  34.                 HAL_GPIO_TogglePin(GPIOC, LD7_Pin);) s. R$ \$ I. W0 N+ W5 j1 p* M2 t
  35.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);- ^$ v  E6 t7 i0 k/ Y1 H
  36.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    3 R; b- a! w' k. e& K% G" c
  37.                 HAL_Delay(DELAY_TIME);
    . o% N' [- J+ j! d( c0 e3 e
  38.                
    " S, A: M2 ~5 S0 f! b& P
  39.                 HAL_GPIO_TogglePin(GPIOC, LD8_Pin);
    * C$ Q; w+ i7 f1 d9 W  D
  40.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    ! a$ F# W. O) f' [
  41.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    % f9 t# J0 s* a8 z
  42.                 HAL_Delay(DELAY_TIME);        7 f# v9 C  C, y
  43. }# C2 \9 g- j# E3 o! j

  44. 9 L9 U4 U3 j: [
复制代码

% k  F8 E5 j6 Y* ~" Q4 t/ q8 }( \
赞 收藏 评论0 发布时间:2021-12-8 22:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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