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

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

[复制链接]
STMCU小助手 发布时间:2021-12-8 22:00
1.使用keil5的注意事项
- u- O) b; U. U. \, E  `用STM32Cube生成程序驱动后 将程序写到以下范围内,以程序保证用STM32Cube重新生成工程后不被删除 。6 J: }( ~9 H! K
  1. /* USER CODE BEGIN 1 */     //代码开始
    , l6 W4 v/ X5 g3 p0 j# S

  2. ; z% c* {0 W: Y  u+ L  d% U
  3. /* USER CODE END 1 */                //代码结束
复制代码

6 d8 p; v" U. Y* E/ [8 _7 `2.HAL库延时函数
3 p& ?) a& u- g& r$ o1、HAL库自带延时函数(毫秒,阻塞)
. A- d, {% X. H# A9 i  J: H- a
  1. HAL_Delay(x);
    5 u8 {. X  v, u$ j5 [
  2. 实际延时时间为(x+1)ms
复制代码

, D7 X$ l; D: T( h8 v; I) x. E: t% Y- ~HAL库函数为了防止无意义延时(即0ms延时)的产生,在HAL_Delay函数传入参数之后会对参数加1。 如果使用HAL库默认延时函数进行延时,实际延时时间将会比预期时间多1ms。换句话说,HAL_Delay函数至少会产生1ms的延时。
. }% X7 c* F. W/ [; u. K. f9 N% c& q" _
2、重新定义延时函数,非阻塞式延时
5 S/ b$ N7 X4 Q" G% a8 c0 w
  1. void Delay_us(int16_t nus) 6 X5 V& V7 [0 x$ W6 o' \0 w
  2. {
    - P& i- G( {" m, @! N
  3.   int32_t temp; $ }, w- K; c* {8 R& ?! z( x
  4.   SysTick->LOAD = nus*9; //72MHz
    4 c) m5 e) a. i) \( D
  5.   SysTick->VAL=0X00;
    7 `0 K* }2 j0 K
  6.   SysTick->CTRL=0X01;
    4 K; k, \! G9 i* m" b
  7.   do - T0 U, U0 T( J4 n6 `  C
  8.   { / F. R& W0 q2 ~# j1 e( V: Z' {
  9.     temp=SysTick->CTRL;$ h! A; `5 D6 v& s1 S
  10.   }
    3 P2 `7 q& A$ S* A. ~0 r
  11.   while((temp&0x01)&&(!(temp&(1<<16))));0 c0 R8 Q1 O" l9 j
  12. # n& F. [" h! F! X) i# _( V
  13.   SysTick->CTRL=0x00; $ ?* N1 B# O7 G+ J# w) R. p
  14.   SysTick->VAL =0X00;
    % R1 N7 F* M! a' T* y
  15. }5 n% S8 ?7 i! P& Q- L: c
复制代码
1 J, m; s) W+ A( [& k: m
3.HAL库配置GPIO1 v1 C; E0 c; |5 ~5 ]$ _# k* X
  1. void              HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init);1 N  B7 [- z# g6 z) B9 y- ]1 t
  2. void              HAL_GPIO_DeInit(GPIO_TypeDef  *GPIOx, uint32_t GPIO_Pin);1 O! Y+ c. }# l. {* p1 i# j# x
  3. GPIO_PinState     HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);  //端口输入读取函数/ m0 M, e: N/ {; [5 J
  4. void              HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); //端口输出控制函数
    8 p5 c; O! K1 @/ _2 Y# @
  5. void              HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);  //端口输出翻转函数
    4 X- @0 R, F$ w8 _% C2 Z" m/ r
  6. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
    2 O" [/ `* P* z7 x) b8 A
  7. void              HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);
    ( V: R7 e& N2 a6 U
  8. void              HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
复制代码

. ]. F' ~2 A' y& H解释:
! f$ R$ e; }5 n" ?& ]0 \5 S- a  |
HAL_GPIO_Init; H7 W$ D3 y  d# f- g! P
初始化我们需要用到的引脚的工作模式,包括具体引脚的工作速度、是否复用模式、上下拉等等参数。
! V( O" ?5 z; V% K1 S/ Q
  1. void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
复制代码
. z8 X: c5 \7 r' J/ O& _& F
HAL_GPIO_DeInit& Y4 b/ h! L* M* e: y+ F- C
将初始化之后的引脚恢复成默认的状态–各个寄存器复位时的值
1 F; ~6 z$ L' W3 @4 N* o/ L
  1. void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)
    9 z  f. y8 C/ v, t* ]" U# }% ]! ?
  2. 例:HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);
