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

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

[复制链接]
STMCU小助手 发布时间:2021-12-8 22:00
1.使用keil5的注意事项; ?( f& j9 I1 p. T3 H
用STM32Cube生成程序驱动后 将程序写到以下范围内,以程序保证用STM32Cube重新生成工程后不被删除 。
3 E- J2 ~5 _0 I% c6 O
  1. /* USER CODE BEGIN 1 */     //代码开始" ?& s) Y7 f  M/ h5 U

  2. 8 Y) u3 W  y& K
  3. /* USER CODE END 1 */                //代码结束
复制代码
% t1 i. _8 z. s' n
2.HAL库延时函数# V0 @/ P2 t* I; [
1、HAL库自带延时函数(毫秒,阻塞)$ I6 J; S1 v! k& E' r
  1. HAL_Delay(x);
    * t- h/ ?6 p/ s$ [
  2. 实际延时时间为(x+1)ms
复制代码

( x' ?6 V3 F# |: n- l6 t/ A" f' PHAL库函数为了防止无意义延时(即0ms延时)的产生,在HAL_Delay函数传入参数之后会对参数加1。 如果使用HAL库默认延时函数进行延时,实际延时时间将会比预期时间多1ms。换句话说,HAL_Delay函数至少会产生1ms的延时。: D7 N% C: M& _6 l
! E, A3 S# Z& i
2、重新定义延时函数,非阻塞式延时$ \+ L9 ?% M" X2 v" ?6 a# Y
  1. void Delay_us(int16_t nus) 4 |, R! b2 i/ Z- A9 y& Z# j# e
  2. {, _- w1 d% T( q) @2 H* O
  3.   int32_t temp;
    0 [( N6 G" k$ ?: I! A1 b
  4.   SysTick->LOAD = nus*9; //72MHz
    9 [, X: h8 T0 M" O/ S" {) z
  5.   SysTick->VAL=0X00;1 H( i6 d) q' O+ G. l- M
  6.   SysTick->CTRL=0X01;
    8 }; g0 }. r) h
  7.   do : s4 z. _- U- r! }0 V3 P6 y) Y
  8.   {
    ( O  ^4 ]0 F, U9 Y
  9.     temp=SysTick->CTRL;  M9 d* r' A+ ^
  10.   }2 p# V& _  @8 H
  11.   while((temp&0x01)&&(!(temp&(1<<16))));0 U% f1 K, T8 s8 I0 B. M
  12.   C  V6 ^. M* }' z
  13.   SysTick->CTRL=0x00; 6 \  n  o- w8 d) D
  14.   SysTick->VAL =0X00;
    7 Y- Y+ r4 H8 h1 d7 ]
  15. }
    : W0 A; I% s6 m4 J1 q# V/ C
复制代码

# l5 d( j0 a( }$ Q# i3.HAL库配置GPIO& }8 A) u7 l7 x
  1. void              HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init);. u' g9 q) _2 t" t# L
  2. void              HAL_GPIO_DeInit(GPIO_TypeDef  *GPIOx, uint32_t GPIO_Pin);7 t! ^8 p& O0 A3 l
  3. GPIO_PinState     HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);  //端口输入读取函数
    : t5 }1 F* }7 X6 C" q
  4. void              HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); //端口输出控制函数! H4 x- G$ I& q: {) _# D$ }
  5. void              HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);  //端口输出翻转函数 4 o2 r$ t3 b  L" z- u9 ~; s! Y
  6. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
    4 J6 K. B/ R% S+ J0 N
  7. void              HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);1 s% ?/ K" T: P9 v' w7 t/ j1 ^
  8. void              HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
复制代码

; d) Q1 m. n5 B7 n9 A% B解释:! S9 t/ k7 |9 {. ]4 Q0 p) u1 u" x

6 T0 R9 L7 X# Y# E- p" zHAL_GPIO_Init5 P4 a% O0 ]- ~' R4 ~# B1 m& u
初始化我们需要用到的引脚的工作模式,包括具体引脚的工作速度、是否复用模式、上下拉等等参数。
; q% c2 S& _# m; D2 |$ o, V6 O( S% l
  1. void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
复制代码

