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

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

[复制链接]
STMCU小助手 发布时间:2021-11-13 00:01
1.使用keil5的注意事项
1 [! B& \  u6 c7 p+ ~6 |2 _! y用STM32Cube生成程序驱动后 将程序写到以下范围内,以程序保证用STM32Cube重新生成工程后不被删除 。3 Z! A# P: v& S- V( b% S, O- i& B
  1. /* USER CODE BEGIN 1 */     //代码开始
    " F/ p! B5 l$ u$ z: Q3 |( }, h! b

  2. 6 Q2 L' c- D1 A# _( m- a" `
  3. /* USER CODE END 1 */                //代码结束
复制代码
8 c6 b; n5 u# b- H  z% A' ]# h
" S  b9 a( |. V9 P, u
2.HAL库延时函数
1 d% x+ Y) m! e2 q" y8 u# qHAL库自带延时函数(毫秒,阻塞)6 }1 N9 R4 q/ y% ]
  1. HAL_Delay(x);# r6 _+ Q+ S1 C: j7 x
  2. 实际延时时间为(x+1)ms
复制代码
HAL库函数为了防止无意义延时(即0ms延时)的产生,在HAL_Delay函数传入参数之后会对参数加1。 如果使用HAL库默认延时函数进行延时,实际延时时间将会比预期时间多1ms。换句话说,HAL_Delay函数至少会产生1ms的延时。
8 Z: W; E* J- n$ [3 |
( d  X' O, I, Q- V重新定义延时函数,非阻塞式延时  g+ f! J/ ~, @
  1. void Delay_us(int16_t nus)
    0 ]5 x, g6 Q* Z9 a" P$ E
  2. {
    $ ]+ p  n# D7 L6 M. o
  3.   int32_t temp;
    ! y  n- M) W% {
  4.   SysTick->LOAD = nus*9; //72MHz
    5 m% t3 }9 ^, ]* Z
  5.   SysTick->VAL=0X00;4 |- {. o3 [; |+ Z4 t
  6.   SysTick->CTRL=0X01;" J; y- I3 K4 k/ O
  7.   do
    & e- c5 K- Z, B/ B: v: K
  8.   {
    # M" M7 v$ I2 Q  c6 D
  9.     temp=SysTick->CTRL;9 M2 {7 O+ f, F9 J) z9 p
  10.   }7 ~& u6 f4 l) X( s9 P+ A  I
  11.   while((temp&0x01)&&(!(temp&(1<<16))));3 p, H% x! H  c+ l" N! J( g8 U, S. @
  12. ) f2 H2 A9 I! L. {* X8 M
  13.   SysTick->CTRL=0x00; . Y9 H! N$ Q& z: D
  14.   SysTick->VAL =0X00; * c( F% z! E2 i* `' u7 z
  15. }
    9 L- y8 w- n8 }8 @
复制代码

8 ~2 y( O$ k& b" ^$ g3.HAL库配置GPIO3 P* D; n1 O: m/ V( S/ F! P
  1. void              HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init);
    % D9 q/ T' R! ^8 s( G2 b
  2. void              HAL_GPIO_DeInit(GPIO_TypeDef  *GPIOx, uint32_t GPIO_Pin);8 }2 V6 G' m; _, ?* Q
  3. GPIO_PinState     HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);  //端口输入读取函数
    . Q1 j8 a! w1 w, D! x1 c
  4. void              HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); //端口输出控制函数
    # _0 }0 @* B" k+ D
  5. void              HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);  //端口输出翻转函数
    " z) }; K  K2 a/ q
  6. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);% w0 T# k+ ^- n- k9 j
  7. void              HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);
    ( a6 M' @! w* \
  8. void              HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
复制代码
解释:+ A0 F9 M! e% l; J( e
; ~3 v1 j2 P7 @+ r# ?
HAL_GPIO_Init
+ W+ v. ?, U6 M7 L& O  \- r) u; T2 T初始化我们需要用到的引脚的工作模式,包括具体引脚的工作速度、是否复用模式、上下拉等等参数。
8 y# ]& L. i0 I; u) ?
  1. void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
复制代码
1 v, e& I$ U* {- |
HAL_GPIO_DeInit1 W; `1 F7 o4 p: Y8 s4 {
将初始化之后的引脚恢复成默认的状态–各个寄存器复位时的值
/ F% C& b. E& I" c2 ?( M
  1. void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)) w9 v7 G  k& V( Z+ y/ [# _/ {
  2. 例:HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);
复制代码

% w6 ~. D$ N' ~* K5 kHAL_GPIO_ReadPin4 I5 N% O; j6 A) s
读取我们想要知道的引脚的电平状态、函数返回值为0或1。
: V; a, E7 \  r+ N3 X
  1. GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
    $ M7 o; o/ J& i& e8 P& v  M
  2. 例:pin_State = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_9);
复制代码

- B5 X0 w6 g/ y! c! WHAL_GPIO_WritePin6 q8 _/ T4 W3 ]) A+ \& |
给某个引脚写0或1,但是不要理解成,写1就是使能之类的意思,有些寄存器写1是擦除的意思
5 s' n* A+ ^# {3 ^
  1. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
    8 @4 ?) x4 D8 p2 w
  2. 例:HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9,GPIO_PIN_RESET)
