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

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

[复制链接]
STMCU小助手 发布时间:2021-11-13 00:01
1.使用keil5的注意事项( y) n6 l5 \2 ]) D8 h1 M/ B* x. f9 z
用STM32Cube生成程序驱动后 将程序写到以下范围内,以程序保证用STM32Cube重新生成工程后不被删除 。
& M1 _2 |  x5 v  z
  1. /* USER CODE BEGIN 1 */     //代码开始( ]9 e: P' `' z6 B, A1 a  U  q
  2. 0 [1 r4 h/ S1 \: q8 m  q) R8 l
  3. /* USER CODE END 1 */                //代码结束
复制代码

& b0 t* G+ k+ e) z$ N4 x& B, z/ j

9 b* Z8 {7 s1 S2.HAL库延时函数
$ I( a0 a$ k8 u, w* GHAL库自带延时函数(毫秒,阻塞)
$ a1 B3 j4 t+ _* x
  1. HAL_Delay(x);# K2 @+ n' I  J8 v  G! ?
  2. 实际延时时间为(x+1)ms
复制代码
HAL库函数为了防止无意义延时(即0ms延时)的产生,在HAL_Delay函数传入参数之后会对参数加1。 如果使用HAL库默认延时函数进行延时,实际延时时间将会比预期时间多1ms。换句话说,HAL_Delay函数至少会产生1ms的延时。8 z/ G/ G# s5 E' g
' i4 t7 q; B/ P& e: [" ^
重新定义延时函数,非阻塞式延时
: Y& G1 Y& C$ \" P# e6 u6 b
  1. void Delay_us(int16_t nus) ! P& e- G, s, ]/ `' M- G) x$ [. e8 m
  2. {
    / i; a% d2 {: G, o* j$ t
  3.   int32_t temp; 7 ^& u: U6 H6 J, v9 ?  Y
  4.   SysTick->LOAD = nus*9; //72MHz* T5 p" v( R2 n, a2 I
  5.   SysTick->VAL=0X00;3 c" n) n) i- b7 W& s6 C- c
  6.   SysTick->CTRL=0X01;* }) v$ U4 c) b9 A
  7.   do % N; k/ n) s6 @- d
  8.   { % A( w. H' J( c- X* {, A
  9.     temp=SysTick->CTRL;
    0 Z! k5 W0 _8 }& Z& t$ {, [
  10.   }
    2 [; n" j! J. [: Q1 T
  11.   while((temp&0x01)&&(!(temp&(1<<16))));
    9 ~+ v5 D% R* @8 K% \8 s

  12. 2 u% [2 t! @# ^
  13.   SysTick->CTRL=0x00; / @. i% P2 s4 U$ W: q
  14.   SysTick->VAL =0X00;
    . {+ K8 ]  }6 b6 M8 a
  15. }' D+ r. ?5 F2 [+ u* s+ Z
复制代码

8 b& b( T! p) J' |, ^3.HAL库配置GPIO2 v& x  P# Q( a6 j* _2 [# D0 U  J
  1. void              HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init);* {% l2 H! O4 m& X, U8 v
  2. void              HAL_GPIO_DeInit(GPIO_TypeDef  *GPIOx, uint32_t GPIO_Pin);& R2 X: \3 _5 m
  3. GPIO_PinState     HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);  //端口输入读取函数1 g$ e* y1 `: K9 r8 G
  4. void              HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); //端口输出控制函数# d$ \$ R* g' N" }/ B
  5. void              HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);  //端口输出翻转函数
      N1 _4 w& y, F. a, b3 n. Q+ _* K, \
  6. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);) g) f. b6 e. T8 S/ G9 i' m
  7. void              HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);% E1 p$ W4 f; s2 f* d1 ?) X
  8. void              HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
复制代码
解释:" t/ n8 c. u2 T2 p1 Z  o2 x$ i

4 P; P+ o; }' T4 j2 \& ?HAL_GPIO_Init  e0 F6 m3 A( q5 T0 i& F5 U
初始化我们需要用到的引脚的工作模式,包括具体引脚的工作速度、是否复用模式、上下拉等等参数。
5 w. m) T+ j  f
  1. void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
复制代码