/ E3 g0 c: _* }4 s! Y$ t3 q! dHAL_GPIO_DeInit2 A' ?, A% o. S3 Y$ }: Q
将初始化之后的引脚恢复成默认的状态–各个寄存器复位时的值
4 s3 N# V( C2 ]1 `7 j
  1. void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)
    5 }# I1 G! a$ X  R- O. B+ y
  2. 例:HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);
复制代码

* k' V& c  s2 MHAL_GPIO_ReadPin
+ e+ ]* |6 r7 Q% i& f6 k0 C( f1 H读取我们想要知道的引脚的电平状态、函数返回值为0或1。" M8 M& p. n. l$ U* R) a  `' c2 y
  1. GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)* m% m& L7 |, Y( T7 v$ O
  2. 例:pin_State = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_9);
复制代码
* L: L9 U/ y3 z8 |! |7 S
HAL_GPIO_WritePin) o$ f& K8 s* E, G/ T
给某个引脚写0或1,但是不要理解成,写1就是使能之类的意思,有些寄存器写1是擦除的意思6 G5 y; p% T* d5 g% P7 N. k
  1. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)& i9 P) m, n/ Z, g2 V& c7 k
  2. 例:HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9,GPIO_PIN_RESET)
复制代码
0 U3 o/ `) Z5 T8 ~
HAL_GPIO_TogglePin0 g" N( B' y$ Y4 K$ L
翻转某个引脚的电平状态
. t6 I' P! ^- f) n
  1. void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)3 b) d" p9 I" K. [- u5 T  n
  2. 例:HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9);
复制代码

' ]. ~- s. n. U8 X$ t+ K" K2 p9 n. N1 ^HAL_GPIO_LockPin6 A$ ^3 P& h! D( N" `9 r
如果一个管脚的当前状态是1,读管脚值使用锁定,当这个管脚电平变化时保持锁定时的值,直到重置才改变
# c/ B7 y8 h! o+ a
  1. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)2 L9 }) N9 D. Y: \) A, ?" B
  2. 例:, T; C# f; c, e! ]4 t/ _
  3. HAL_StatusTypeDef hal_State;; c; h7 l; h2 X6 V9 I. E7 F
  4. hal_State = HAL_GPIO_LockPin(GPIOF, GPIO_PIN_9);
    * x: Y4 y# V( H* r# q

  5. " a, w1 V8 A0 \  J) P% ]
复制代码
& f# ~: S5 r0 q6 ^% k$ j/ d" o" j0 g
HAL_GPIO_EXTI_IRQHandler
" z* |  q9 |" o6 J# p/ }2 G* U这个函数是外部中断服务函数,用来响应外部中断的触发,函数实体里面有两个功能,1是清除中断标记位,2是调用下面要介绍的回调函数。实际调用的是下边的中断回调函数
: r* G9 C, l2 D. {( i
  1. void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
    ; f0 k* O! \" d6 v/ z$ g* B; p
  2. 例:HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
复制代码
$ z% t) T( V) e# k! v, y
HAL_GPIO_EXTI_Callback% P/ j  q; g- ~! @3 @, v' D
中断回调函数,可以理解为中断函数具体要响应的动作。. K' C! r+ C) ^3 p
  1. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    $ i0 K" ^# ~4 f( i7 U
  2. 例:HAL_GPIO_EXTI_Callback(GPIO_Pin);
复制代码

" x4 ]% F' p% P; O  j8 W& \9 W! x4 V9 Q' S$ o
4.LED工程8 S+ z- ]' U$ b' `( Y2 k0 M
1.LED电路原理图
2 b4 `; ?8 S9 J& }' {: a
2 W7 X+ H' e4 n3 r
20210424110119129.png