复制代码

; P" ]! Q3 e" |8 m( P; ^+ {HAL_GPIO_ReadPin
' k/ ]7 r; z$ R( S2 o/ I读取我们想要知道的引脚的电平状态、函数返回值为0或1。
- _% r; P7 y( |) H! m( y
  1. GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin), q" u5 }* R9 j
  2. 例:pin_State = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_9);
复制代码
; {4 v' _$ b% j( H5 G  d+ g
HAL_GPIO_WritePin
% c/ ?' W% t4 ^8 f! b' L7 T给某个引脚写0或1,但是不要理解成,写1就是使能之类的意思,有些寄存器写1是擦除的意思
" Y; w( w1 D; }3 ~; H/ M9 L# g) ]
  1. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
    ' |7 h, S/ m' w0 i7 q* m8 `
  2. 例:HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9,GPIO_PIN_RESET)
复制代码
  [* s' n$ k% J
HAL_GPIO_TogglePin
+ a. B+ y. ^; |. W3 F8 j翻转某个引脚的电平状态' d8 v9 P3 p& x/ G& o
  1. void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin), \( Z! K! Q1 O- Z3 f3 `9 y7 \
  2. 例:HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9);
复制代码
1 L8 h1 r) m. B
HAL_GPIO_LockPin
6 H" G8 q8 B2 m$ E如果一个管脚的当前状态是1,读管脚值使用锁定,当这个管脚电平变化时保持锁定时的值,直到重置才改变$ B2 K/ H9 K6 Z$ [, T
  1. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin). P+ W5 @: ?1 l' s
  2. 例:7 r- G% n7 Q8 `. V; R
  3. HAL_StatusTypeDef hal_State;, e+ [3 F# `$ ^  q
  4. hal_State = HAL_GPIO_LockPin(GPIOF, GPIO_PIN_9);2 f# `" k4 |" H# n% V( |) c
  5. ' ~+ Q! p2 j  c% [( C1 ~, v
复制代码
: w0 |8 K2 U+ c# F; f9 h6 X1 J- j7 ^
HAL_GPIO_EXTI_IRQHandler/ t3 r3 P# q+ [8 H2 T/ p0 B9 |
这个函数是外部中断服务函数,用来响应外部中断的触发,函数实体里面有两个功能,1是清除中断标记位,2是调用下面要介绍的回调函数。实际调用的是下边的中断回调函数+ i2 b+ r; S- h# ^, y5 }$ E% p2 v5 I
  1. void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
    , E' ^( f) \: m& r+ L, s) n
  2. 例:HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
复制代码
( Z# C9 O6 g9 f
HAL_GPIO_EXTI_Callback
# D$ X! L9 F9 e中断回调函数,可以理解为中断函数具体要响应的动作。
3 O) C, o( d" ]6 ], T
  1. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    - x. ]5 d& M0 O
  2. 例:HAL_GPIO_EXTI_Callback(GPIO_Pin);
复制代码
" o; W3 E7 M* `! @$ p

