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

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

[复制链接]
STMCU小助手 发布时间:2021-11-13 00:01
1.使用keil5的注意事项
. w+ u" |; L1 O7 i+ J用STM32Cube生成程序驱动后 将程序写到以下范围内,以程序保证用STM32Cube重新生成工程后不被删除 。* f0 Z( U8 T" L
  1. /* USER CODE BEGIN 1 */     //代码开始
    : a/ F  h$ C+ c" A3 m
  2. ! G- `' a6 Q  h9 H: ?  r2 t
  3. /* USER CODE END 1 */                //代码结束
复制代码
3 n9 J% G" r+ l# k$ Y0 w: s! |
) ~5 L* S7 L2 p' G( E/ f+ [) a' `
2.HAL库延时函数3 C' c5 ^9 I" w. k  [/ _$ S& P- D
HAL库自带延时函数(毫秒,阻塞)
- D4 r& Q: `& r" a7 Z* y
  1. HAL_Delay(x);
    1 A8 G, g! F" H( n  ~
  2. 实际延时时间为(x+1)ms
复制代码
HAL库函数为了防止无意义延时(即0ms延时)的产生,在HAL_Delay函数传入参数之后会对参数加1。 如果使用HAL库默认延时函数进行延时,实际延时时间将会比预期时间多1ms。换句话说,HAL_Delay函数至少会产生1ms的延时。" V7 Y7 u4 S7 Y1 `: E$ N% W
2 o: c- J! _0 d) h1 S8 M
重新定义延时函数,非阻塞式延时
0 V4 x2 `' ]& f( v3 T1 a
  1. void Delay_us(int16_t nus) ! U: A) }, n' c, F
  2. {
    + o- n; j: Y  l9 l# g6 ?+ T0 Q/ B5 I
  3.   int32_t temp;
    ; V, }# R9 t- Y
  4.   SysTick->LOAD = nus*9; //72MHz" ?7 e% Y& g9 G8 h1 P2 G4 `: V
  5.   SysTick->VAL=0X00;
    # G# ^0 e+ t( g: B- a2 C) F
  6.   SysTick->CTRL=0X01;
    ; N( V* O0 O3 `7 G- O, g1 Z1 j
  7.   do
    7 M) u5 W$ V5 }4 H5 K' j( b" V
  8.   {   n3 W9 k4 K0 ~. i) u
  9.     temp=SysTick->CTRL;
    , ]" x) d) x8 V( N
  10.   }6 T1 C& A' y( c- u* O" p
  11.   while((temp&0x01)&&(!(temp&(1<<16))));
    3 P; S" |$ Q. \  t' \1 {

  12. 9 V3 n2 a/ h+ [: F& ?+ a- V
  13.   SysTick->CTRL=0x00; 2 Q+ ^5 J( q: k
  14.   SysTick->VAL =0X00; 3 J- |  Z  H* o4 X& j, g2 [
  15. }2 q, f  ]4 H  I: _. d: k" X5 l: k
复制代码

9 _3 p3 M: e$ j  Z, D; D" b3.HAL库配置GPIO
! Y: C! E5 `& I# f( d3 ?' t
  1. void              HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init);
    3 h1 }+ O# {" `
  2. void              HAL_GPIO_DeInit(GPIO_TypeDef  *GPIOx, uint32_t GPIO_Pin);5 o( P* \! z) J7 N
  3. GPIO_PinState     HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);  //端口输入读取函数
    ) k) w0 |* c  w) L
  4. void              HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); //端口输出控制函数
    , c+ i1 _3 k% O
  5. void              HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);  //端口输出翻转函数
    ! x, j3 `, I9 {: F
  6. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
    ( W1 _: U$ f# J( c+ y5 X: ^
  7. void              HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);/ M! \9 t7 _! t, _
  8. void              HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
复制代码
解释:0 r$ h! g6 x8 Z$ Q: L  w, d

% _1 T/ I9 f3 l$ b2 uHAL_GPIO_Init. Q. V% s5 ~- Y1 I5 M# _
初始化我们需要用到的引脚的工作模式,包括具体引脚的工作速度、是否复用模式、上下拉等等参数。. d7 P' t5 L, V! u  W/ b6 H
  1. void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
复制代码

1 L# p. \7 k3 O& `7 G; `+ w. THAL_GPIO_DeInit0 ^9 m6 t- Z) u
将初始化之后的引脚恢复成默认的状态–各个寄存器复位时的值
( c3 w" o9 }. v4 c' ?
  1. void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)5 K% \1 H" D. _7 H. {
  2. 例:HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);
复制代码

- p: }& q3 ?; P# K* g4 t) uHAL_GPIO_ReadPin
- L6 S* A. U) M9 v4 [: }# v" n读取我们想要知道的引脚的电平状态、函数返回值为0或1。/ K2 G% ?# I% f  r! A
  1. GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
    7 ?% Z. T+ J0 i3 W
  2. 例:pin_State = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_9);
复制代码
; Q! L4 t* @  I. k: g5 B
HAL_GPIO_WritePin
6 `" T6 P7 f6 o" L6 S给某个引脚写0或1,但是不要理解成,写1就是使能之类的意思,有些寄存器写1是擦除的意思
- l" N/ V% w- |9 V  U$ ]
  1. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)1 ]# h) _" C/ w* \. z8 \
  2. 例:HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9,GPIO_PIN_RESET)