7 b. U% Y+ b3 ~7 n: W
3 N" H  [" q+ m  @! ]2.GPIO_PIN_SET与GPIO_PIN_RESET9 O/ D& [4 S0 g8 J4 n( V
- x5 X2 G" s7 [7 o, K' z" n
  1. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
    ; s. T4 z7 @1 V8 N
  2. {% ^- h+ V, X, D/ ^" @7 B+ V
  3.   /* Check the parameters */, t  e2 i8 |3 v) l& k0 z
  4.   assert_param(IS_GPIO_PIN(GPIO_Pin));
    8 E! r! z0 H0 `! p5 Z4 i* R
  5.   assert_param(IS_GPIO_PIN_ACTION(PinState));
    - l9 O& [$ k( V. S

  6. 8 Y' s- h+ c7 I/ |! R
  7.   if (PinState != GPIO_PIN_RESET); t) @* S7 a( _0 B* O; k  T  ?2 t
  8.   {
    2 A7 b+ W. z- E- ?! G7 G
  9.     GPIOx->BSRR = (uint32_t)GPIO_Pin;//如果是GPIO_PIN_SET,则将GPIO的BSRR寄存器低16位置为GPIO_Pin7 Z: m' B) L+ D  _1 ^
  10.   }  F5 ~1 L9 T+ f# g2 y. M7 ?- f- G
  11.   else; Y! K: N+ |- d4 @
  12.   {& M8 f- x4 y  L& T& }* j+ S( u
  13.     GPIOx->BSRR = (uint32_t)GPIO_Pin << 16 ;//如果是GPIO_PIN_RESET,则将GPIO的BSRR寄存器的高16位置为GPIO_Pin
    4 p1 `* K" g. ]2 g
  14.   }
    1 f5 T& Q) g; Q( X0 D7 I# r
  15. }
复制代码

9 O% q" z* n6 G' o, C* Y例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_SET,则GPIOA->BSRR=((uint32_t)0x0002U);即把二进制0000000000000010转换为32位数赋值给BSRR,对应的GPIO_Pin_1管脚置高;& A! f/ z2 L& J
( z$ Z6 A+ }8 H! K: M9 l- E0 T
例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_RESET,则GPIOA->BSRR=((uint32_t)0x0002U<<16);即把二进制数0000000000000010左移16位并转换为32位数赋值给BSRR,高16位对应的GPIO_Pin_1为1,对应管脚被清零,置低;+ i8 I7 p( V6 j7 v  K8 H: G

) N* k; }$ Z* n8 R! F- n& [* C3.锁存器+ M! X+ t; g9 y$ H  M& u: L. u
锁存使能(LE)输入和输出使能(OE)输入对于所有锁存器是公共的。1 [. K$ p- [. u& }
; Q- {8 }7 D# W( U' O% q* g
LE为高电平时,Dn输入端的数据进入锁存器。 在这种情况下,锁存器是透明的,即每当其对应的D输入改变时,锁存器输出就改变状态;& V/ H1 f" B& X/ m$ \  K
当LE为低电平时,锁存器将存在于D输入端的信息存储在LE的高电平至低电平转换之前的建立时间;
8 Y$ Y2 `! g0 q' R2 e/ @, g当OE为低电平时,8个锁存器的内容在输出端可用;
# q* r; g' K, n  s5 w$ {7 c( S当OE为高电平时,输出变为高阻态关闭状态。OE输入的操作不会影响锁存器的状态。
. V' u: F+ x; I9 F! d4.用端口输出控制函数控制LED闪烁. q: ^, a+ W8 _) |1 G

7 U2 M. h* x# k( Q, N4 W  q4 j1 ^
  1.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET);                //端口输出控制函数,PC8端口输出高电平,使LD1熄灭
    5 ^& B$ v( X8 p" H, E! K, l; k
  2.         HAL_Delay(300);5 L8 C. V! Y. T* @; ~, c$ H0 q' a
  3.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);        
    - U6 S' k, X) d$ j5 I% h8 |' e6 i4 s/ r
  4.         HAL_Delay(300);
复制代码

' V, ~+ J3 a2 j  p5.用端口输出翻转函数控制LED闪烁3 _- p& |# f/ `) o" m% U
  1.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_8);    //端口输出翻转函数 . q; e+ ]* @) O- P/ o0 s6 F
  2.         HAL_Delay(300);
复制代码
; [7 A. P$ a" u9 q0 K1 j) ?. ^
6.使用锁存器
  1.         HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);                  //锁存器输出高电平) i9 J- k. S" L& O
  2.         HAL_GPIO_TogglePin(GPIOC,LD1_Pin);                   //端口输出翻转函数 4 \* P( m+ r% y9 y- p. x! _
  3.     HAL_Delay(300);
    6 e' i5 U' ?2 H- S. }# K# C
  4.         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);                //锁存器输出低电平
复制代码
6 D  P& K0 B) U
7.LED跑马灯4 V/ h3 j9 ?3 j; d& b" i