复制代码
* v  F, m9 ~0 c! b/ P
HAL_GPIO_TogglePin
; ^3 h9 W: K4 i+ B/ m: k  R翻转某个引脚的电平状态0 R8 T2 I( X6 I/ ]) N) R$ W
  1. void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)& M" L9 r& Z1 @" H/ U/ |& ^4 w
  2. 例:HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9);
复制代码

! y2 K" y  F& W0 iHAL_GPIO_LockPin6 b# h3 h3 L8 [% S
如果一个管脚的当前状态是1,读管脚值使用锁定,当这个管脚电平变化时保持锁定时的值,直到重置才改变
7 X. F! n/ ~& k; {
  1. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
    ) ^; H. y1 q" {$ o( B- X- {( i
  2. 例:; j8 w6 S( X5 t$ C8 O) p9 N8 x  t
  3. HAL_StatusTypeDef hal_State;
    : b& t2 t' P9 i' K. b* D
  4. hal_State = HAL_GPIO_LockPin(GPIOF, GPIO_PIN_9);
复制代码

" t; m' V  M. }2 h% A6 _) O& hHAL_GPIO_EXTI_IRQHandler. J3 h! e, |- w! F
这个函数是外部中断服务函数,用来响应外部中断的触发,函数实体里面有两个功能,1是清除中断标记位,2是调用下面要介绍的回调函数。实际调用的是下边的中断回调函数
( D6 k3 R+ t0 z
  1. void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin). o1 v8 N( ~' w3 t6 {  I( s, C9 Z
  2. 例:HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
复制代码
' c- E' z( t4 |' m+ M! G6 K
HAL_GPIO_EXTI_Callback
! X! K  q$ o( @! L4 G; A1 l中断回调函数,可以理解为中断函数具体要响应的动作。' I! z) b9 I8 w7 s  P
  1. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    / ?1 R) d! O( a2 p% `
  2. 例:HAL_GPIO_EXTI_Callback(GPIO_Pin);
复制代码
7 T" g% X1 X/ G- _* U- ]8 a+ E
4.LED工程
4 X( h" {" u9 l+ w1 s1.LED电路原理图5 h3 \( i: ^4 }

; j; ~3 R  x( ?) M. G- L) _3 W
20210424110119129.png
* t* ~5 F& w8 t% J
0 G9 E; \3 L$ u( }$ `  E
2.GPIO_PIN_SET与GPIO_PIN_RESET
! s7 ^- x  U& a: m4 c
  1. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)- `* j# u5 D. M0 ^) D* j$ z6 a
  2. {
    1 k; B& [( g, D. X' Q
  3.   /* Check the parameters */9 U" K+ s  O7 j9 d0 ^, E6 d
  4.   assert_param(IS_GPIO_PIN(GPIO_Pin));3 H$ j+ J4 |5 B
  5.   assert_param(IS_GPIO_PIN_ACTION(PinState));
    5 |: c( s# {" o  c9 h
  6. 3 z8 i9 \2 R. w" \2 ~: x( u
  7.   if (PinState != GPIO_PIN_RESET)' o( r$ Z7 q! r& Y% S5 N" S
  8.   {- J  u/ P# C# x* i) [8 G: e
  9.     GPIOx->BSRR = (uint32_t)GPIO_Pin;//如果是GPIO_PIN_SET,则将GPIO的BSRR寄存器低16位置为GPIO_Pin
    4 k$ i3 V, W) f3 ^5 N: D$ V
  10.   }; G- ~) t, u* [8 c$ n# w* d
  11.   else% Y6 `/ Y, }: w4 Q+ Y. H" w
  12.   {
      ~5 S* g) P! b3 C5 X! P: N6 H
  13.     GPIOx->BSRR = (uint32_t)GPIO_Pin << 16 ;//如果是GPIO_PIN_RESET,则将GPIO的BSRR寄存器的高16位置为GPIO_Pin
    " _7 U  p, @+ E  C7 p
  14.   }" C) ?5 f7 F  ^  [
  15. }
