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

【我的STM32U5 项目秀】+02-STM32U5利用LL库点灯

[复制链接]
shenxiaolin_mai 发布时间:2023-2-2 23:27
        说实话,我不喜欢hall库,也许很多人用起来很顺手,但是我用起来不习惯,而且LL库效率明显高得多,也许是没有接触过上层代码的原因吧,那么我就来说一下LL库的环境搭建以及点灯。& f; S$ m- r# n" G
        我们首先根据官方的LL库以及例程做更改,新建文件夹,拷贝文件,具体如下图。
4 s" G+ O4 x2 ?% e" ?; O5 x& |* ~, @
01-文件夹.png

" y" W, l: L, ^" o, M
        并将文件拷贝到个个文件夹内,方便将文件归类以及后期文件管理,具体的可以看附件里,附件内的源码。具体的可以查看keil工程下的文件,如下图

9 q' g  W9 z9 t6 R, R
02-文件.png
4 P8 N& O( ]0 q  r1 R* J
文件拷贝完成之后,然后添加文件路径和初始化定义,然后增加如下代码到Main.c文件。
- Q/ L) A: g9 W+ _% J! y2 N
  1. . L6 M, d. k. X+ v. W. N" t- o" Q
  2. #include "stm32u5xx_ll_icache.h"0 \+ N4 P, W6 b  r4 @7 f6 [3 D
  3. #include "stm32u5xx_ll_pwr.h"
    7 c; m; |  r7 e* `
  4. #include "stm32u5xx_ll_crs.h"
    7 n: a% @! [9 w0 h7 U/ A' R8 _! T8 k2 @
  5. #include "stm32u5xx_ll_rcc.h"8 B# |. [4 l3 H5 h" `
  6. #include "stm32u5xx_ll_bus.h"
    5 S' @+ t7 V9 I: a2 e, p
  7. #include "stm32u5xx_ll_system.h"
    ; i0 e' S4 o, s0 p: B. z
  8. #include "stm32u5xx_ll_exti.h"9 }) |, x( a2 {9 Z
  9. #include "stm32u5xx_ll_cortex.h"% W0 K/ W% ^4 Q/ m# Y
  10. #include "stm32u5xx_ll_utils.h", @# W6 C* b7 i9 S2 o
  11. #include "stm32u5xx_ll_dma.h"
    % L1 T# n6 r9 B  Z! ~! O
  12. #include "stm32u5xx_ll_gpio.h"; {# ]- H% O: n. M+ A* o, T, `/ D0 L3 ~
  13. #include "stm32u5xx_ll_lpgpio.h"; Q! F# Y6 W5 c$ q* A+ d
  14. * w0 c) M, Z* P+ f: v: ^* M
  15. # K' f  ]! d- B

  16. 9 X) Z" u3 f% v# ]$ `$ j

  17. 8 c9 q$ i* |. t  b: \
  18. #define LED1_Pin LL_GPIO_PIN_7! Q2 `- j* h! K6 m/ B
  19. #define LED1_GPIO_Port GPIOC
    ! e' Z0 J! k. w( i& S
  20. : F8 z/ j- H+ O$ Q! p: f2 b& i" [; L
  21. ) j8 N' |& f% x. _, Q. E+ y

  22. - k5 w6 R2 e5 c
  23. /**1 m6 {" w. A3 ?* c$ ]0 O
  24.   * @brief Power Configuration: e0 X) @  N5 c% i9 `. p
  25.   * @retval None% _4 s% _3 f# ^9 h) N
  26.   */
    ; s3 R& o. }0 X+ Y
  27. static void SystemPower_Config(void)
    1 F9 |- U# H. m4 A3 Q  ~
  28. {2 k) d$ |; ?4 ^% A$ m9 j& p  }

  29. & ~$ u! I, {$ G, m' g
  30.   /*
    : W: O6 v( c; n; x
  31.    * Disable the internal Pull-Up in Dead Battery pins of UCPD peripheral# a! P5 J4 f. G! p4 N6 Y  E
  32.    */+ C& X- B/ I, `3 \2 A# L6 q" O
  33.   LL_PWR_DisableUCPDDeadBattery();" ^+ ~4 j6 j' e! m+ t/ [. X$ S
  34. 8 j1 N8 Z4 Q4 @
  35.   /*
    ; {! N- `+ }3 e6 V# d
  36.    * Switch to SMPS regulator instead of LDO
    6 @, G9 }. O& B' M( L1 e' z
  37.    */
    . s; ]1 h4 z6 j- v5 v8 p! x5 x
  38.   LL_PWR_SetRegulatorSupply(LL_PWR_SMPS_SUPPLY);
    : v$ n* t: g" t9 |. a

  39.   Q5 s  ~- l9 f! E) t
  40.   while(LL_PWR_IsActiveFlag_REGULATOR()!=1)
    1 w: I1 @( Y, H# W( K
  41.   {
    5 Q% P/ B5 g+ a8 ~$ G/ N
  42.   }) d! |% W0 |4 F8 d0 w1 O
  43. }" g& U' s* N, w8 [4 J5 Z

  44. 3 S% S4 R( u3 c6 y+ ~5 v
  45. /**
    . t4 O0 {4 `1 @" g# O. `* q, R
  46.   * @brief ICACHE Initialization Function
    2 C; F& v+ N+ Z3 `) l8 O
  47.   * @param None/ q$ u* ]* @' {, G) C: c
  48.   * @retval None1 f) Z9 O7 n9 O# g4 o
  49.   */
    9 ], I1 U% r0 C
  50. static void MX_ICACHE_Init(void)
    - w) j0 w; }& u1 g  V
  51. {! i. s- Z5 r, S( S: q) Y: @

  52. 5 y/ F7 n$ m8 o* {( q! ?
  53.   /** Enable instruction cache in 1-way (direct mapped cache); B. T/ m4 p+ {1 I: G
  54.   */
    8 _& x; N. F! v' m+ Y' F  w  B, j# q
  55.   LL_ICACHE_SetMode(LL_ICACHE_1WAY);( L9 O* i) e9 ~9 T$ ?! Q
  56.   LL_ICACHE_Enable();
    5 D1 R* g, Y/ R$ t7 _
  57.   /* USER CODE BEGIN ICACHE_Init 2 */
    ) I6 J+ J7 [. [5 a( Q$ r6 ~
  58. 4 x  s6 x+ L; f: H! [8 {+ d
  59.   /* USER CODE END ICACHE_Init 2 */
    , Y/ o9 {; [' q7 A+ `0 e2 S: [
  60. 1 c2 g" [0 U3 B- w4 ^) i
  61. }3 P2 L3 d% q! G1 s! ^' c' i! ^
  62. 2 G0 T) A( v  e( w( j/ \

  63. ( j8 Q+ B& |, n2 Y0 u" s
  64. void SystemClock_Config(void)% v; [% Z7 C8 _4 h8 P& J7 k1 r
  65. {
    * s1 X: Q# R* s
  66.   LL_FLASH_SetLatency(LL_FLASH_LATENCY_4);' m; E8 G1 ?. Z, m7 r; Q( ?
  67.   while(LL_FLASH_GetLatency()!= LL_FLASH_LATENCY_4)
    8 d  {) {% y. M5 P- C' U. N
  68.   {
    7 U+ S: M! ]; }  n1 D1 a
  69.   }) Y2 U6 B$ T, `; Z) `, u, k
  70. ( D; T5 q7 \8 X- F) c" D
  71.   LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE1);. j2 Z6 F' x; f8 ^+ k, q
  72.   LL_RCC_MSIS_Enable();
    / r( m7 M" A8 R" H! }1 N

  73. 7 f5 o3 F" ?0 o1 |1 g+ T
  74.    /* Wait till MSIS is ready */' i" R, [$ A# V; D: [. L7 Q
  75.   while(LL_RCC_MSIS_IsReady() != 1): u& ~# n6 |4 q0 I: M
  76.   {
    4 T: n7 Y6 \) K: O5 \5 I. ~
  77.   }
    5 y1 f! X0 t% U+ X

  78. 2 D/ Y. m& L/ J( B- M
  79.   LL_RCC_MSI_EnableRangeSelection();
    6 j) O% I0 |7 l3 e8 F
  80.   LL_RCC_MSIS_SetRange(LL_RCC_MSISRANGE_4);" d7 C  N, `( [! I0 P3 c
  81.   LL_RCC_MSI_SetCalibTrimming(16, LL_RCC_MSI_OSCILLATOR_1);; g: p. o1 H% i3 w9 A, n6 @
  82.   LL_RCC_PLL1_ConfigDomain_SYS(LL_RCC_PLL1SOURCE_MSIS, 1, 80, 2);
    2 E( }* ?9 F3 R, l( ]2 E6 n
  83.   LL_RCC_PLL1_EnableDomain_SYS();2 G2 ^  n4 s  O4 v6 m  ~
  84.   LL_RCC_SetPll1EPodPrescaler(LL_RCC_PLL1MBOOST_DIV_1);
    " p5 C: Y- A+ G! u$ k6 L' U
  85.   LL_RCC_PLL1_SetVCOInputRange(LL_RCC_PLLINPUTRANGE_4_8);" d! f0 l1 Q  _, B8 [+ c" V. F
  86.   LL_RCC_PLL1_Enable();; |5 i! v3 K. o1 M

  87. 2 T: c% |+ ]# t! a/ n# ?4 b  ^
  88.    /* Wait till PLL is ready */: b, P* U; u$ ^7 L
  89.   while(LL_RCC_PLL1_IsReady() != 1)
    . t6 p/ z, a6 j6 \- v' Z
  90.   {; _* ]( \. E! z1 Y+ q$ Y
  91.   }
    6 U0 C% u3 l' R  m* n4 ^& p
  92. - d, `, a7 |( N8 Q; a8 r7 k0 f' i. @
  93.    /* Intermediate AHB prescaler 2 when target frequency clock is higher than 80 MHz */
    7 j' x  Y4 N! i3 ^  o+ }; x
  94.   LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_2);# n/ `+ e( W# C) B5 s9 `
  95. ( _6 D' @: @' K& |
  96.   LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL1);
    " a3 v( _/ V8 {; F- g

  97. 7 @7 @* y- H4 [  j3 _
  98.    /* Wait till System clock is ready */
      n! u9 |$ C) n  d( }5 R* k
  99.   while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL1)
    ( q- J( @( i! |
  100.   {9 u( z/ C% w6 ^7 b& ]1 X
  101.   }
    8 Q( g) O6 `% z

  102. / b+ O! c9 d: e9 R' q0 Q
  103.   /* Insure 1µs transition state at intermediate medium speed clock based on DWT*/
    $ }+ V; x! }* V: M1 S0 ~
  104.   CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;+ e: v9 m# \& O0 j1 C
  105. * Q! O+ C# z; k. |5 N
  106.   DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;6 ]! f% B$ q' v$ [7 b& o, ]6 \
  107.   DWT->CYCCNT = 0;- B4 C6 C) T5 I4 |- S
  108.   while(DWT->CYCCNT < 100);3 ]0 M( l, Z2 ^6 i* b

  109. 3 M2 I* Q9 n) L7 u7 Z
  110.   LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1);8 W% Y+ Z7 B4 Z3 g% I8 f5 e
  111.   LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1);! R) a/ S& W! `" r* y; U1 q
  112.   LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1);
    ) L( [. g; D: Z( s) _+ q4 W) s* S
  113.   LL_RCC_SetAPB3Prescaler(LL_RCC_APB3_DIV_1);( T; L; l- s; U, h8 \8 @& ^1 C

  114. + ~( v& |- N( m7 v2 _) g
  115.   LL_Init1msTick(160000000);
    , w4 B9 ]+ ]% H9 L9 ^
  116. , I' i* t) e: J3 }3 |% G- o
  117.   LL_SetSystemCoreClock(160000000);/ \5 N- s, z2 I4 E2 e8 r
  118. }
    8 s3 a9 p8 }2 p

  119. . k+ r3 }2 ?4 M& [
  120. /**; a# J2 I! H1 u& a7 y
  121.   * @brief GPIO Initialization Function" f' f1 m8 {0 p" i
  122.   * @param None
    $ ]$ W, _2 k, \3 n; m6 E
  123.   * @retval None2 d7 K( j; g  u. D7 [* S; c+ y
  124.   */% Y0 I  P3 k: y
  125. static void MX_GPIO_Init(void)
    6 W7 w( Q6 }* ]( n1 @
  126. {
    - t, T9 y( `, K% o( M, `
  127.   LL_GPIO_InitTypeDef GPIO_InitStruct = {0};3 p3 G1 x( ^1 z6 d
  128.   v" v& _2 F! G" Z  H% q  N6 a
  129.   /* GPIO Ports Clock Enable */4 }5 f; S( N5 r  z- b  v3 Y3 [  ]$ A
  130.   LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOC);* j: N  X2 I. J: B( W8 x* U

  131.   h0 K" T( O5 Z0 N+ f
  132.   /**/+ p5 b. S+ F6 X4 L) C/ u3 ~
  133.   LL_GPIO_ResetOutputPin(LED1_GPIO_Port, LED1_Pin);! Z: w' j* v: Y% O& s& v6 U
  134. - b0 ~) b+ H% @1 ?- q
  135.   /**/
    ' @' X: B6 A2 }! ~- r  P( I
  136.   GPIO_InitStruct.Pin = LED1_Pin;
    2 u. B) ?) j7 a& M2 ]! W& r! @
  137.   GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;& W. _  S/ m6 z' b. [! g9 _
  138.   GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
    " M/ ?0 w. x9 J% B
  139.   GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;( y9 N% }1 k2 C5 s9 z5 f: s- W
  140.   GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
    6 a) C, ?7 L8 J0 {4 r
  141.   LL_GPIO_Init(LED1_GPIO_Port, &GPIO_InitStruct);
    : E( V2 C& m. P& t' K$ Z

  142. 4 L9 m# \1 `* ~# T
  143. }& g: V, O7 @1 `4 \6 B
  144. 5 P3 S/ O* \! J

  145. ' D' S+ a" _9 r# x

  146. 4 {4 |+ @- c( c2 t& T, b
  147. int main(void)
    , [* E0 w, ?* P  f0 k, z
  148. {' n0 p; W3 C1 L$ P  I1 b
  149.   LL_AHB3_GRP1_EnableClock(LL_AHB3_GRP1_PERIPH_PWR);
    2 x* A0 N5 k, [- n' Y& ^( _* O
  150.   SystemClock_Config();7 F) P* v  [4 j* l0 }5 ?! K
  151.   SystemPower_Config();0 p. C) o! M  K& @) _6 c' z9 B
  152.   MX_GPIO_Init();
    5 l9 u2 Z4 N1 u/ T2 B6 ^
  153.   MX_ICACHE_Init();
      [; @' v5 a6 W( v9 q9 h
  154.   while (1)
    : n, b& ?3 W# c- N! s  m8 V
  155.   {! D  |* \$ p4 B  S+ D- N
  156.                 LL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);: G$ t( _* s: V: M* O0 ?
  157.                 LL_mDelay(500);
    5 A: A8 e" Y* E  T: U$ j0 E
  158.   }
    4 J/ Q: ]4 l' c7 q7 G8 N' n
  159.   /* USER CODE END 3 */
    # T7 g" w5 F; d# ~( X1 W8 J
  160. }
      S3 m" p: W2 f9 H$ p
  161. . ]/ u% q& @" ?7 u7 B; @
  162. & E3 o) u2 B4 t4 B8 o
  163. ' g, j0 i% J5 F! L
  164. #ifdef  USE_FULL_ASSERT9 X0 D! Q) q5 R6 @4 Q
  165. /**
    # @$ x/ l4 r" T6 K+ g  R% K
  166.   * @brief  Reports the name of the source file and the source line number
    ) k" U7 L3 V3 u2 V+ C( |& J7 U
  167.   *         where the assert_param error has occurred.# c0 J6 Q9 I$ h# ]4 j
  168.   * @param  file: pointer to the source file name
    - R* C9 @0 F4 e; J6 }
  169.   * @param  line: assert_param error line source number
    , ^  O0 {$ T4 W
  170.   * @retval None3 D8 b' ?- p6 P3 i& Q
  171.   */+ b. z" G" M7 e7 G6 L
  172. void assert_failed(uint8_t *file, uint32_t line)) E% ~2 l. R. r, O! `; O& \) i
  173. {" [  F. L) g$ E
  174.   /* USER CODE BEGIN 6 */* M4 P2 l  f+ h2 t  w# C; H  u5 Z6 e) Z

  175. 6 d5 p( U4 i, z& r* F
  176.   /* User can add his own implementation to report the file name and line number,1 k0 n3 l- L* u$ l1 I6 y6 t7 x
  177.      ex: printf("Wrong parameters value: file %s on line %d", file, line) */" a( _, C. M2 T

  178. , O6 P+ h  t: [$ c( l' T
  179.   /* Infinite loop */- a& U4 e9 d; b6 ?3 ~: {- p
  180.   while (1)
    7 ~7 P* k  L, D9 z, d( S
  181.   {/ {5 u: J5 j9 Z5 @
  182.   }
    7 k) z1 e- V; c& q) d" g
  183.   /* USER CODE END 6 */
    # G/ ]+ u( v! A
  184. }
    , p, H2 B) `# T% o1 }
  185. #endif /* USE_FULL_ASSERT */5 W  n. H" A+ V4 y
复制代码
在完成之后,编译,就可成功下载点灯,具体可查看附件。
# m2 I. d2 \" b3 ^6 _. k
03-点灯图.png
2 h5 T- Q3 q6 J4 v
好了,先分享到这,过年后来了的第一篇。

$ Y" v2 p$ i( Y+ q) b& z! T: {8 I
  b  r8 W# S% Z0 `3 z) q& w+ O" L, G2 }0 t$ d
附件:工程源码 Demo.rar (716.81 KB, 下载次数: 1)
收藏 评论1 发布时间:2023-2-2 23:27

举报

1个回答
STMCU-管管 回答时间:2023-2-3 17:15:07

期待下一篇

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