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

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

[复制链接]
STMCU小助手 发布时间:2021-12-8 22:00
1.使用keil5的注意事项/ k& s, m; \8 |+ t7 n/ O
用STM32Cube生成程序驱动后 将程序写到以下范围内,以程序保证用STM32Cube重新生成工程后不被删除 。  _4 }" C8 f+ L/ r) P4 k5 }
  1. /* USER CODE BEGIN 1 */     //代码开始5 w- \1 {1 R( c( Y9 o1 ]
  2. 0 Q+ G8 _( S! ^, ?
  3. /* USER CODE END 1 */                //代码结束
复制代码

, \4 g, O. x. h3 J4 L1 `* U2.HAL库延时函数
8 w" l& s+ K6 T+ U  {, x* p1、HAL库自带延时函数(毫秒,阻塞)
5 i0 X( ~( Q. M( J& j; G4 a6 A
  1. HAL_Delay(x);4 F3 ~* R3 J2 z) H; U
  2. 实际延时时间为(x+1)ms
复制代码

7 u- E6 G- D+ hHAL库函数为了防止无意义延时(即0ms延时)的产生,在HAL_Delay函数传入参数之后会对参数加1。 如果使用HAL库默认延时函数进行延时,实际延时时间将会比预期时间多1ms。换句话说,HAL_Delay函数至少会产生1ms的延时。
# `! x$ b: A$ Q7 D/ z! p% x% j0 V: C4 M9 i
2、重新定义延时函数,非阻塞式延时
/ E" H4 b# Z. S6 A: m
  1. void Delay_us(int16_t nus) $ V! u5 E* |3 t+ E+ ^& ~
  2. {  s8 b, h) ?: _6 e2 ?
  3.   int32_t temp;
    " d; P" u8 B2 B7 N% L! f, z* W
  4.   SysTick->LOAD = nus*9; //72MHz9 q! e4 V- c/ S3 u
  5.   SysTick->VAL=0X00;
    % j+ }" [: h5 u3 H7 r0 V
  6.   SysTick->CTRL=0X01;6 S2 T0 B6 ~: p4 D
  7.   do
    . C' Z/ m' I5 g4 U
  8.   { / R, T$ F) l+ E- o7 |/ T, _
  9.     temp=SysTick->CTRL;
    6 g  G) J8 c) b6 r4 c% I
  10.   }
    4 g, l  |# {/ }) B
  11.   while((temp&0x01)&&(!(temp&(1<<16))));
    7 b/ D# _! Q" K, M0 V1 B* p% ~

  12. * O( z8 B/ n  _' C6 W: p
  13.   SysTick->CTRL=0x00;
    5 W5 e, f% a, z8 h9 e% }, a
  14.   SysTick->VAL =0X00;
    9 @: j+ r8 j$ o8 Q
  15. }/ }# i. C& o, [. C  U4 N, ^
复制代码
* F1 V" e  M  {: X
3.HAL库配置GPIO
9 [2 V. T9 x+ i( Z8 Z2 o
  1. void              HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init);
    ; Y" n  a, K/ H% [4 y! W' @
  2. void              HAL_GPIO_DeInit(GPIO_TypeDef  *GPIOx, uint32_t GPIO_Pin);7 H/ z; H3 b$ z# ^! T1 T
  3. GPIO_PinState     HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);  //端口输入读取函数. d3 l" c& L" C
  4. void              HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); //端口输出控制函数
    8 s  I% a9 [9 L8 P" J# e  c* ^  _: J
  5. void              HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);  //端口输出翻转函数 " `9 o! v  x3 O5 ?/ b: J  f
  6. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);0 B. i* n* t( f  u& J
  7. void              HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);
    $ b) ]! S4 Y6 \
  8. void              HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
复制代码

( v" o, r  k6 c: }6 @2 n& W$ ~% f解释:
) o5 r1 d, ~# q! K
  k7 [  z  j" ?& M6 Y/ fHAL_GPIO_Init; C# O/ @% \! K, \
初始化我们需要用到的引脚的工作模式,包括具体引脚的工作速度、是否复用模式、上下拉等等参数。6 @# Z0 m, t# [3 O  H# B
  1. void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
复制代码
/ q7 h! l$ [+ p1 q: J4 I
HAL_GPIO_DeInit
0 t1 i* X1 c/ X将初始化之后的引脚恢复成默认的状态–各个寄存器复位时的值# S3 y$ d) S2 b4 A( Z4 U1 r8 `
  1. void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin): R/ t- s' }* ]4 {. e7 V* d! f
  2. 例:HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);