7 `  `# d+ w5 W' H
  1. #define DELAY_TIME        1003 d$ J) E4 {+ r: n0 Q& j% h' V
  2. void LED_test(void)
    2 Q9 S7 O1 N  b
  3. {! |1 Y& I# Z7 q1 G
  4.            HAL_GPIO_TogglePin(GPIOC, LD1_Pin);
    ; ^# R2 Y3 D0 U# C( L! T5 Q2 d
  5.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);/ F7 q3 F: H" c
  6.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    9 [% i- d, ^* E* N6 n! {/ J( ?
  7.                 HAL_Delay(DELAY_TIME);" ~. v5 ]) ?! I$ r7 s4 X4 z
  8.                
    9 Y$ L* ]* L' X6 o: o1 U3 G0 U
  9.                 HAL_GPIO_TogglePin(GPIOC, LD2_Pin);
    * ?4 R" F3 A7 d( u" f# I/ `
  10.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    5 u9 c  `" ]+ K0 ^8 F, t  \  ?# H
  11.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    " W: r) e+ p7 }3 ^# d
  12.                 HAL_Delay(DELAY_TIME);
    ! [! `6 U' |% v" ?6 M5 @2 `
  13.                
    : P9 ^. g7 b8 @; ~
  14.                 HAL_GPIO_TogglePin(GPIOC, LD3_Pin);
    4 j( L0 y: i4 {& ~+ @2 x8 E
  15.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);6 ~! \7 \9 S* h1 V+ b6 @
  16.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    ; w) i9 n8 ]! c6 I9 I+ m2 u
  17.                 HAL_Delay(DELAY_TIME);
    ! S! x9 J4 r0 z4 D  g! M& n
  18.                 1 v( r5 a+ J7 }' b" L9 ^5 G. p  `) E
  19.                 HAL_GPIO_TogglePin(GPIOC, LD4_Pin);% c3 g; D& v: Z5 X/ T7 E) l% Y& y
  20.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    # C7 l1 q: F! O6 r& a! ^- Q: c
  21.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);# z( p) Y; u( x; u
  22.                 HAL_Delay(DELAY_TIME);
    & R1 R  q( f4 R4 i4 D
  23.                
    * b9 Q4 R2 O0 M4 Q1 z2 h
  24.                 HAL_GPIO_TogglePin(GPIOC, LD5_Pin);
    9 Q! `+ f+ g, I
  25.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    1 p* ]7 e5 }6 Z; I
  26.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);; Z/ ~5 S* T* r4 S
  27.                 HAL_Delay(DELAY_TIME);% L8 y8 j- ]7 c! T0 t
  28.                
    + \2 P0 C5 J- p+ C* N3 J
  29.                 HAL_GPIO_TogglePin(GPIOC, LD6_Pin);
    1 }6 w+ |0 e: ]
  30.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    - d/ W# |  C! R+ e) t8 ~6 a4 x* F
  31.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    . i7 x& R7 S8 r6 c
  32.                 HAL_Delay(DELAY_TIME);8 f/ }6 f! l/ Z0 D3 b% F
  33.                
    7 o6 I4 I8 z3 b0 ]- K: [  b
  34.                 HAL_GPIO_TogglePin(GPIOC, LD7_Pin);
    % R4 z8 t- }. {. Z
  35.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    / w9 c  S7 J+ {/ ]% p
  36.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
      c. P. R* @3 I7 y3 T8 S
  37.                 HAL_Delay(DELAY_TIME);4 c7 S/ O+ P' k: x# i7 S* f9 O
  38.                 6 v. Y; `: y+ W( O- U3 P
  39.                 HAL_GPIO_TogglePin(GPIOC, LD8_Pin);
    ; e3 Z/ Q* \' X; o: F
  40.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);5 b: b2 F) b% T3 _: ^( A% I7 |/ M
  41.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    / ]7 a. L9 Z, x
  42.                 HAL_Delay(DELAY_TIME);        
    # Y0 l3 A/ v- x5 I+ O1 e
  43. }3 C% r4 m- M+ Y8 f7 D% t" y+ j- B
  44. ! U+ s9 K2 U. L2 ^) s6 v2 S9 P
复制代码

$ U% s! t7 [9 {8 x9 |1 R3 p% q# e1 B- E
4 f8 m  B' s$ g
收藏 评论0 发布时间:2021-12-8 22:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版