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

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

[复制链接]
STMCU小助手 发布时间:2021-11-13 00:01
1.使用keil5的注意事项
% c' z0 Y: P/ r* r% q& f" u用STM32Cube生成程序驱动后 将程序写到以下范围内,以程序保证用STM32Cube重新生成工程后不被删除 。
7 g& d; |. f3 B9 }+ ]
  1. /* USER CODE BEGIN 1 */     //代码开始! e7 Z2 Z) \3 M: x, u4 b

  2. ; P: `; m, ]7 o6 q* Y5 E
  3. /* USER CODE END 1 */                //代码结束
复制代码

: x5 s0 U; n4 T7 L/ J  R

2 D9 p1 e3 d8 o. P* L* ~6 ~3 M2.HAL库延时函数
' A9 W# D* F+ k! I" ~HAL库自带延时函数(毫秒,阻塞)
3 P& F# s4 u4 B: @
  1. HAL_Delay(x);
    * |9 U! K: ~1 x0 C
  2. 实际延时时间为(x+1)ms
复制代码
HAL库函数为了防止无意义延时(即0ms延时)的产生,在HAL_Delay函数传入参数之后会对参数加1。 如果使用HAL库默认延时函数进行延时,实际延时时间将会比预期时间多1ms。换句话说,HAL_Delay函数至少会产生1ms的延时。
- f: ^$ H8 R- {. ~
. C0 f  t2 w: Z; S1 p重新定义延时函数,非阻塞式延时" A! |; _& w0 a: m$ q" v8 ?
  1. void Delay_us(int16_t nus)
    : v4 f8 ?( r8 E; S) F& L
  2. {1 a3 [3 Z5 }' [% |; l6 Y
  3.   int32_t temp; ) [7 q& s$ w0 D' G* G, O; Z
  4.   SysTick->LOAD = nus*9; //72MHz2 K: Z9 I' m3 g3 V% F
  5.   SysTick->VAL=0X00;' v: u; S( A: N, Q, J0 d
  6.   SysTick->CTRL=0X01;
    ( r5 \: W: W" b
  7.   do ( a) e" D$ H3 d7 K
  8.   { 6 k% |/ O" E4 |% ~5 x* e
  9.     temp=SysTick->CTRL;$ E) m% T+ m' h2 U5 S
  10.   }
    ! m1 X9 I# V* t
  11.   while((temp&0x01)&&(!(temp&(1<<16))));+ N' `4 l4 x4 K
  12. 8 `7 O. ]3 G$ c# T
  13.   SysTick->CTRL=0x00;
    ( l) B& P' A) k2 A
  14.   SysTick->VAL =0X00; ) o2 E6 I) g+ w% T% S! q7 V( U& A
  15. }
    * n! w$ U5 y& y
复制代码

$ U2 e5 C- C$ C/ W+ n& F3.HAL库配置GPIO4 _; W0 p" `$ A# C- X# `( x
  1. void              HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init);1 ^: m  Y9 `% A4 K+ Z/ H$ s4 B
  2. void              HAL_GPIO_DeInit(GPIO_TypeDef  *GPIOx, uint32_t GPIO_Pin);6 n8 Z! g. ?4 [' y4 ~
  3. GPIO_PinState     HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);  //端口输入读取函数
    0 Q5 w) H/ }8 }9 Z  q
  4. void              HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); //端口输出控制函数$ A7 s+ n. R8 Q0 ~& N
  5. void              HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);  //端口输出翻转函数 ( L2 Z; ]) K7 [  L9 M9 u. _
  6. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);& w& _- H, a# e1 C  X# y6 M
  7. void              HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);
    0 ?4 p) v- }+ E9 k0 I
  8. void              HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
复制代码
解释:
: o" p& @- I1 W/ K& f8 j# A
9 F! x, M7 H2 K- A% r5 R5 \HAL_GPIO_Init4 s. L/ G0 L- b0 s
初始化我们需要用到的引脚的工作模式,包括具体引脚的工作速度、是否复用模式、上下拉等等参数。% ~' O; y) X% {' G2 }
  1. void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
复制代码

7 ?1 f" _" R4 n: u; C0 q/ `# YHAL_GPIO_DeInit
* r7 b# U% m, I4 I+ F, D将初始化之后的引脚恢复成默认的状态–各个寄存器复位时的值
+ `* c. g+ [: f* l
  1. void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)
    * P. D" r$ j/ R- v+ J6 Q! n
  2. 例:HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);
复制代码

5 v6 D5 v7 L; V) j, e+ IHAL_GPIO_ReadPin% Y& s9 D: [# m* f- S
读取我们想要知道的引脚的电平状态、函数返回值为0或1。, O) e; W- ~7 |6 {: d9 p
  1. GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)( C1 U! P0 e5 d  R8 P
  2. 例:pin_State = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_9);
复制代码
# g& E) f( A& M& K0 B5 D/ T  L9 h
HAL_GPIO_WritePin
( M, h% k1 T% f3 L7 W# Y7 ~给某个引脚写0或1,但是不要理解成,写1就是使能之类的意思,有些寄存器写1是擦除的意思* F6 X" a% u2 G8 A
  1. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
    ; @% X- @8 D& [9 ?6 J
  2. 例:HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9,GPIO_PIN_RESET)
复制代码

& ^) g/ [8 x! q9 d3 N' Q; _2 _HAL_GPIO_TogglePin
, K6 [& k3 K' k6 m! N! n6 H8 V翻转某个引脚的电平状态
* b+ |9 n1 ]) [2 `" [
  1. void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)9 `1 B6 o: X) {/ [5 [0 d
  2. 例:HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9);
复制代码

# O: o; e3 s) D- p* wHAL_GPIO_LockPin
) n4 [6 U) y1 x% x9 d$ d) H如果一个管脚的当前状态是1,读管脚值使用锁定,当这个管脚电平变化时保持锁定时的值,直到重置才改变: a2 `5 B1 s, m" g7 V$ R+ L
  1. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)' q# f& J7 Z0 s3 h1 k, y& g
  2. 例:; P5 C8 O5 c7 f9 z
  3. HAL_StatusTypeDef hal_State;% m( V/ p+ R- A
  4. hal_State = HAL_GPIO_LockPin(GPIOF, GPIO_PIN_9);
复制代码

% x1 u9 V( g4 {4 p9 x" c% A+ NHAL_GPIO_EXTI_IRQHandler' w: ^; M- ^" L
这个函数是外部中断服务函数,用来响应外部中断的触发,函数实体里面有两个功能,1是清除中断标记位,2是调用下面要介绍的回调函数。实际调用的是下边的中断回调函数
5 s6 ^9 P' n; i: W2 i  O0 M
  1. void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
    ( m  S' u; S+ Q3 N
  2. 例:HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
复制代码

1 C5 ]8 X9 Y! Z8 J3 f& _HAL_GPIO_EXTI_Callback
% ~6 K, Z5 M: e9 {中断回调函数,可以理解为中断函数具体要响应的动作。- `, D2 b! r7 C2 i3 d2 W
  1. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    0 Z# w7 j- Y5 j' l
  2. 例:HAL_GPIO_EXTI_Callback(GPIO_Pin);
复制代码
  s6 w, A& v/ {8 f# h8 t) B
4.LED工程, G$ x8 V* W9 u  a
1.LED电路原理图. _+ n0 _% q' i& I

! u) R$ `$ U( x4 G5 o
20210424110119129.png

+ K; O  x7 @, V/ X2 t% V( s, Y, y* @! `: ~8 t7 k
2.GPIO_PIN_SET与GPIO_PIN_RESET
; H& |4 F! g0 c
  1. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
    % E3 v5 s0 Q. S5 L8 M
  2. {
    ! V+ W( ^& K1 B; z
  3.   /* Check the parameters */
    6 T% B" q# ]- o6 _: L- N$ l6 z( Z
  4.   assert_param(IS_GPIO_PIN(GPIO_Pin));) z% _) m8 p( `3 x6 F# a) y, P% t4 ~
  5.   assert_param(IS_GPIO_PIN_ACTION(PinState));. C. h" g# y, g: z+ p: G

  6. 7 |* n4 o: z* {) Q' c7 k7 _
  7.   if (PinState != GPIO_PIN_RESET)
    0 O. v: e% B4 e0 n2 F/ |
  8.   {9 L( T! b  ~% b- a3 G: |& e
  9.     GPIOx->BSRR = (uint32_t)GPIO_Pin;//如果是GPIO_PIN_SET,则将GPIO的BSRR寄存器低16位置为GPIO_Pin% Q3 A9 c8 J0 b3 a: E6 j6 n, \2 A
  10.   }  J/ z  A( [1 u. [+ z1 C
  11.   else$ h* y% E( c2 [+ i# u! Q" D1 |
  12.   {& z8 {# E1 a5 P; A
  13.     GPIOx->BSRR = (uint32_t)GPIO_Pin << 16 ;//如果是GPIO_PIN_RESET,则将GPIO的BSRR寄存器的高16位置为GPIO_Pin) |& h7 A' U$ s1 \
  14.   }
    5 A4 @8 v6 p+ S/ E( c
  15. }
复制代码
# l1 @/ w5 b$ D. q1 j* A- b
例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_SET,则GPIOA->BSRR=((uint32_t)0x0002U);即把二进制0000000000000010转换为32位数赋值给BSRR,对应的GPIO_Pin_1管脚置高;& e/ a2 i% K" L3 e- E) P; S: `

& g2 s" h4 R6 I4 N例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_RESET,则GPIOA->BSRR=((uint32_t)0x0002U<<16);即把二进制数0000000000000010左移16位并转换为32位数赋值给BSRR,高16位对应的GPIO_Pin_1为1,对应管脚被清零,置低;
" Z) c  d& i5 @  L0 o6 a" P$ R
# \, c! e, m1 m" A3.锁存器
  U1 E. a) a7 F# C. o锁存使能(LE)输入和输出使能(OE)输入对于所有锁存器是公共的。
& P& Q* |8 h" h' w" ?- nLE为高电平时,Dn输入端的数据进入锁存器。 在这种情况下,锁存器是透明的,即每当其对应的D输入改变时,锁存器输出就改变状态;1 \8 Z" E/ l+ ]: G' ~% M
当LE为低电平时,锁存器将存在于D输入端的信息存储在LE的高电平至低电平转换之前的建立时间;( D! o' l/ @  H* L$ w9 x& G# f
当OE为低电平时,8个锁存器的内容在输出端可用;( q' _9 L; [6 |  }
当OE为高电平时,输出变为高阻态关闭状态。OE输入的操作不会影响锁存器的状态。
* ^6 S1 ^" u" V2 x
$ \* [, r9 t7 n' Z* K  m7 [6 P4.用端口输出控制函数控制LED闪烁: J) e& X" j( j: R
  1.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET);                //端口输出控制函数,PC8端口输出高电平,使LD1熄灭
    7 \; s/ n+ {* C7 W
  2.         HAL_Delay(300);
    1 @3 D3 j# U4 m& y
  3.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);        " K2 h$ e- [9 U9 C
  4.         HAL_Delay(300);
    5 `3 s" @; j3 s) [$ g4 }. i
复制代码

* {9 |, m  @/ Z5 U$ y& Z+ t: T7 c" z1 b: R* G
5.用端口输出翻转函数控制LED闪烁& v, d+ ^" t8 b" ?! m! b
  1.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_8);    //端口输出翻转函数
    4 G' r# d" [+ M' M; c
  2.         HAL_Delay(300);
复制代码
& {  d# O) m; Q9 J9 _/ ^0 t

' q. N3 A( ~+ s) w( H$ C" K6.使用锁存器
( l0 ^; j/ w5 L' S5 X& u
  1.         HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);                  //锁存器输出高电平4 X- ~% `& C% w4 C( o/ Y7 o
  2.         HAL_GPIO_TogglePin(GPIOC,LD1_Pin);                   //端口输出翻转函数 ! c8 t4 f( e1 Y. A- v
  3.     HAL_Delay(300);
    * b# g1 \9 X9 _5 p, ?6 b# m
  4.         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);                //锁存器输出低电平
复制代码

8 ^; p! d2 o8 R3 _" r7.LED跑马灯' t( p- u7 p" P( L9 q
  1. #define DELAY_TIME        100
    5 x; w* V4 O4 C' t7 S
  2. void LED_test(void), a. B% b" Z, \3 k, h9 A
  3. {) b- ?) h2 J# G3 M" H' S
  4.            HAL_GPIO_TogglePin(GPIOC, LD1_Pin);
      E4 f# B6 I, B" b
  5.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    * \+ F' u" E, f  f6 g6 O% ^* v
  6.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    0 w& F2 ~$ S3 k) \- r4 o9 I% Y! i
  7.                 HAL_Delay(DELAY_TIME);
    ! E% W1 a; o+ M) h5 D
  8.                
    6 A' |3 I' _  O; t
  9.                 HAL_GPIO_TogglePin(GPIOC, LD2_Pin);" ?( l6 F. |7 h3 \) P( g; P
  10.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    ) @1 C" l9 G# f
  11.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    ; F: ~% Y' H. l) `
  12.                 HAL_Delay(DELAY_TIME);
    8 H- v. F7 r3 g0 k
  13.                
    6 q/ l2 W, f8 w) I
  14.                 HAL_GPIO_TogglePin(GPIOC, LD3_Pin);* R( _( k2 L: F4 r3 N# s
  15.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    9 r6 c' \1 l( _6 Z8 m4 c
  16.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);! B; U' t( R8 L# J8 e8 {3 D
  17.                 HAL_Delay(DELAY_TIME);
    ! V+ B0 P" s3 D
  18.                
    ; b+ k( }. T' _7 h. M$ U5 n
  19.                 HAL_GPIO_TogglePin(GPIOC, LD4_Pin);
    ! r: ^4 A) X* y/ Q  c8 }# [
  20.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    % S! I. l) @0 o4 v3 r1 v1 I/ p" [
  21.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);5 }+ i6 R' z& w( l9 L# B
  22.                 HAL_Delay(DELAY_TIME);" P6 y0 N1 W8 M
  23.                 ' @* o" v$ t/ d  s8 h
  24.                 HAL_GPIO_TogglePin(GPIOC, LD5_Pin);% k* F- n$ w* ?' w$ T+ x
  25.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    ! z5 b, V+ z" ~: u+ }; v
  26.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);" M8 p" p4 E( W; m6 z2 L
  27.                 HAL_Delay(DELAY_TIME);9 i6 F! `2 z1 O
  28.                 ( O5 y8 p3 M4 _
  29.                 HAL_GPIO_TogglePin(GPIOC, LD6_Pin);
    , [2 j8 X; [+ W  w
  30.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    % V3 D  f+ G( y+ z1 e. Z) i3 G
  31.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    + s& U6 x9 ~9 X' X, ~$ k( P
  32.                 HAL_Delay(DELAY_TIME);
    2 w4 S0 L, r5 z
  33.                
    ) ]- E% G) M% [. n# r( ~- I! }* l  Y
  34.                 HAL_GPIO_TogglePin(GPIOC, LD7_Pin);% W* O$ F' k, U1 m) B# D
  35.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    % @' j, Q; s+ Q+ s# Q8 x$ I
  36.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);2 x4 X. ?2 }4 P
  37.                 HAL_Delay(DELAY_TIME);
    / s2 z, _* L6 p3 X+ p- @
  38.                
    . N6 T* g& {/ K* w
  39.                 HAL_GPIO_TogglePin(GPIOC, LD8_Pin);
    - A; I: a0 G' ?6 M4 d( U
  40.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);* h0 C& ?7 V7 M# Y4 Z" s
  41.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    & N1 l0 z$ E4 ]( C5 V% p3 L, q$ x
  42.                 HAL_Delay(DELAY_TIME);        8 ~, D; z! h+ M
  43. }
    % f" x3 Y- z1 z* L6 K
复制代码

8 q+ U4 N# b8 {2 ]9 Q. }) y( k7 Q% }/ I# X3 |- k
4 d$ V7 ]9 d1 Z7 j, z6 g
收藏 评论0 发布时间:2021-11-13 00:01

举报

0个回答

所属标签

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