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

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

[复制链接]
STMCU小助手 发布时间:2021-11-13 00:01
1.使用keil5的注意事项
2 S  D( {, T$ F. v& H7 ^& j0 Q用STM32Cube生成程序驱动后 将程序写到以下范围内,以程序保证用STM32Cube重新生成工程后不被删除 。9 t6 w( ?) `- A
  1. /* USER CODE BEGIN 1 */     //代码开始
    % v! U$ n7 e6 Y
  2. 3 o* s9 ]) v* F9 W" ?$ L' u# Y" u
  3. /* USER CODE END 1 */                //代码结束
复制代码

% Q) [* B! W# u& G

8 w7 E) _+ b! O2.HAL库延时函数
# ?9 {  u& x3 ?: c/ R6 N5 `0 SHAL库自带延时函数(毫秒,阻塞)% A' `6 g% H3 w' r$ E. P. J
  1. HAL_Delay(x);& E* l; P2 A3 u4 q# K5 I2 R6 m
  2. 实际延时时间为(x+1)ms
复制代码
HAL库函数为了防止无意义延时(即0ms延时)的产生,在HAL_Delay函数传入参数之后会对参数加1。 如果使用HAL库默认延时函数进行延时,实际延时时间将会比预期时间多1ms。换句话说,HAL_Delay函数至少会产生1ms的延时。+ v  C$ n' l/ l) u3 D

* A( _/ h$ u! W% o- z重新定义延时函数,非阻塞式延时, C/ A& i" W, ?
  1. void Delay_us(int16_t nus) 9 y; s! b; F5 }6 F6 U1 W
  2. {  |( T3 v# s3 R; o; @; y  X! o- M
  3.   int32_t temp; 1 {' H/ h+ X7 B1 F
  4.   SysTick->LOAD = nus*9; //72MHz& S: A2 g5 d' E" [8 f, q( _
  5.   SysTick->VAL=0X00;) r) b) z; A0 G7 c
  6.   SysTick->CTRL=0X01;
    - |+ v, s3 f( k' q1 P) _2 r( U
  7.   do
    & X) _4 N+ k; v7 ~( l1 y  ^
  8.   {
    & s& y( c* J  J
  9.     temp=SysTick->CTRL;& }5 L/ F& V+ j5 e
  10.   }# ^* l$ u% R, F2 }
  11.   while((temp&0x01)&&(!(temp&(1<<16))));
    6 I# N2 o7 N8 }# ?# m; I& A% _

  12. . w6 q2 h" A) E$ L$ \
  13.   SysTick->CTRL=0x00;
    ) l7 l5 M  p  x
  14.   SysTick->VAL =0X00; 9 g# G2 u$ w2 u1 ~$ C
  15. }
    # J. c8 N% t0 z6 h  f! ]
复制代码
3 d) I/ W0 f3 o' l1 t
3.HAL库配置GPIO
# V9 e( }3 |' a& s0 P6 z
  1. void              HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init);+ S  u" c% ~) r/ {
  2. void              HAL_GPIO_DeInit(GPIO_TypeDef  *GPIOx, uint32_t GPIO_Pin);7 ]- U! ]3 ~2 M, j+ d
  3. GPIO_PinState     HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);  //端口输入读取函数7 x$ U5 s# v0 W! v" l( G4 r7 V3 g
  4. void              HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); //端口输出控制函数" N. Y" G: V& P7 J- s! k
  5. void              HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);  //端口输出翻转函数 * @* }* v5 y- Z
  6. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);; g9 r( p6 X" ?9 s3 L
  7. void              HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);
    7 C3 u) ~- a' @) }; I, Y6 \
  8. void              HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
复制代码
解释:% ^' ~7 p/ x  D  w$ i

  L% @4 m# Q1 JHAL_GPIO_Init
- g" e% E, Z* y8 i+ W$ b4 U1 B初始化我们需要用到的引脚的工作模式,包括具体引脚的工作速度、是否复用模式、上下拉等等参数。, b& U/ L: t. v
  1. void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