复制代码
) s$ G3 x( B$ p% E2 W1 m
例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_SET,则GPIOA->BSRR=((uint32_t)0x0002U);即把二进制0000000000000010转换为32位数赋值给BSRR,对应的GPIO_Pin_1管脚置高;
- e6 O1 g- h' E$ O( I% Q  |: b3 s1 g9 A9 ?! D
例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_RESET,则GPIOA->BSRR=((uint32_t)0x0002U<<16);即把二进制数0000000000000010左移16位并转换为32位数赋值给BSRR,高16位对应的GPIO_Pin_1为1,对应管脚被清零,置低;; }" }% L$ ]  S  w
" d6 u7 _3 n5 P& F% u+ |$ O- U* j
3.锁存器
/ A. Y  C# i9 |% Z# k7 ?锁存使能(LE)输入和输出使能(OE)输入对于所有锁存器是公共的。
7 j4 t1 i: w1 j" _: r( d( ?LE为高电平时,Dn输入端的数据进入锁存器。 在这种情况下,锁存器是透明的,即每当其对应的D输入改变时,锁存器输出就改变状态;
! T2 Q" `" ~4 ]9 Y当LE为低电平时,锁存器将存在于D输入端的信息存储在LE的高电平至低电平转换之前的建立时间;- c* v  D9 }6 B+ d, t& [9 ]2 F6 p
当OE为低电平时,8个锁存器的内容在输出端可用;
& r( U; d1 M" E( q& v. `/ [4 ~当OE为高电平时,输出变为高阻态关闭状态。OE输入的操作不会影响锁存器的状态。' H7 A/ w# a/ }$ V7 L. ]

+ w2 s4 q$ d4 ^% m% o; g$ W6 R4.用端口输出控制函数控制LED闪烁
+ X# z: [% W$ C# r+ z
  1.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET);                //端口输出控制函数,PC8端口输出高电平,使LD1熄灭
    $ H6 d# Q9 ?( Y/ I$ r( ~5 H$ U0 p
  2.         HAL_Delay(300);
    & o- Z* I: h- P
  3.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);          e4 K& ]8 C* ?7 X
  4.         HAL_Delay(300);
      U: y5 b9 H" c8 G0 X4 T- r
复制代码

9 \0 f) @, c: L+ f  q3 n/ c6 m: w4 P  q% c8 K
5.用端口输出翻转函数控制LED闪烁# X; N. c1 }) E, o7 B
  1.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_8);    //端口输出翻转函数 " _2 D) n" K! Q+ g6 n5 A3 M
  2.         HAL_Delay(300);
复制代码

+ h( `3 [8 t. o1 z; y: p4 `# u. z- A
6.使用锁存器
2 T( c" t: S/ X  t* u' w4 ~
  1.         HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);                  //锁存器输出高电平$ G3 P2 d: `' p, V
  2.         HAL_GPIO_TogglePin(GPIOC,LD1_Pin);                   //端口输出翻转函数
    ' E% ]9 O- o/ Z- z* I5 B  d
  3.     HAL_Delay(300);" g4 f3 c5 t, B' `
  4.         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);                //锁存器输出低电平