; s5 E0 O6 k2 T& w7 h* UHAL_GPIO_DeInit
/ `" G" E9 ~" O& h' L/ x6 L将初始化之后的引脚恢复成默认的状态–各个寄存器复位时的值
8 _7 W1 ^# \) ]1 U9 U# M4 n
  1. void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)
    5 Q# _$ {, E2 b8 |2 r. U
  2. 例:HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);
复制代码
9 @& G; G3 O+ Z$ n
HAL_GPIO_ReadPin
( J1 x8 a) p; p读取我们想要知道的引脚的电平状态、函数返回值为0或1。
. |- l: z! ]1 I# }6 ^9 g
  1. GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)  q: O7 i/ N8 `$ z8 b& |/ o
  2. 例:pin_State = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_9);
复制代码

$ N; T9 f: D# A; r9 {+ j) y1 l+ ^HAL_GPIO_WritePin. t* C" v7 q2 r
给某个引脚写0或1,但是不要理解成,写1就是使能之类的意思,有些寄存器写1是擦除的意思
8 f: O; ~! T1 V# |4 C, Z" d
  1. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)( T; T3 O  ~+ j
  2. 例:HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9,GPIO_PIN_RESET)
复制代码
4 A- T* l  h) V1 P9 H' Q$ }  e
HAL_GPIO_TogglePin
% W* V$ \% X8 o7 V+ |翻转某个引脚的电平状态
1 h) U. E: d) {
  1. void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)4 d" V+ x( G3 d! y5 M8 `- U
  2. 例:HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9);
复制代码
4 @. l& X2 y3 v' s; w2 c
HAL_GPIO_LockPin$ N% \! t$ h3 d  g
如果一个管脚的当前状态是1,读管脚值使用锁定,当这个管脚电平变化时保持锁定时的值,直到重置才改变
, A: ]: c" ]: h3 x: _) N: e, B
  1. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
    ; m5 ^' U) y3 r, e4 J8 ?' w( S
  2. 例:
    : j# o9 C5 b! Y' S: ?
  3. HAL_StatusTypeDef hal_State;
    ! n% |+ ^! H/ P% _4 F; i; K
  4. hal_State = HAL_GPIO_LockPin(GPIOF, GPIO_PIN_9);
复制代码
: z  O; H& W+ F
HAL_GPIO_EXTI_IRQHandler+ h% t: b$ i  B- [
这个函数是外部中断服务函数,用来响应外部中断的触发,函数实体里面有两个功能,1是清除中断标记位,2是调用下面要介绍的回调函数。实际调用的是下边的中断回调函数
0 T( _% z  g4 |
  1. void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
    ( N9 d3 ^, ]# E+ b
  2. 例:HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
复制代码

9 l; r; Q& k3 B( Y' NHAL_GPIO_EXTI_Callback
5 W) m; S; }$ J. T- v" J4 U/ k中断回调函数,可以理解为中断函数具体要响应的动作。
  S" N  Z1 J, [/ n% y3 k0 r
  1. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)/ m/ O$ v3 g$ B* b5 k! }1 W
  2. 例:HAL_GPIO_EXTI_Callback(GPIO_Pin);
复制代码