复制代码

) k4 o- _6 |& s' `9 @HAL_GPIO_DeInit
- k% V" O/ H+ Q! f( F7 E  h9 |- [1 a将初始化之后的引脚恢复成默认的状态–各个寄存器复位时的值
# g  ~. R& |6 g2 x
  1. void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)
    1 _3 l- a3 `4 a
  2. 例:HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);
复制代码
5 J! Q1 X- S; w: m( m
HAL_GPIO_ReadPin/ m: V$ V7 H4 c( e) z( F
读取我们想要知道的引脚的电平状态、函数返回值为0或1。) |) ]8 t4 o+ V: Z7 o- ]
  1. GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
    0 ?. _' j, ~" G0 a! d3 A
  2. 例:pin_State = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_9);
复制代码
5 m# B9 T# O& D
HAL_GPIO_WritePin
; Y% V5 I# ]+ F8 o  m1 z给某个引脚写0或1,但是不要理解成,写1就是使能之类的意思,有些寄存器写1是擦除的意思7 T. @1 {% f6 G( O; P/ c
  1. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
    9 T7 J5 w  L: d
  2. 例:HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9,GPIO_PIN_RESET)
复制代码

* {/ z! A0 \/ q1 l: FHAL_GPIO_TogglePin! l, a3 X$ S( u
翻转某个引脚的电平状态$ X6 b; ?3 y" ]; E2 ~/ t
  1. void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
    ; `" K$ {% ~% @6 a3 Y
  2. 例:HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9);
