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

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

[复制链接]
STMCU小助手 发布时间:2021-11-13 00:01
1.使用keil5的注意事项! Z* I0 [" E& G6 x
用STM32Cube生成程序驱动后 将程序写到以下范围内,以程序保证用STM32Cube重新生成工程后不被删除 。
) f0 w; L# y8 q/ U% ?) M# _
  1. /* USER CODE BEGIN 1 */     //代码开始  o/ M! i# a7 F* Y

  2. 9 C+ r8 Z! d0 v7 F& ~1 ?$ t  ^
  3. /* USER CODE END 1 */                //代码结束
复制代码
; X7 z0 b/ }6 E. W3 |+ R
( E1 `7 D8 C& v3 u: g# b# B3 X
2.HAL库延时函数
: _9 X* ~0 e1 v' Y. O4 x6 |HAL库自带延时函数(毫秒,阻塞)
  U+ h) e; n( a. ^( I
  1. HAL_Delay(x);( W0 g7 |9 ^* I: r. S$ @
  2. 实际延时时间为(x+1)ms
复制代码
HAL库函数为了防止无意义延时(即0ms延时)的产生,在HAL_Delay函数传入参数之后会对参数加1。 如果使用HAL库默认延时函数进行延时,实际延时时间将会比预期时间多1ms。换句话说,HAL_Delay函数至少会产生1ms的延时。
- K( z6 Z. f, x: O" q1 W9 ]0 [0 ~( G: f- e2 k9 z- h
重新定义延时函数,非阻塞式延时
+ f- ?( L3 t0 ?+ k! H. ]/ D
  1. void Delay_us(int16_t nus) 0 u9 ^+ u" J, U
  2. {5 E' \4 B/ g& Y3 V  M6 }
  3.   int32_t temp;
    * R1 m: D! m7 v) t& B4 K  d3 ]
  4.   SysTick->LOAD = nus*9; //72MHz  ?# |5 {( P5 l% Z
  5.   SysTick->VAL=0X00;
    + V% ]' f: M' b; V% T. I3 X# W7 u* _( w
  6.   SysTick->CTRL=0X01;
    ) I3 m) |& z4 g% v4 B' v4 \5 N
  7.   do ' b) s+ X' X4 v( Y
  8.   {
    1 Y7 s% V' p2 `
  9.     temp=SysTick->CTRL;, H0 k( _1 s4 Z; N
  10.   }, t8 [( ?4 I% v, f: g
  11.   while((temp&0x01)&&(!(temp&(1<<16))));
    # B) M; N' c5 c8 M, O
  12. : P4 \$ H, L1 L5 ~8 E9 ?+ c
  13.   SysTick->CTRL=0x00; # t* J! W' O6 L# e/ B8 s' `5 G
  14.   SysTick->VAL =0X00;
    $ M2 T. H* n! }% i. b6 f
  15. }
    % y. H6 T9 K! G$ |( y0 e4 q
复制代码
" H" X/ ^& e, _1 g9 Z9 s; [. p. g
3.HAL库配置GPIO
6 `4 H5 q4 c: J5 g
  1. void              HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init);
    1 X9 o  j+ i- E! P7 p7 t! v
  2. void              HAL_GPIO_DeInit(GPIO_TypeDef  *GPIOx, uint32_t GPIO_Pin);& T3 p& i5 Y8 t  d6 @
  3. GPIO_PinState     HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);  //端口输入读取函数# j0 k$ a' a- h# D
  4. void              HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); //端口输出控制函数9 k' _+ L3 Y7 R, c# @# u* V
  5. void              HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);  //端口输出翻转函数
    + J& {' R" Z5 u1 d/ [5 w, H
  6. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
    & F" ]' s5 g1 W% g' i8 Z
  7. void              HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);
      B4 V. g# r' j0 j+ D
  8. void              HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
复制代码
解释:0 \* u8 p: j. p: j  M, Y

- w* m) ?7 n: n9 m9 lHAL_GPIO_Init
+ P+ G$ G8 p% B3 l7 `1 K0 b初始化我们需要用到的引脚的工作模式,包括具体引脚的工作速度、是否复用模式、上下拉等等参数。
9 y" [+ Z5 H: I' r
  1. void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
复制代码
" t5 V5 F" ?5 u
HAL_GPIO_DeInit1 ?  e2 B! r& Q# Y" {% j" s6 |
将初始化之后的引脚恢复成默认的状态–各个寄存器复位时的值
/ E6 D( T+ G0 ?3 c* B7 ~% G
  1. void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)4 \. `8 _& K" i8 {. \3 E+ s; }8 @
  2. 例:HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);
复制代码
$ D# R  }' ^8 E9 d2 Q
HAL_GPIO_ReadPin
( O6 D+ l) A2 d+ e2 P读取我们想要知道的引脚的电平状态、函数返回值为0或1。
4 v& Y& F# [  W& D' I; H# C
  1. GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)9 N# g' _4 Y* Q1 D# E* h" r
  2. 例:pin_State = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_9);
复制代码

' j# x, e* \: C; _HAL_GPIO_WritePin
; X: Z+ T7 \% C9 }4 B! N, _3 b给某个引脚写0或1,但是不要理解成,写1就是使能之类的意思,有些寄存器写1是擦除的意思
7 D& }6 o4 \5 X9 T4 m
  1. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState), x' m% N( B1 {' l: B+ A2 ?, _
  2. 例:HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9,GPIO_PIN_RESET)
复制代码

4 c  n5 O5 [1 W4 t( H7 Q* jHAL_GPIO_TogglePin0 |6 Z) ]) b$ `% h  ~- z
翻转某个引脚的电平状态
1 j* ^! g; C2 M4 C/ ?7 M
  1. void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
    3 L6 h; b+ T+ `- N7 Q( |9 l& S; w
  2. 例:HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9);
复制代码

4 i0 C3 V) P0 `& MHAL_GPIO_LockPin1 O) [7 \; Y* N4 ?2 H
如果一个管脚的当前状态是1,读管脚值使用锁定,当这个管脚电平变化时保持锁定时的值,直到重置才改变& j5 |; f6 e" @7 ]. X7 I7 F8 b1 u, a
  1. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
    : Q: w6 J7 F0 b
  2. 例:& [6 Z. ~- J+ n% z1 n5 M: J" `. I
  3. HAL_StatusTypeDef hal_State;9 L5 C* |" U$ b+ F, r0 ?
  4. hal_State = HAL_GPIO_LockPin(GPIOF, GPIO_PIN_9);
复制代码

# G: T- J- ]1 |* A3 d( ]/ |HAL_GPIO_EXTI_IRQHandler( c6 D0 o: K. a8 D  j
这个函数是外部中断服务函数,用来响应外部中断的触发,函数实体里面有两个功能,1是清除中断标记位,2是调用下面要介绍的回调函数。实际调用的是下边的中断回调函数
7 V* Y5 n7 t* f
  1. void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)$ i2 z2 c, {# F* `( X& I$ N1 g/ N
  2. 例:HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
复制代码
+ X' L3 C5 B' ~$ H. m% d6 Q
HAL_GPIO_EXTI_Callback$ ?3 `8 P$ X% e; S
中断回调函数,可以理解为中断函数具体要响应的动作。
% c+ S; T  e; b& b/ q
  1. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin): ^# w1 z2 ^: f+ |1 H4 x
  2. 例:HAL_GPIO_EXTI_Callback(GPIO_Pin);
复制代码

4 G# W% T* S5 {/ w( u3 }* j# o: p4.LED工程2 H) H- F: X1 P! T- ^; a* c
1.LED电路原理图& i* |$ y. [2 Y# X- ?* X

4 B* U% }" m/ l3 u1 H
20210424110119129.png
4 L/ f+ e/ i. _" X5 H& f

3 z* \( K. p" B. @9 m. j, @+ B2.GPIO_PIN_SET与GPIO_PIN_RESET
2 I$ y+ j7 J7 R  X
  1. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
    ; z, L: |, |4 u
  2. {
    & N2 l/ K8 z- G. ^2 z1 ?$ Q
  3.   /* Check the parameters */
    1 J& O2 P  M, B  c; T
  4.   assert_param(IS_GPIO_PIN(GPIO_Pin));, H; u: |( E0 X0 b6 B4 l
  5.   assert_param(IS_GPIO_PIN_ACTION(PinState));
    4 P6 Z: r# A6 o# m# D! D

  6. , x- C9 \% f6 \' k5 t
  7.   if (PinState != GPIO_PIN_RESET), q: h0 ]9 `/ f/ q+ ^4 n) y
  8.   {
    2 y1 Z6 j& K* w# b
  9.     GPIOx->BSRR = (uint32_t)GPIO_Pin;//如果是GPIO_PIN_SET,则将GPIO的BSRR寄存器低16位置为GPIO_Pin: ^" O& a9 {% m' ]. N3 U4 O
  10.   }
    % O9 o- d: }# o% H/ R
  11.   else
    7 v* l, ^9 N% b  S6 D
  12.   {5 C1 ^/ h" J( N& O- Q4 Y- F
  13.     GPIOx->BSRR = (uint32_t)GPIO_Pin << 16 ;//如果是GPIO_PIN_RESET,则将GPIO的BSRR寄存器的高16位置为GPIO_Pin  |/ K* \2 a/ Z% I/ f9 _
  14.   }
    ( Z! {3 A; L- X
  15. }
复制代码
" j: T! `! o- i) e! W. U# `
例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_SET,则GPIOA->BSRR=((uint32_t)0x0002U);即把二进制0000000000000010转换为32位数赋值给BSRR,对应的GPIO_Pin_1管脚置高;
' N( s! g. C7 J* x# w2 f$ `0 @9 m% V- p! K. R
例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_RESET,则GPIOA->BSRR=((uint32_t)0x0002U<<16);即把二进制数0000000000000010左移16位并转换为32位数赋值给BSRR,高16位对应的GPIO_Pin_1为1,对应管脚被清零,置低;$ d  M3 ~, w9 D& |& m
. I7 `0 x* F$ w" G
3.锁存器
: Y% p: ~; S) i锁存使能(LE)输入和输出使能(OE)输入对于所有锁存器是公共的。
: K1 D" m6 \+ B1 kLE为高电平时,Dn输入端的数据进入锁存器。 在这种情况下,锁存器是透明的,即每当其对应的D输入改变时,锁存器输出就改变状态;
+ N2 A& M# K1 T$ ]: c( u3 n当LE为低电平时,锁存器将存在于D输入端的信息存储在LE的高电平至低电平转换之前的建立时间;
1 Z) y& O7 n3 f! _) q当OE为低电平时,8个锁存器的内容在输出端可用;
" N! ]* R2 h8 R- L" q( t7 }% y4 w! j当OE为高电平时,输出变为高阻态关闭状态。OE输入的操作不会影响锁存器的状态。2 R1 z+ y/ H, {/ _0 J. Z, T
1 p) I) L4 y; n; z# f
4.用端口输出控制函数控制LED闪烁
# J+ d  f1 e  R, P: g
  1.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET);                //端口输出控制函数,PC8端口输出高电平,使LD1熄灭  l  }8 K. f  j' T
  2.         HAL_Delay(300);$ B- k* d% U5 p3 P. K& E0 I
  3.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);          P) U$ N  j, P& u0 U
  4.         HAL_Delay(300);' q* u6 @& B+ o2 a/ U& _
复制代码
! o) |" m( g& {  l0 |# j7 a

- E- p4 m- H! G+ [5.用端口输出翻转函数控制LED闪烁
0 B2 i$ B) ?" h5 h: B3 D0 A, N4 \
  1.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_8);    //端口输出翻转函数 & R+ d3 e: N( B6 `$ _
  2.         HAL_Delay(300);
复制代码

% Y6 h3 y3 S3 Y  _1 {; P
- M7 H. P6 X1 Z- C% N, y6.使用锁存器
* X% a% n6 ~& m; W1 @/ D
  1.         HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);                  //锁存器输出高电平# c6 O$ g) U' ]- w$ |- l- H  F
  2.         HAL_GPIO_TogglePin(GPIOC,LD1_Pin);                   //端口输出翻转函数 : N4 E! [/ n8 d# C* Z, W2 Z) l
  3.     HAL_Delay(300);
    + _* o' s2 z- j7 @( h! f
  4.         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);                //锁存器输出低电平
复制代码

) l; ~* r. }+ \/ l/ }$ i! H/ k# e7.LED跑马灯
, s# t6 ~% _6 g( k! F7 O
  1. #define DELAY_TIME        100
    ! @* J) y2 H' U& B: M
  2. void LED_test(void)& f0 N- t4 H/ q2 w1 P3 w+ c
  3. {6 {: r8 T2 Y5 X
  4.            HAL_GPIO_TogglePin(GPIOC, LD1_Pin);# W- w" I4 K2 J6 Z0 h+ V9 d
  5.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);) m/ F' B" g% X' J6 `$ U2 @
  6.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);# g9 H0 A; S6 G9 \5 ^
  7.                 HAL_Delay(DELAY_TIME);+ v, P5 C0 s3 X4 e  Z) ]
  8.                
    $ H& w7 g8 M+ ^, c3 i
  9.                 HAL_GPIO_TogglePin(GPIOC, LD2_Pin);1 D5 l( w* C; D
  10.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);4 ~/ ?" ^% f8 h& l
  11.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);$ q- ?3 V- w9 g0 `# x3 e" D
  12.                 HAL_Delay(DELAY_TIME);3 a/ Q0 {: f# A" ~, i
  13.                 * {, V3 E$ r' X4 ~% H* Y
  14.                 HAL_GPIO_TogglePin(GPIOC, LD3_Pin);! E8 w% H6 |) A! r' |, V1 u
  15.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);8 P  d' _( s  T' _2 w
  16.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    ( e' Z5 M' I2 q, {5 ]
  17.                 HAL_Delay(DELAY_TIME);1 }4 M& z! M9 \: r+ s/ L8 j
  18.                 $ x; V1 K1 c) N% H1 u
  19.                 HAL_GPIO_TogglePin(GPIOC, LD4_Pin);
    8 t1 M  x$ a2 U! d, @& V
  20.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
      v! w6 n  w' y) L! p$ M
  21.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    . K! q8 ~( B8 j  [5 U
  22.                 HAL_Delay(DELAY_TIME);# Z, @( U, v5 K  m7 J1 Z2 `
  23.                 + E& R- v+ U8 a9 W. x! n
  24.                 HAL_GPIO_TogglePin(GPIOC, LD5_Pin);
    * m# N3 V$ A) I7 `2 N/ U9 Q
  25.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    " ~: h# {3 r- r. J  |# R5 m
  26.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    ' t5 O$ Z% ^6 v
  27.                 HAL_Delay(DELAY_TIME);9 B# G. h2 |! s7 S  h
  28.                 9 x4 S# v. J: E+ B
  29.                 HAL_GPIO_TogglePin(GPIOC, LD6_Pin);: e4 D' r2 n- k+ Q( q% H( G8 _
  30.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);/ W" Z+ z0 ^, `/ U' ]
  31.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);* f* ]6 w, L3 w# ^; \
  32.                 HAL_Delay(DELAY_TIME);
    $ ]3 C, f/ K& z/ b
  33.                
    8 U  C) u& @* i! _; D7 x
  34.                 HAL_GPIO_TogglePin(GPIOC, LD7_Pin);
    * b- _4 _: r, \: I+ U* H3 c5 a' x
  35.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    $ Q6 g. D9 c+ G% G: U, {; D# Q+ F+ d# R
  36.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    * j* _3 R) x" k8 S% U# C
  37.                 HAL_Delay(DELAY_TIME);
    ( F9 n8 u; q3 G$ o6 H
  38.                
    3 J3 s0 m3 ]5 l# J( c( H" [
  39.                 HAL_GPIO_TogglePin(GPIOC, LD8_Pin);
    ) D: `2 d. f' Z
  40.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);* P* F7 l& e/ {/ X9 B% c' q* |6 ~
  41.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    4 B" b! i7 z! U. ~. s& q
  42.                 HAL_Delay(DELAY_TIME);        6 E) q4 s5 s$ p9 h0 |4 {
  43. }6 t/ P! L6 T- y5 p
复制代码
- T! D, d" [  \) X' T

4 M0 x8 I' [; _1 ~, }& y3 F- U' l
3 r& Q* c8 F8 {3 M  b$ }
收藏 评论0 发布时间:2021-11-13 00:01

举报

0个回答

所属标签

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