7 Z& X6 @" ~8 T) I0 a1 L4.LED工程( |9 _% p% G5 E! ?
1.LED电路原理图% o  }- Z( H" b$ \

4 l8 H+ J5 m& t$ F( Z. C
20210424110119129.png
1 S- f; w) T7 `3 B
0 \! S( e, j" r7 x) n
2.GPIO_PIN_SET与GPIO_PIN_RESET
6 ]0 u- V  w5 x) T  _2 c
  1. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)+ C, p9 O/ \% @2 G: r  a
  2. {
    9 T9 G8 M' P3 C% N; H& ^4 k- _
  3.   /* Check the parameters */, S/ J/ G. \  |; g" p$ `
  4.   assert_param(IS_GPIO_PIN(GPIO_Pin));* @* U2 q" G6 z1 n4 I) v2 d/ ]
  5.   assert_param(IS_GPIO_PIN_ACTION(PinState));
    5 @# }* z2 y3 {# }* X
  6. : S5 L# X3 b. U4 |# Y
  7.   if (PinState != GPIO_PIN_RESET)
    ( V# j$ r4 F" L5 o0 Q8 C& D
  8.   {4 @( r* i  {8 U3 E& [
  9.     GPIOx->BSRR = (uint32_t)GPIO_Pin;//如果是GPIO_PIN_SET,则将GPIO的BSRR寄存器低16位置为GPIO_Pin
    1 F: ^" U% z+ n  [% X
  10.   }/ [7 C+ ]8 X, c+ o+ c
  11.   else( C" n) m& e0 g8 r. h
  12.   {3 z1 c- C# h# b% T3 i7 m
  13.     GPIOx->BSRR = (uint32_t)GPIO_Pin << 16 ;//如果是GPIO_PIN_RESET,则将GPIO的BSRR寄存器的高16位置为GPIO_Pin
    4 L& {$ h. t4 k4 H) g  T
  14.   }
    + i7 M4 Z6 k3 [
  15. }
复制代码

0 i9 N& A/ ^) F例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_SET,则GPIOA->BSRR=((uint32_t)0x0002U);即把二进制0000000000000010转换为32位数赋值给BSRR,对应的GPIO_Pin_1管脚置高;/ X( ^2 J0 `# C* G2 v" C/ ]

& ~* C1 |. L+ }8 i5 J) J+ j例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_RESET,则GPIOA->BSRR=((uint32_t)0x0002U<<16);即把二进制数0000000000000010左移16位并转换为32位数赋值给BSRR,高16位对应的GPIO_Pin_1为1,对应管脚被清零,置低;4 ^+ f6 X, u2 u
! b& M$ w" v5 f% U" M
3.锁存器, ?3 I5 b) i3 @( f& [. q
锁存使能(LE)输入和输出使能(OE)输入对于所有锁存器是公共的。
" E" A/ M3 Z( A( r: kLE为高电平时,Dn输入端的数据进入锁存器。 在这种情况下,锁存器是透明的,即每当其对应的D输入改变时,锁存器输出就改变状态;5 y# y+ Z: N, n6 P; A
当LE为低电平时,锁存器将存在于D输入端的信息存储在LE的高电平至低电平转换之前的建立时间;
9 d+ y6 U, J9 x* ^当OE为低电平时,8个锁存器的内容在输出端可用;
& f+ N" ?5 b% V当OE为高电平时,输出变为高阻态关闭状态。OE输入的操作不会影响锁存器的状态。: W. v4 j5 k+ k$ r9 ]7 x
; z4 S3 R+ `( U/ [# n: G7 t
4.用端口输出控制函数控制LED闪烁
7 D+ V! L7 f' K7 s" D
  1.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET);                //端口输出控制函数,PC8端口输出高电平,使LD1熄灭8 `5 D- t/ n) J6 h. X  O5 O# }
  2.         HAL_Delay(300);
    9 n3 W& E3 T5 O! T
  3.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);        ' U/ B) n: \; t' P) g) ~* w; E
  4.         HAL_Delay(300);2 C! S$ u3 P' N9 v) S! U
复制代码

) n+ q4 ~: f( z8 b$ P, N2 ~& f# H0 n4 ?6 ~% F1 b2 [
5.用端口输出翻转函数控制LED闪烁
) ]+ d8 T* ~6 C
  1.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_8);    //端口输出翻转函数 ) l% X6 ^, X4 s( `
  2.         HAL_Delay(300);
复制代码
+ ~5 U* p# I4 _5 M1 \3 c
! y/ ^5 c# M* L( N3 r
6.使用锁存器
: M: i) Z, p& R; M2 X" ^& h- u
  1.         HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);                  //锁存器输出高电平
    ! Z3 ^/ p, n( I- K- t& t; Q
  2.         HAL_GPIO_TogglePin(GPIOC,LD1_Pin);                   //端口输出翻转函数
    ' D; n  ]( ?$ p. E' ~$ g* h8 W1 j
  3.     HAL_Delay(300);
    2 W1 E. J2 v: K* c- U$ K8 J) n
  4.         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);                //锁存器输出低电平