复制代码
' @6 h) d0 l: n- }
7.LED跑马灯
" K! b# p  I) N4 a+ P6 E
  1. #define DELAY_TIME        100
    . Z( `, h& T5 v' Z) K
  2. void LED_test(void)
    % M. \1 {" F7 d$ c0 n
  3. {
    " _( W; B/ N8 i2 \( u4 o" Z
  4.            HAL_GPIO_TogglePin(GPIOC, LD1_Pin);( D# n" _2 {" S' Q  ~" h* Y( J/ i
  5.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);( l& `  H! I$ {8 v
  6.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    % E7 O5 q% k+ V0 w" F- B
  7.                 HAL_Delay(DELAY_TIME);) F& T" [3 j% R& Z! r/ {8 B
  8.                 ; M: s4 }& [1 `/ \2 Q- m6 f2 H
  9.                 HAL_GPIO_TogglePin(GPIOC, LD2_Pin);
    0 c& l% E  ^4 O$ i" W8 u
  10.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);6 V& h/ E- z" _( W$ Q0 Y
  11.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);: z+ y' S* b1 @3 t
  12.                 HAL_Delay(DELAY_TIME);
    9 }$ E2 F5 I$ q: H
  13.                 7 M" a9 b/ |3 C: H8 n
  14.                 HAL_GPIO_TogglePin(GPIOC, LD3_Pin);
      W; e3 F$ m0 \2 I
  15.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    / F1 x) x2 N: r
  16.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);* ?6 q5 a3 |* z% e9 w
  17.                 HAL_Delay(DELAY_TIME);* F- E& \; |# ?- w
  18.                
    / X$ u6 D; p- s0 g
  19.                 HAL_GPIO_TogglePin(GPIOC, LD4_Pin);
    + D! u% f6 w& Z0 H
  20.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);; i3 P% L3 ?6 [, ~
  21.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);3 b% v/ y9 K" V  E
  22.                 HAL_Delay(DELAY_TIME);* p3 j# P$ W( F
  23.                
    6 q9 q/ a) V# p- F
  24.                 HAL_GPIO_TogglePin(GPIOC, LD5_Pin);3 |( p- S0 R9 {# E1 y: D
  25.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    3 f5 |( S- \) T/ v* E
  26.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    ) M# }( [  O( B* Q. s2 w
  27.                 HAL_Delay(DELAY_TIME);) F% R1 \: F0 p/ r5 u8 k
  28.                 . U" Q, Z; Q4 n5 p9 ^
  29.                 HAL_GPIO_TogglePin(GPIOC, LD6_Pin);
    2 f6 S1 z& J/ z: Q4 q! M# p
  30.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);$ v0 ]' I) ~  |0 B2 b
  31.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    / Y' l' \2 H7 T* @6 u
  32.                 HAL_Delay(DELAY_TIME);: p" N4 s" N, F9 v0 V
  33.                
    6 G$ Y0 l1 P; d+ O/ n- F  l7 w5 s7 J
  34.                 HAL_GPIO_TogglePin(GPIOC, LD7_Pin);
    : Z! j% X4 H$ y0 c6 [0 T- E
  35.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);  E" p7 T4 v" J
  36.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);' @( N( C+ g# k9 ~4 n! V
  37.                 HAL_Delay(DELAY_TIME);0 a5 @; M6 R' ]/ o
  38.                
    " x% [& X8 Q" |, ]7 h& T1 u
  39.                 HAL_GPIO_TogglePin(GPIOC, LD8_Pin);( E7 x, }2 B8 q- U' U
  40.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    + d1 I% l! D% @( x4 _
  41.                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);. w/ A# L2 @2 ^
  42.                 HAL_Delay(DELAY_TIME);        , v  D9 o3 j0 b4 y( p3 Q6 [
  43. }! u  F" A9 z) o' ^
复制代码
' I2 v7 ^) t+ W
  b& |+ f: a$ q* i" @9 p. J

- N0 U- a- J3 T) M6 `" M# ]
收藏 评论0 发布时间:2021-11-13 00:01

举报

0个回答

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版