复制代码

! q, P6 s( b7 W6 ^+ \HAL_GPIO_TogglePin) E: o) ^$ J$ B1 B. i, L
翻转某个引脚的电平状态7 E7 V* T6 J8 s5 ^# T
  1. void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)  y4 I( h- `$ N# e4 k/ d8 v
  2. 例:HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9);
复制代码
9 ?6 L1 x$ s9 ~
HAL_GPIO_LockPin
+ n! h( R1 h# V- b) V: ~$ L如果一个管脚的当前状态是1,读管脚值使用锁定,当这个管脚电平变化时保持锁定时的值,直到重置才改变
- t( B0 b9 K/ h; u
  1. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
    " B# a+ g/ {7 v1 S
  2. 例:
    " W. k6 p( S$ m5 F
  3. HAL_StatusTypeDef hal_State;4 `  N/ K  [3 f% e
  4. hal_State = HAL_GPIO_LockPin(GPIOF, GPIO_PIN_9);
复制代码
8 N) `4 P* H0 P0 X
HAL_GPIO_EXTI_IRQHandler
6 e: [. y! k9 w9 M这个函数是外部中断服务函数,用来响应外部中断的触发,函数实体里面有两个功能,1是清除中断标记位,2是调用下面要介绍的回调函数。实际调用的是下边的中断回调函数& N" z- P0 k( V
  1. void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)# j: ?3 [2 X: N3 e5 b
  2. 例:HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
复制代码

7 A# i: ]3 w! v( l; |1 p. mHAL_GPIO_EXTI_Callback' e; R) ?) L9 k0 P% x- B; w4 r' S: P0 e
中断回调函数,可以理解为中断函数具体要响应的动作。  t! l7 H  G( ~
  1. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    6 z8 Z: k$ K. s. M: X
  2. 例:HAL_GPIO_EXTI_Callback(GPIO_Pin);
复制代码

; B5 @) g$ B9 d2 d5 Z+ z4.LED工程% P0 A3 a" E, z9 z  c, a) T) E7 C1 W
1.LED电路原理图5 I' f" O/ q' a, I! D8 ~

4 t" x7 T( U( f# B5 K. ]
20210424110119129.png
9 W/ y* E" ?7 m, Q1 k8 t

. i" h" b; P' E2 q2.GPIO_PIN_SET与GPIO_PIN_RESET
+ k0 h) j2 ~$ Y! ^3 y% ~- C+ h) b
  1. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
    ' w0 r1 J1 t' f( I! a
  2. {- ~2 C* S6 L( R1 g
  3.   /* Check the parameters */9 A. @! @& U. b& z
  4.   assert_param(IS_GPIO_PIN(GPIO_Pin));4 k: W, m2 b. e! t9 K- d6 V5 J6 @, V
  5.   assert_param(IS_GPIO_PIN_ACTION(PinState));
    ) X0 F& T- y' E) `! A# W# A

  6. ! A1 H* ^4 D/ t- |
  7.   if (PinState != GPIO_PIN_RESET)& Y9 G  a) B6 k
  8.   {
    : B8 d  h% M/ n* S8 F) [
  9.     GPIOx->BSRR = (uint32_t)GPIO_Pin;//如果是GPIO_PIN_SET,则将GPIO的BSRR寄存器低16位置为GPIO_Pin1 N+ X4 Q5 }* U6 H
  10.   }  M! w: H9 T2 Y
  11.   else
    1 N: i7 n* _" r# x
  12.   {: o* E' e, f& J+ O" k
  13.     GPIOx->BSRR = (uint32_t)GPIO_Pin << 16 ;//如果是GPIO_PIN_RESET,则将GPIO的BSRR寄存器的高16位置为GPIO_Pin! Q1 V. Z9 V. i, X, ]2 x, M: D/ ]
  14.   }
    : A- @; G& A2 S$ N  m
  15. }