复制代码
3 b1 j2 r6 u& F" J! e
HAL_GPIO_LockPin
* N5 f0 \0 E5 ~* T如果一个管脚的当前状态是1,读管脚值使用锁定,当这个管脚电平变化时保持锁定时的值,直到重置才改变
3 ^; M' Q: E; b' {
  1. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
    + e' x! W. a8 ]% _$ m& ?2 y2 S
  2. 例:9 `0 z  k6 ?, ^* `7 K& n! E0 ]
  3. HAL_StatusTypeDef hal_State;8 m! d* `) ^$ a" r, t% M# r! o, P
  4. hal_State = HAL_GPIO_LockPin(GPIOF, GPIO_PIN_9);
复制代码

& Z6 I, j3 i9 \5 i4 t" F( fHAL_GPIO_EXTI_IRQHandler- V- C4 |/ o: X$ N
这个函数是外部中断服务函数,用来响应外部中断的触发,函数实体里面有两个功能,1是清除中断标记位,2是调用下面要介绍的回调函数。实际调用的是下边的中断回调函数7 L3 i. A) I( p: Q) v
  1. void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
    $ k& ]! b9 T8 p4 S" j# t
  2. 例:HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
复制代码

% H& g0 R& @- OHAL_GPIO_EXTI_Callback/ \! c7 ^8 A6 s4 n; Q
中断回调函数,可以理解为中断函数具体要响应的动作。. ?! _0 ^( g8 E, l6 n. r) g" I, ^* k
  1. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    ) o, N7 [2 F( d5 X7 L
  2. 例:HAL_GPIO_EXTI_Callback(GPIO_Pin);
复制代码
& g9 _) u7 d# @
4.LED工程
  [5 v$ A+ h3 f" g0 }# r1.LED电路原理图
$ ~0 B$ f" f6 l1 R9 A* h% W
) g4 e$ U# a( Q0 f+ l9 O, g, S
20210424110119129.png

  U! N8 u( |5 m7 |
5 w3 j4 Z2 o; {2.GPIO_PIN_SET与GPIO_PIN_RESET, {$ k2 Z# @( W' I! R
  1. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)2 l) R# b! o. j, E5 L. y( y
  2. {
    + v3 v# r  T# x& N: O( j% A1 l
  3.   /* Check the parameters */
    2 m& F4 ?7 l/ m- M$ N* Q( J8 o/ k
  4.   assert_param(IS_GPIO_PIN(GPIO_Pin));
    ( L- J$ A$ m0 g7 b5 ]
  5.   assert_param(IS_GPIO_PIN_ACTION(PinState));  Y. F7 p; J/ J! Z" f0 L

  6. & m9 Z  A. t- I8 L4 f' I
  7.   if (PinState != GPIO_PIN_RESET)
    " t  N; S9 X# m/ F+ N3 o
  8.   {$ f& R& s+ ~- D  T5 O( L) D$ L
  9.     GPIOx->BSRR = (uint32_t)GPIO_Pin;//如果是GPIO_PIN_SET,则将GPIO的BSRR寄存器低16位置为GPIO_Pin' m* p. o2 i$ `! F3 s
  10.   }/ c3 k" {& B" I- |5 h
  11.   else* j6 d1 A8 x6 `1 \& }/ u
  12.   {
    # B0 }1 [1 ^0 y  g6 @6 J
  13.     GPIOx->BSRR = (uint32_t)GPIO_Pin << 16 ;//如果是GPIO_PIN_RESET,则将GPIO的BSRR寄存器的高16位置为GPIO_Pin% Z3 b! u6 g: A
  14.   }2 A/ d3 S0 @. O* R
  15. }
复制代码
8 Z* ]) H2 i- [5 t3 S& X( s
例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_SET,则GPIOA->BSRR=((uint32_t)0x0002U);即把二进制0000000000000010转换为32位数赋值给BSRR,对应的GPIO_Pin_1管脚置高;
! S& J- B0 I) a% r7 _/ Z- S2 o% S9 z
例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_RESET,则GPIOA->BSRR=((uint32_t)0x0002U<<16);即把二进制数0000000000000010左移16位并转换为32位数赋值给BSRR,高16位对应的GPIO_Pin_1为1,对应管脚被清零,置低;
2 I( i! S5 n$ T* Z/ i1 \; c$ B( u1 @% T/ J' H6 @' b
3.锁存器
: @5 Y7 d  C7 Y锁存使能(LE)输入和输出使能(OE)输入对于所有锁存器是公共的。
7 K3 w  ]! o, \1 ?LE为高电平时,Dn输入端的数据进入锁存器。 在这种情况下,锁存器是透明的,即每当其对应的D输入改变时,锁存器输出就改变状态;  [; U! \3 c, @% h7 a, s* t
当LE为低电平时,锁存器将存在于D输入端的信息存储在LE的高电平至低电平转换之前的建立时间;
0 W$ q: f$ Y) }' `5 G当OE为低电平时,8个锁存器的内容在输出端可用;
' n1 P" u3 K5 h当OE为高电平时,输出变为高阻态关闭状态。OE输入的操作不会影响锁存器的状态。
& s" X' ^  J7 ~0 ~+ C/ Z7 }2 U
) K' }& Q& i; a, s& v" a' A$ n4.用端口输出控制函数控制LED闪烁" A  Q/ j- c5 m' T0 Q7 f0 e
  1.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET);                //端口输出控制函数,PC8端口输出高电平,使LD1熄灭
    ' |& u' W' s) D9 ^5 m
  2.         HAL_Delay(300);
    # _( _2 p6 m# A- l
  3.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);        2 H' B+ C2 _  Q9 r) k# A7 R
  4.         HAL_Delay(300);
    7 l- C7 b' h4 b' q
复制代码
0 D, q1 i9 D7 n- ?+ W* Q9 l' U6 K
, {  E9 ^3 q& P& J" r2 S% j$ o
5.用端口输出翻转函数控制LED闪烁
; M  s7 T* Z4 a, ~' y# \. U1 \
  1.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_8);    //端口输出翻转函数
    * `5 J4 S8 A5 v4 H" U3 Q2 R
  2.         HAL_Delay(300);
复制代码

7 F  P- x9 n: r3 |
( N' {9 W2 M4 c3 Y6.使用锁存器# i* e: H. i: F9 C$ ?
  1.         HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);                  //锁存器输出高电平$ D/ `: p7 e2 Z  F2 e
  2.         HAL_GPIO_TogglePin(GPIOC,LD1_Pin);                   //端口输出翻转函数 4 s% R+ y4 f& u! I/ ]
  3.     HAL_Delay(300);: F/ o# V# q* }/ i0 [4 n
  4.         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);                //锁存器输出低电平