复制代码
$ s8 i% X5 V$ t3 {; p7 Y
HAL_GPIO_ReadPin
' v4 m( r8 A6 e- q% r! ~4 K4 S读取我们想要知道的引脚的电平状态、函数返回值为0或1。3 C- o4 v, [# M3 R0 P' x
  1. GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
    ' l; C1 R1 D9 R+ J
  2. 例:pin_State = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_9);
复制代码
+ T. h' ?- d; p' \' C" ?3 y# I
HAL_GPIO_WritePin
# f$ S+ C+ C, R给某个引脚写0或1,但是不要理解成,写1就是使能之类的意思,有些寄存器写1是擦除的意思9 b) f3 Z4 X8 s* @
  1. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)7 k/ l" k# U/ x- ?/ b
  2. 例:HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9,GPIO_PIN_RESET)
复制代码

4 B% o; ~8 J$ n) m  s+ ]7 e$ I  \HAL_GPIO_TogglePin4 d) W0 K: u: X8 H  O, _
翻转某个引脚的电平状态4 N: w% _) j0 q* m0 x3 z
  1. void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
    $ X- {5 B/ i2 h2 l9 o
  2. 例:HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9);
复制代码
: G9 @  }8 h- A4 C: m7 x
HAL_GPIO_LockPin  D! q9 d0 I# \4 r
如果一个管脚的当前状态是1,读管脚值使用锁定,当这个管脚电平变化时保持锁定时的值,直到重置才改变
8 Z' p" O  S& b* b% n
  1. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
    ' ?& a2 D+ z9 \3 g7 N  T
  2. 例:
    ! @0 |8 n* S" p$ C/ A
  3. HAL_StatusTypeDef hal_State;
    , A: G+ c0 A9 |1 V
  4. hal_State = HAL_GPIO_LockPin(GPIOF, GPIO_PIN_9);4 ?( E7 m+ m7 H* h8 \4 v

  5. ; q/ O/ H! O# @% n8 R3 e+ Y
复制代码

! Z9 P' j6 t* m3 m, HHAL_GPIO_EXTI_IRQHandler1 W4 x2 b" j8 e9 H/ C- D8 x
这个函数是外部中断服务函数,用来响应外部中断的触发,函数实体里面有两个功能,1是清除中断标记位,2是调用下面要介绍的回调函数。实际调用的是下边的中断回调函数" r' `' O4 L7 A! F
  1. void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)! O9 ?1 X, B+ I8 G% h8 }$ X8 c5 ~) p
  2. 例:HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
复制代码
2 u; a& F, u0 h% a: `# B
HAL_GPIO_EXTI_Callback
4 I6 k& X3 U( ?中断回调函数,可以理解为中断函数具体要响应的动作。1 N9 {3 i# \* z: r
  1. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)' n0 j0 w6 h/ p( L. H
  2. 例:HAL_GPIO_EXTI_Callback(GPIO_Pin);
复制代码

! K$ ]2 G6 c: K& N7 a3 P# n
$ Z3 I3 l' d8 I& |4 ~( }9 M4.LED工程
1 {/ s7 |$ l5 p# f# y" f1.LED电路原理图
( \7 J% h3 g  ~6 k$ g# k$ m% _6 ]: V4 P& m! v5 B+ f7 \
20210424110119129.png

0 n0 E, A+ B; P$ o5 C/ J* @, N4 N( @$ c* F- ]% [
2.GPIO_PIN_SET与GPIO_PIN_RESET8 J$ h4 D' D4 ~+ V  O3 B
8 d1 \" \4 p3 h/ h& F; w9 b
  1. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
    0 G  H8 |1 q& [
  2. {# Y# x! N4 s9 A( H+ Q* u+ t+ S
  3.   /* Check the parameters */* W! U4 G! n, u' s/ L
  4.   assert_param(IS_GPIO_PIN(GPIO_Pin));
    , `5 b# z& D( ?6 ^6 V
  5.   assert_param(IS_GPIO_PIN_ACTION(PinState));
    & I) @. W& ^5 R  Y( k& I7 v
  6. 5 o, W- W4 I) H" {$ q
  7.   if (PinState != GPIO_PIN_RESET)' k7 F) q4 x% z/ K
  8.   {$ E: @4 C$ n" A' F: x# t' T+ j" ^
  9.     GPIOx->BSRR = (uint32_t)GPIO_Pin;//如果是GPIO_PIN_SET,则将GPIO的BSRR寄存器低16位置为GPIO_Pin3 ~6 P& U8 N0 K6 w. x
  10.   }
    . ~! B) y' p2 s5 u7 a$ t  }
  11.   else
    $ P# X: x! Z: a) `. G& Q
  12.   {
    9 c8 p) ~- [7 n# }# U5 \: K+ g
  13.     GPIOx->BSRR = (uint32_t)GPIO_Pin << 16 ;//如果是GPIO_PIN_RESET,则将GPIO的BSRR寄存器的高16位置为GPIO_Pin
    1 j& P1 G! b. n/ x) Z' W
  14.   }) B9 f& p1 Q" H/ U6 X7 S
  15. }