复制代码
$ t" o* K. O5 n1 s' C  B
7.LED跑马灯
% ^. H; Y/ o7 e; G5 V
  1. #define DELAY_TIME        100! V' q' Y, j% r+ f
  2. void LED_test(void)' ~# p, J2 W  R0 U
  3. {
    3 l, f2 h: U. c
  4.            HAL_GPIO_TogglePin(GPIOC, LD1_Pin);1 m8 h! J* M  b; I& U) }
  5.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);" v8 u" b( [& y: d8 J3 H. \
  6.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);: a8 H( ]5 f$ X5 f6 C5 }
  7.                 HAL_Delay(DELAY_TIME);  z& `' i8 Q5 t
  8.                 + m7 H( y; k. u
  9.                 HAL_GPIO_TogglePin(GPIOC, LD2_Pin);
    + w6 V* E  F/ A9 [* P+ a
  10.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);/ @+ R9 j$ W- ]! A& E, h
  11.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);9 n6 f' x1 O, d# a
  12.                 HAL_Delay(DELAY_TIME);
    ( O9 r9 l5 N. C/ P8 h
  13.                
    / |! Z4 a  [& m! c$ K
  14.                 HAL_GPIO_TogglePin(GPIOC, LD3_Pin);$ x" C5 `+ R3 o# M. D
  15.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    3 h  G5 o1 s$ q) z" B8 W
  16.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    " @$ B; R. N% y0 r/ A
  17.                 HAL_Delay(DELAY_TIME);
    ! T$ w. M" U/ O
  18.                
    0 k( k3 E; [7 c9 t3 E- g
  19.                 HAL_GPIO_TogglePin(GPIOC, LD4_Pin);
    $ _8 ]: v3 T6 b' K2 q. A7 `5 J. r6 d
  20.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);3 a+ {3 @- p6 A, n$ x7 J
  21.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    7 e" K4 o2 x/ X, z' R* w
  22.                 HAL_Delay(DELAY_TIME);
    9 k- }1 H  G5 }, `$ U
  23.                
    , z% U4 i( o& a' f1 J+ N2 W& L
  24.                 HAL_GPIO_TogglePin(GPIOC, LD5_Pin);) m8 z/ P* M: u" |' X5 Z2 c1 f
  25.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);1 v* a/ C- R' C
  26.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    & L  z5 `1 o9 N- ]( L# Y& Z
  27.                 HAL_Delay(DELAY_TIME);6 N2 n9 V  O1 V4 z, `) o
  28.                 0 L) q; \; I6 c) i2 p! S3 }
  29.                 HAL_GPIO_TogglePin(GPIOC, LD6_Pin);
    9 C) U+ L# w4 o" g' l8 |  Z. g+ \
  30.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);  g! q/ g" _( e. H& c' }! J0 {
  31.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);! c& D- A, x* b. e  ^$ O! K
  32.                 HAL_Delay(DELAY_TIME);
    3 l0 H9 c# D- Y' q2 Q2 i( V" H( H8 G
  33.                
    - D. [( L( b2 I/ v: V/ }. I6 l) R+ a
  34.                 HAL_GPIO_TogglePin(GPIOC, LD7_Pin);
    - {. P  x5 O3 L) _7 P5 c9 s) {
  35.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    % A- _( f3 A, z3 N
  36.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);' y  D' j$ [& \$ E7 n/ |. F2 ?
  37.                 HAL_Delay(DELAY_TIME);$ N4 b0 k2 p4 ^' Z) G) [3 w6 p
  38.                
    * V; V- R3 E9 D, \5 U( H
  39.                 HAL_GPIO_TogglePin(GPIOC, LD8_Pin);
      S+ \6 i( y% w! z) ]$ R
  40.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);% `" G7 ?4 L! l; B* k
  41.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    $ y9 R( }' ?) b. e- ~
  42.                 HAL_Delay(DELAY_TIME);        
    - W: s; b! l2 y. v7 y
  43. }
    3 w6 S5 T, V" a
复制代码

. O7 O) f8 j/ g6 U4 |+ p/ w% x/ _* X# g9 {$ r& G$ Q

: D* f) h$ E& `3 c' j! R
收藏 评论0 发布时间:2021-11-13 00:01

举报

0个回答

所属标签

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