复制代码
1 j! w  z% [( B/ K- }8 @: ^! {
7.LED跑马灯
2 H' T+ p3 g  O8 @0 I
  1. #define DELAY_TIME        100
    9 \) @+ K, P, @  t
  2. void LED_test(void)
    8 n- f" E( h0 C  L1 B4 P2 C6 ?
  3. {. J& Z2 C  X" x7 C$ F; ]3 U
  4.            HAL_GPIO_TogglePin(GPIOC, LD1_Pin);
    1 p- b3 K  }; K
  5.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    2 j; |2 e  @% L. u# v
  6.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);/ c$ a+ U1 b+ [7 L1 M% ~1 ]+ V
  7.                 HAL_Delay(DELAY_TIME);
    5 @0 Z* J! X' m: z* Y  c5 f
  8.                
    ) e) b# b9 x' M! H3 S
  9.                 HAL_GPIO_TogglePin(GPIOC, LD2_Pin);
    8 U0 g8 j7 [3 f
  10.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);4 t' u5 M) ?& q4 X
  11.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    ( c% t! h& D0 ~; [" s8 B+ F
  12.                 HAL_Delay(DELAY_TIME);1 `+ Q& h9 _6 n, V+ M+ V
  13.                
    # H, k7 U# `  n$ c
  14.                 HAL_GPIO_TogglePin(GPIOC, LD3_Pin);
    9 D4 e1 u$ Q, D7 A6 J
  15.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    & Z& L0 L' G% r8 e1 C8 A  \" s7 q
  16.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    7 l0 h) X9 ?6 Z9 f; A" U: `
  17.                 HAL_Delay(DELAY_TIME);
    " @: K. `6 Q0 |( u3 }, m: m' y
  18.                 ' t8 g4 P. ^* d6 V  a1 X( S9 Y9 r8 r
  19.                 HAL_GPIO_TogglePin(GPIOC, LD4_Pin);
    1 C' O% m  I6 Z. y# f$ E
  20.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    5 J9 q, D) i( Z4 l
  21.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);0 e: B- L8 r$ Y2 L
  22.                 HAL_Delay(DELAY_TIME);
    7 o  C! X1 b# q3 B. B
  23.                
    3 e& ]* N* _. g1 n) h5 ], `8 o
  24.                 HAL_GPIO_TogglePin(GPIOC, LD5_Pin);
    2 M( ]* y- d  I; ]! r. L
  25.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    0 l; a9 S7 n2 v+ _( X8 P$ A
  26.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    . A0 H5 c" i# `) G& i& E9 x" a
  27.                 HAL_Delay(DELAY_TIME);
    . P: p3 H+ ]" g# m2 }  _4 Z2 z
  28.                   o( K7 t$ Q# s& N- a* ]- e
  29.                 HAL_GPIO_TogglePin(GPIOC, LD6_Pin);
    ; X) }/ ^* A7 j, K8 d  U! }8 S- x1 g
  30.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    0 H" ?% Q0 `4 B: O
  31.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    6 E8 v2 P1 Z& S" [
  32.                 HAL_Delay(DELAY_TIME);7 I% G$ m9 T) `
  33.                 * }+ f9 g- O/ G: K# k" o3 V
  34.                 HAL_GPIO_TogglePin(GPIOC, LD7_Pin);8 \! K* w0 i1 c5 H5 w
  35.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);! R" u4 M2 `* [1 E& x, A
  36.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    $ l/ v/ }: l0 F
  37.                 HAL_Delay(DELAY_TIME);
    . Q9 v7 D+ J. d4 i+ F
  38.                
    1 I. s% M! s9 \$ G8 @: z
  39.                 HAL_GPIO_TogglePin(GPIOC, LD8_Pin);3 _4 I# ~# z( x" \
  40.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    4 i( u3 M4 p" o* Z/ ]
  41.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);- F- _* J0 l" f2 a  m
  42.                 HAL_Delay(DELAY_TIME);          Z7 Y8 G+ C. O- J4 o( A
  43. }
    : v0 H3 e$ z1 Y5 g/ d
复制代码

6 }5 I% c0 A$ {
; s; ?7 g7 I0 C: X" ?' E: ~0 I
收藏 评论0 发布时间:2021-11-13 00:01

举报

0个回答

所属标签

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