复制代码
, v" Q+ D+ {( E9 Z) @( ^6 D7 A& X  r" S
例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_SET,则GPIOA->BSRR=((uint32_t)0x0002U);即把二进制0000000000000010转换为32位数赋值给BSRR,对应的GPIO_Pin_1管脚置高;
9 f3 h( p( X8 `4 J% H
) D5 B; o% z' M& d9 A. a* O; c例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_RESET,则GPIOA->BSRR=((uint32_t)0x0002U<<16);即把二进制数0000000000000010左移16位并转换为32位数赋值给BSRR,高16位对应的GPIO_Pin_1为1,对应管脚被清零,置低;
3 n' d( C/ f* W! V, j( f& ?7 y% B/ m
3.锁存器
! ^( F8 O2 n6 I# A锁存使能(LE)输入和输出使能(OE)输入对于所有锁存器是公共的。+ f+ R4 B) l; r7 s  m& L

1 U7 N* m2 t, }  V2 y0 |- WLE为高电平时,Dn输入端的数据进入锁存器。 在这种情况下,锁存器是透明的,即每当其对应的D输入改变时,锁存器输出就改变状态;4 Y2 p8 Q& C7 r) D+ M
当LE为低电平时,锁存器将存在于D输入端的信息存储在LE的高电平至低电平转换之前的建立时间;
" _( ~. w4 |( t) X  {当OE为低电平时,8个锁存器的内容在输出端可用;
# @  g+ v& n9 ~+ a9 g当OE为高电平时,输出变为高阻态关闭状态。OE输入的操作不会影响锁存器的状态。& _  E! U. F  q8 e: u
4.用端口输出控制函数控制LED闪烁4 Q' s: a1 W& y- U: l
3 i% r2 m8 Q( T% q- @
  1.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET);                //端口输出控制函数,PC8端口输出高电平,使LD1熄灭
    ; q2 g: G  v& ~
  2.         HAL_Delay(300);8 u3 u) Y. J# V5 i
  3.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);        9 ?* L3 G- X& D* v9 z
  4.         HAL_Delay(300);
复制代码

2 h! R6 L$ ?% K# [1 y5.用端口输出翻转函数控制LED闪烁
% [& F7 |4 ^7 W  I* b. }# D/ Q
  1.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_8);    //端口输出翻转函数 1 P% y5 f8 U. Z, Y& z% {
  2.         HAL_Delay(300);
复制代码

0 {5 X# S' q" w6.使用锁存器
  1.         HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);                  //锁存器输出高电平
    # B3 I: W& p# ]! E6 Z; C3 r  M
  2.         HAL_GPIO_TogglePin(GPIOC,LD1_Pin);                   //端口输出翻转函数 7 j. B/ M8 F+ d# ~2 i+ t+ [5 l
  3.     HAL_Delay(300);
    1 m% z: q; H7 z: u/ v' i
  4.         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);                //锁存器输出低电平
复制代码
2 x+ H- v5 L6 @8 m* g& p$ g) b
7.LED跑马灯/ p' f+ {( Q' I+ T0 S! l3 F

3 s6 T1 c0 R+ w$ |$ [
  1. #define DELAY_TIME        100
    ; \) x4 b: z9 }9 ^4 J$ |. y  N
  2. void LED_test(void)" m/ v. Q* l6 O9 z
  3. {+ E9 Z$ E4 x; u; \
  4.            HAL_GPIO_TogglePin(GPIOC, LD1_Pin);
    ' h& V7 M: w7 c9 o* n* K2 k
  5.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);& a* s* F0 [$ L$ o+ J
  6.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    & S. P- _0 r: T: S3 |+ R$ Z2 D
  7.                 HAL_Delay(DELAY_TIME);3 u: y8 `4 {1 W8 l9 q& A
  8.                 $ l/ U* D. g8 s# \' ^
  9.                 HAL_GPIO_TogglePin(GPIOC, LD2_Pin);
    & Z2 u8 n" n$ R) ?" R
  10.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    ( C9 a- i" e- U, M
  11.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);7 s2 ~! V, Q3 X+ R7 K2 ~1 K4 I* R
  12.                 HAL_Delay(DELAY_TIME);
    . D2 h, }- z. B8 Z  |
  13.                 3 G2 q% h3 g: N5 \* n) a: p1 M. |1 {! p
  14.                 HAL_GPIO_TogglePin(GPIOC, LD3_Pin);
    4 x5 }) K  _6 u4 X  c
  15.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    % x4 Y8 h7 l4 V3 q
  16.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);7 F! X2 o' N9 Z4 c
  17.                 HAL_Delay(DELAY_TIME);
    ) _6 _$ L4 ~2 j5 C$ G# G" s& _( R
  18.                
    , G7 U' B3 |- [2 k$ b$ A
  19.                 HAL_GPIO_TogglePin(GPIOC, LD4_Pin);  J2 i1 D: C) y" k- l
  20.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);6 D( x6 s! p% H* f$ B
  21.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    ' l. E" m6 z4 @! H+ i$ X$ D& J
  22.                 HAL_Delay(DELAY_TIME);
    1 o2 _' L6 {1 e0 z& J+ H* r
  23.                
    # g8 t8 D5 ]- @' ?
  24.                 HAL_GPIO_TogglePin(GPIOC, LD5_Pin);& L+ d: C9 l  S0 v; ^  j7 L3 [
  25.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    & D3 F. z# I5 |9 z4 A5 U& A
  26.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);+ G  a1 o5 S* t
  27.                 HAL_Delay(DELAY_TIME);4 N! B& T4 v4 u  u8 G3 `- K! u
  28.                 ; z) l% _$ Y! V+ h5 g
  29.                 HAL_GPIO_TogglePin(GPIOC, LD6_Pin);
    ; u1 O3 O5 d- D7 V0 M1 q" c
  30.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    ( B1 Q% R% x+ S% m  S' A
  31.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    . n: H9 W! O- f& x
  32.                 HAL_Delay(DELAY_TIME);3 B( c3 r" B' z
  33.                 ; a% A3 @+ n" A& Q9 Y
  34.                 HAL_GPIO_TogglePin(GPIOC, LD7_Pin);
    9 M- s  ^/ b! s* {" C( t) _
  35.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    ( M( ~: F* {: o  _
  36.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);9 a; \4 \: z; Q
  37.                 HAL_Delay(DELAY_TIME);% v+ B4 E# x' E
  38.                 # E) u% F5 c$ e9 [5 J  _- x
  39.                 HAL_GPIO_TogglePin(GPIOC, LD8_Pin);( H% Z# u9 ]( C; Q3 I5 r
  40.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);/ Q; u! [* M* U4 F9 l
  41.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    / q3 ^1 x6 C4 ~; X9 f
  42.                 HAL_Delay(DELAY_TIME);        & e* _" w* e8 m# J4 R9 R% Z
  43. }
    3 ?3 a* k9 l3 a2 Z! o
  44. ) P* z; S3 q! b# w
复制代码

5 m4 k/ E) P! ^4 ?* \; }/ E
2 G$ Q$ i, r$ {; L$ Y3 ^3 J" W, {
收藏 评论0 发布时间:2021-12-8 22:00

举报

0个回答

所属标签

相似分享

官网相关资源

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