复制代码

6 l/ O) B' x& _: X* Z& v% j例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_SET,则GPIOA->BSRR=((uint32_t)0x0002U);即把二进制0000000000000010转换为32位数赋值给BSRR,对应的GPIO_Pin_1管脚置高;
, F, g  I/ c- [# H& \$ W0 {3 y! a
例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_RESET,则GPIOA->BSRR=((uint32_t)0x0002U<<16);即把二进制数0000000000000010左移16位并转换为32位数赋值给BSRR,高16位对应的GPIO_Pin_1为1,对应管脚被清零,置低;
3 g: p8 }. y& N8 Q! ^8 q# [$ d- ^' @2 N; h
3.锁存器
; T2 \. J" l' U& x$ o  y* \锁存使能(LE)输入和输出使能(OE)输入对于所有锁存器是公共的。
6 }8 `0 J0 O' T& WLE为高电平时,Dn输入端的数据进入锁存器。 在这种情况下,锁存器是透明的,即每当其对应的D输入改变时,锁存器输出就改变状态;, d' _: N7 G0 N8 n. R
当LE为低电平时,锁存器将存在于D输入端的信息存储在LE的高电平至低电平转换之前的建立时间;* |4 X% R! s8 T5 Z7 m# n
当OE为低电平时,8个锁存器的内容在输出端可用;2 Y% H' ^, s, f7 j) P) r' P( @& V
当OE为高电平时,输出变为高阻态关闭状态。OE输入的操作不会影响锁存器的状态。6 ^' E/ [9 [/ ?
. G' z* Y+ V/ u3 p
4.用端口输出控制函数控制LED闪烁7 h; V3 K' p3 A% e: x
  1.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET);                //端口输出控制函数,PC8端口输出高电平,使LD1熄灭6 g, c$ \4 Y" C. Y8 o; P+ y3 t
  2.         HAL_Delay(300);
    : S# e7 T  t8 X
  3.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);        " J# ]" r. |7 O  t7 u9 m
  4.         HAL_Delay(300);4 M+ R! C, {1 r$ X/ Y
复制代码

, ]! H( I  S. U* t) H# m, [" @& a7 n, y" k" ]
5.用端口输出翻转函数控制LED闪烁' q" \& r/ Z/ Q9 H2 |
  1.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_8);    //端口输出翻转函数 0 i2 Y' E; z8 J  d
  2.         HAL_Delay(300);
复制代码
  D0 X1 V9 k# B2 \2 K5 E7 l
$ d  m7 X7 m3 h' B
6.使用锁存器1 I5 |3 K% E0 }1 D* ^0 I0 y
  1.         HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);                  //锁存器输出高电平: B, M- k" V2 k, J; j+ G$ t! f0 s3 a8 ~
  2.         HAL_GPIO_TogglePin(GPIOC,LD1_Pin);                   //端口输出翻转函数
    ! ]9 I7 R6 X1 ]4 b/ ~
  3.     HAL_Delay(300);
    : W8 b1 }% g, J
  4.         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);                //锁存器输出低电平
复制代码

+ B) v% ?. e9 z0 p6 X- p+ Z7.LED跑马灯
2 o' b% y" e7 p: j( a
  1. #define DELAY_TIME        100
    # H. f% G1 a5 L1 t5 `; w/ E
  2. void LED_test(void)
    3 r/ h! t1 k4 V; |) K9 k% ~
  3. {( o: w1 x$ I& n: S
  4.            HAL_GPIO_TogglePin(GPIOC, LD1_Pin);
    6 k! p# g1 b  T* Y) v
  5.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    , |. R+ `' v* D: E" d5 L, V2 H5 K% S
  6.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);# P# w5 t% M: Y3 k
  7.                 HAL_Delay(DELAY_TIME);! F) N* ]& T- H% T3 ~8 h( ?
  8.                 / ]. r+ [+ z* u4 z$ H! d
  9.                 HAL_GPIO_TogglePin(GPIOC, LD2_Pin);& f1 ]7 |& l( I) a; p! ?# d
  10.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);# P, Y- y# N) J
  11.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    $ q. X  P+ N$ I- R4 U3 z+ v
  12.                 HAL_Delay(DELAY_TIME);3 h) `# ~# ]' }, `4 f
  13.                
    2 c; C& i3 }0 B6 v& q
  14.                 HAL_GPIO_TogglePin(GPIOC, LD3_Pin);6 H1 o3 X( n3 n2 d+ q: L
  15.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);7 Z* U' K$ c$ }& q8 t$ Z- B6 R6 c
  16.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    1 g; S, _5 s4 P: l
  17.                 HAL_Delay(DELAY_TIME);( [2 m: Z- Y1 w  ]  u  M: O
  18.                 8 m7 T( {; u' S
  19.                 HAL_GPIO_TogglePin(GPIOC, LD4_Pin);
    ! O9 y' i7 [0 o
  20.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    & G7 K# J0 C8 t9 m
  21.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    6 v) d( B7 L8 ?
  22.                 HAL_Delay(DELAY_TIME);6 ?/ O' U% \  O( Z
  23.                
    6 v/ ]# m: r$ N4 x
  24.                 HAL_GPIO_TogglePin(GPIOC, LD5_Pin);
    - P; z  E% l  J
  25.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);( \, g4 I( d2 r4 s  E
  26.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);+ ?+ H3 {, v$ x1 y+ v# |$ i
  27.                 HAL_Delay(DELAY_TIME);
    # L( c( v: A/ p9 j  N
  28.                 , W5 n9 Y# O2 x
  29.                 HAL_GPIO_TogglePin(GPIOC, LD6_Pin);7 _- {: d" T1 I! b- I# b- `
  30.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);  Q4 a. Z( |- T2 s- A
  31.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    $ U$ s- K! z  _: Z' q3 Z
  32.                 HAL_Delay(DELAY_TIME);" A+ p& g8 |; S2 @) Q
  33.                 - O3 x( F' U3 y
  34.                 HAL_GPIO_TogglePin(GPIOC, LD7_Pin);
    7 g+ t& O9 y2 y
  35.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    - f. \  e4 L2 v) m9 N/ [) z
  36.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);9 Q7 T# `. k8 Z, D
  37.                 HAL_Delay(DELAY_TIME);& J; J- h4 h9 A% ~/ d
  38.                 8 z. \' y* [: d; {. c  Y
  39.                 HAL_GPIO_TogglePin(GPIOC, LD8_Pin);
    * a' J3 [" i* e  D" K2 a
  40.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);9 H/ l9 K, W% n! p+ p- @: s
  41.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    & T; h$ u. l0 l! H6 b
  42.                 HAL_Delay(DELAY_TIME);        : `% T  `' R* ^; V, z% G- h) a
  43. }
    / y! W  G, `* Y  B1 {7 b
复制代码
. f5 S* `6 U4 q

$ S8 f3 D3 z& x7 ^0 r- C: X/ G4 F, U3 i9 g
赞 收藏 评论0 发布时间:2021-11-13 00:01

举报

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