4 u/ A; N( A/ [7 J* B' Q0 }& N$ b4 E4.LED工程
# K  P* ^2 K. K8 r" z  ~& m1.LED电路原理图: y& \! f, \, A/ o# n4 ~

) s7 p' C6 ]% @! g$ `- O( J6 n
20210424110119129.png

4 d( [& O( J4 G! X" O& w2 H+ q. }6 U- }) }( h
2.GPIO_PIN_SET与GPIO_PIN_RESET
( ]& @' q+ Z, @1 q  \. l+ Q1 I3 \1 {* k" C
  1. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
    , m! W' W& z9 @8 U) j
  2. {" A; w+ o2 b# E  n! i
  3.   /* Check the parameters */
    9 d6 S& Q7 Q( ]- c& B
  4.   assert_param(IS_GPIO_PIN(GPIO_Pin));2 i& ^! W: A& u) O& [& x
  5.   assert_param(IS_GPIO_PIN_ACTION(PinState));$ y" ~; ~' _  W

  6. - v7 z: e6 E# a1 H# i$ g
  7.   if (PinState != GPIO_PIN_RESET)
    , g4 y8 V3 o! `; w% Y0 L0 G! u
  8.   {9 _" R5 r+ S8 o4 S+ ~6 Y6 P
  9.     GPIOx->BSRR = (uint32_t)GPIO_Pin;//如果是GPIO_PIN_SET,则将GPIO的BSRR寄存器低16位置为GPIO_Pin
    * N3 }( g- q& \
  10.   }3 d; F! `$ T5 Q- e0 N* N5 O" T' h& N" i
  11.   else- p6 n, R; ?; \6 f7 o
  12.   {0 x/ o1 A- H* ~4 Q9 L7 `
  13.     GPIOx->BSRR = (uint32_t)GPIO_Pin << 16 ;//如果是GPIO_PIN_RESET,则将GPIO的BSRR寄存器的高16位置为GPIO_Pin' ~% ?) N- T  m' ^2 x6 u" Q
  14.   }4 j  N# {2 N! R
  15. }
复制代码
+ y. @& F5 @4 m% S. J% a' k
例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_SET,则GPIOA->BSRR=((uint32_t)0x0002U);即把二进制0000000000000010转换为32位数赋值给BSRR,对应的GPIO_Pin_1管脚置高;
5 J, X, x  E  M& w
8 i/ `' f# K4 W) w8 m  r0 }( d例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_RESET,则GPIOA->BSRR=((uint32_t)0x0002U<<16);即把二进制数0000000000000010左移16位并转换为32位数赋值给BSRR,高16位对应的GPIO_Pin_1为1,对应管脚被清零,置低;1 q' x) a( T' g5 U/ F& E8 ?- B4 w
4 q5 L% |+ H( |4 n- v: a
3.锁存器
; _% ~# D6 ]& T  w1 z锁存使能(LE)输入和输出使能(OE)输入对于所有锁存器是公共的。
0 t! r5 I0 y- _) Z5 E6 W3 L) n
$ X* F9 l# k7 t5 cLE为高电平时,Dn输入端的数据进入锁存器。 在这种情况下,锁存器是透明的,即每当其对应的D输入改变时,锁存器输出就改变状态;7 u3 R7 W8 q4 f6 F& Q9 v
当LE为低电平时,锁存器将存在于D输入端的信息存储在LE的高电平至低电平转换之前的建立时间;$ z( D. v% u4 b& d. ^
当OE为低电平时,8个锁存器的内容在输出端可用;
5 ]2 J: \0 l0 f' |$ w8 P当OE为高电平时,输出变为高阻态关闭状态。OE输入的操作不会影响锁存器的状态。1 K3 S. W6 [% I+ j- R& h
4.用端口输出控制函数控制LED闪烁9 o/ U% J1 E% F# |* T
, q7 G+ \8 |; S  b9 q; ~  v
  1.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET);                //端口输出控制函数,PC8端口输出高电平,使LD1熄灭# ]& a5 A4 h3 @3 z, L$ U: _
  2.         HAL_Delay(300);
    8 Y) s. p2 v/ m) I
  3.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);        7 x- k4 u( @; l( [4 T7 p
  4.         HAL_Delay(300);
复制代码
0 E! a. f0 }; ?$ F/ U# R8 m: v1 U1 f
5.用端口输出翻转函数控制LED闪烁
. l. u! U/ {: l& W% n8 [
  1.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_8);    //端口输出翻转函数 % o+ F3 b7 V% |, ], M$ K2 T
  2.         HAL_Delay(300);
复制代码
; x/ u( h2 D. I: a
6.使用锁存器
  1.         HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);                  //锁存器输出高电平" X1 z, \0 _7 U5 Q/ s% t
  2.         HAL_GPIO_TogglePin(GPIOC,LD1_Pin);                   //端口输出翻转函数
    , f: k: K6 _+ K4 Y) c( J  n# Y
  3.     HAL_Delay(300);+ X3 j* n9 g3 q. T2 K  ^
  4.         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);                //锁存器输出低电平
复制代码
1 s9 K" v3 Q& I, r
7.LED跑马灯8 K" C( g  {/ s* _
2 C3 F6 M. L+ g! h. w
  1. #define DELAY_TIME        100
      m2 J: Q# I0 P6 N9 `. h5 B+ i
  2. void LED_test(void)
    1 Q- F6 h. C; q
  3. {# s1 ~5 _" S5 X" M: _
  4.            HAL_GPIO_TogglePin(GPIOC, LD1_Pin);
    / I4 c  x. K6 B, }/ \
  5.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    7 q- h' G6 e3 @, p4 m8 i+ \7 D4 C
  6.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    - u$ Q( j4 G: ?
  7.                 HAL_Delay(DELAY_TIME);% f: U' J  L$ h+ I1 T, L9 k! [
  8.                 * _, [2 \0 L) [  s( R8 |: t
  9.                 HAL_GPIO_TogglePin(GPIOC, LD2_Pin);
    ( ^* U: g" `: n/ K: F* Q9 s, u
  10.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    ' f- y, V( o$ _* z( h; j
  11.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    ! ~. Y* V/ r+ S6 [0 h) X
  12.                 HAL_Delay(DELAY_TIME);: {/ j/ Y- A  p" ~
  13.                
    6 @2 d! }2 S6 S8 V1 \+ ^
  14.                 HAL_GPIO_TogglePin(GPIOC, LD3_Pin);
    . f6 ]4 T+ K+ I, S/ O
  15.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);: B0 p2 D6 P& \; E" `. Y6 F* z
  16.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    ! i" v4 K& d6 [8 A3 \0 U
  17.                 HAL_Delay(DELAY_TIME);
    # s# B" L4 W1 ?. U
  18.                 * |- v3 f+ R9 z6 @3 {
  19.                 HAL_GPIO_TogglePin(GPIOC, LD4_Pin);
    ) s2 z2 \# q& y
  20.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    " b0 B/ k+ X3 K5 t# S0 V
  21.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    ' \  o; M+ E$ r1 W! U; s
  22.                 HAL_Delay(DELAY_TIME);
    , J4 U+ c3 g9 t
  23.                 ! g  }) K8 y) F5 W" x
  24.                 HAL_GPIO_TogglePin(GPIOC, LD5_Pin);+ C, v/ ^$ w3 \1 R3 H
  25.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);- `$ [: u: d% u9 F: F0 |- x
  26.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);; j+ ?8 D3 r1 Z2 G% |9 J2 _
  27.                 HAL_Delay(DELAY_TIME);
    1 r" p5 E3 m, I1 f7 S: R  j7 H- T9 T
  28.                 9 B! F- b) }  _0 F/ _
  29.                 HAL_GPIO_TogglePin(GPIOC, LD6_Pin);1 @! D1 {) O6 e3 b9 |
  30.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);  N; A/ O7 K5 u7 O& m
  31.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);3 V! B9 y6 V0 b) M! m) p
  32.                 HAL_Delay(DELAY_TIME);9 r3 B7 w9 B% F$ [; x4 u
  33.                
    * Y8 D/ b% o6 z' V  H# k0 Z* e
  34.                 HAL_GPIO_TogglePin(GPIOC, LD7_Pin);9 }9 c+ @  }/ a8 g9 z
  35.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    ( }8 f- l0 B) t- a) m4 M
  36.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    2 H. M/ A, ^6 |/ q7 o
  37.                 HAL_Delay(DELAY_TIME);
    / ^5 a2 w' b* ?# z( A5 s
  38.                 $ n6 s: Z+ I6 O! P
  39.                 HAL_GPIO_TogglePin(GPIOC, LD8_Pin);
    5 Y& j' W  Z/ n' Z! I1 {
  40.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);9 F) u: y1 n' S$ b: n
  41.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);- H+ l2 c, ]% J( J  Z+ Q1 B
  42.                 HAL_Delay(DELAY_TIME);        
    : b# [5 }$ Q9 }5 h' U- m+ V+ ]
  43. }0 Y* |* Q. O; w2 O8 K4 x
  44. 1 p: B% `! i. U/ F4 _
复制代码
9 L* L6 V5 D1 O, O5 {

; ?3 o5 j. v. t( k
收藏 评论0 发布时间:2021-12-8 22:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版