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

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

[复制链接]
shenxiaolin_mai 发布时间:2023-2-2 23:27
        说实话,我不喜欢hall库,也许很多人用起来很顺手,但是我用起来不习惯,而且LL库效率明显高得多,也许是没有接触过上层代码的原因吧,那么我就来说一下LL库的环境搭建以及点灯。
$ u& T! i9 L% ^1 s) A7 P3 m* y        我们首先根据官方的LL库以及例程做更改,新建文件夹,拷贝文件,具体如下图。
8 v% t4 b4 E8 @; O' z9 H7 D/ v% |
01-文件夹.png

6 k* {6 h" K3 S& B; Q8 H! ]
        并将文件拷贝到个个文件夹内,方便将文件归类以及后期文件管理,具体的可以看附件里,附件内的源码。具体的可以查看keil工程下的文件,如下图
3 u: ]3 Q9 `7 u
02-文件.png

4 S; `$ L; E4 w8 T. `. o2 w
文件拷贝完成之后,然后添加文件路径和初始化定义,然后增加如下代码到Main.c文件。
+ L( x5 J  S+ Z/ P% ~1 p
  1. ' M' q4 j. l. e) t# @6 ]9 m
  2. #include "stm32u5xx_ll_icache.h"5 Q# Z, H# J! K2 M. Y
  3. #include "stm32u5xx_ll_pwr.h"
    9 f# I4 H$ V/ ^
  4. #include "stm32u5xx_ll_crs.h"# i8 r8 \5 x6 B3 o! [% Z+ S- L' h
  5. #include "stm32u5xx_ll_rcc.h"* f2 ~: \4 F! U( X& P
  6. #include "stm32u5xx_ll_bus.h"0 P  Z' w) t' c! M% H, r
  7. #include "stm32u5xx_ll_system.h"+ k* x" w5 I6 O' E6 d
  8. #include "stm32u5xx_ll_exti.h"
    6 x: W: Q, M" I5 ?# K- g
  9. #include "stm32u5xx_ll_cortex.h"- n- \9 @2 R9 a3 ]+ c
  10. #include "stm32u5xx_ll_utils.h"
    / [3 X# ~3 _; {
  11. #include "stm32u5xx_ll_dma.h"
    : F& @0 V- j* ^# o+ U" c! G5 X
  12. #include "stm32u5xx_ll_gpio.h"
    1 b* ~! \. W! y5 R% v6 a: p
  13. #include "stm32u5xx_ll_lpgpio.h"
    $ j7 r3 f2 J$ u' P9 s) J

  14. , b/ {  x) P2 o# u- @9 ~

  15. / C+ m( v/ e( }+ U+ h

  16. # R; \" N: V: ]1 k8 m& X+ N
  17. 9 R. }2 I. b, M! R' Q% v) Y6 i
  18. #define LED1_Pin LL_GPIO_PIN_7
    : V, j$ o+ G. K3 T. A' X
  19. #define LED1_GPIO_Port GPIOC
    # K1 H, G( Y, P0 ]; T' I

  20. % m" b( N: M, n# @, }( }: n
  21. ' u* r6 E8 V" `! o/ u% \7 \

  22. 7 q( |( h6 F+ f( _" e$ z
  23. /**
      c4 t" W  i( v
  24.   * @brief Power Configuration' }& S' O/ ?. S; h4 K& j
  25.   * @retval None
    % P& p; F+ P$ o4 M
  26.   */! u' D+ v( n: @
  27. static void SystemPower_Config(void)
    % ^% x0 K) o# ]1 m. a# ]
  28. {% B1 B& J  X3 ?' `/ X7 h% z% |* _
  29. . O. `. ^7 w0 H% N
  30.   /*! w- ]% P7 t' F3 E4 j
  31.    * Disable the internal Pull-Up in Dead Battery pins of UCPD peripheral
    ) C) g% U; b( u% \) u
  32.    */
    ' E/ ]' G1 ]0 _1 B7 a: U% ~. C
  33.   LL_PWR_DisableUCPDDeadBattery();
    % |. c  S/ |! F6 a- {
  34. % j- k( }# J$ X  H6 y
  35.   /*
    8 z% d5 d4 A6 V0 M8 Z
  36.    * Switch to SMPS regulator instead of LDO4 l& m. Q- d9 y) z! X5 {
  37.    */7 {1 a$ A6 ^3 {/ x/ |  l) G% V
  38.   LL_PWR_SetRegulatorSupply(LL_PWR_SMPS_SUPPLY);
    6 l' e! j2 _( I

  39.   X" j6 U$ S. h' R
  40.   while(LL_PWR_IsActiveFlag_REGULATOR()!=1); @7 h1 {" |* Z* |0 Z  H: c2 b
  41.   {
    7 Y2 Y) i% N' L+ T6 E+ ~
  42.   }* ~/ u0 `% D6 C* ~7 `4 W+ J- k+ F- f/ ?
  43. }
    # y/ U9 X. @* T1 \5 A. T2 I

  44.   T! m0 @: R* j! a) n
  45. /**# Y. O. i3 J" a8 v! S4 N6 @5 \, h0 @
  46.   * @brief ICACHE Initialization Function
    # y# [/ Q+ e( e! \( u
  47.   * @param None
    ! [& o" B8 r) y! s4 s  Q
  48.   * @retval None
    9 c% J- K- B% @, m$ m
  49.   */' l1 v7 U3 ^% U% H9 F) u4 i
  50. static void MX_ICACHE_Init(void)9 F8 g- a- s  g3 q& L
  51. {
    ( ~5 x4 ^4 h3 P* B' p

  52. ; v0 C, K, i" s3 ?2 d
  53.   /** Enable instruction cache in 1-way (direct mapped cache)
    " _) A- S7 l' \3 p
  54.   */8 [8 J; x0 l# ]6 y
  55.   LL_ICACHE_SetMode(LL_ICACHE_1WAY);
    ; F: L" r/ c" _7 U4 T' v, k
  56.   LL_ICACHE_Enable();2 v& [, z, H% U, o4 a
  57.   /* USER CODE BEGIN ICACHE_Init 2 */
    2 H% S  a, l( C3 p+ O$ ~4 [

  58.   c% m! m  B# Q4 v7 m/ _  \  w* i
  59.   /* USER CODE END ICACHE_Init 2 */5 ?0 M" F; H5 `$ K
  60. / g+ x  r" A+ X" Q" b4 a
  61. }
    # i$ U1 L: h& Z* j
  62. 3 a. t" M  O+ ~! a4 O8 v% k

  63. , d8 d+ V' t+ l5 Q6 o3 Y
  64. void SystemClock_Config(void)
    # D( ~* j" n: K3 b
  65. {8 M" Z; ?/ `( K. c$ q. ^. C' C
  66.   LL_FLASH_SetLatency(LL_FLASH_LATENCY_4);6 m2 z, n' V" ]! c2 Z$ y
  67.   while(LL_FLASH_GetLatency()!= LL_FLASH_LATENCY_4)* d( \9 p! a  h6 f% ]/ ~
  68.   {
    ( x8 y  J# B0 @2 i
  69.   }5 s( X: ?6 g) L0 V  M$ d! s, d: N

  70. % R; \* j6 ~" `/ @, u
  71.   LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE1);/ n$ ~# Z/ u" o5 O/ V$ z
  72.   LL_RCC_MSIS_Enable();2 g8 N0 e5 R. h! F6 `: i1 h# c

  73. # o2 l: a' n& [( G
  74.    /* Wait till MSIS is ready */
    ) B4 [9 g, r' o
  75.   while(LL_RCC_MSIS_IsReady() != 1)
    " C: }# r: X" H' j
  76.   {
    1 z3 A  H" s+ a; U4 o
  77.   }& f: O1 m% T+ B. v# X
  78.   @/ g5 w$ D! n8 @4 d) i' c. s7 O
  79.   LL_RCC_MSI_EnableRangeSelection();+ \* H0 e, R1 z. C7 Y
  80.   LL_RCC_MSIS_SetRange(LL_RCC_MSISRANGE_4);
    : W: J/ o0 w9 n" Z* J" {7 l7 i6 `
  81.   LL_RCC_MSI_SetCalibTrimming(16, LL_RCC_MSI_OSCILLATOR_1);
    : Q& G0 B8 v4 Y7 k/ C, v& B9 m
  82.   LL_RCC_PLL1_ConfigDomain_SYS(LL_RCC_PLL1SOURCE_MSIS, 1, 80, 2);
    $ B5 P1 j4 E* r% u; v
  83.   LL_RCC_PLL1_EnableDomain_SYS();) `& J  X% G& d3 m9 ^0 F
  84.   LL_RCC_SetPll1EPodPrescaler(LL_RCC_PLL1MBOOST_DIV_1);
    . t9 B! Q, n6 A9 w
  85.   LL_RCC_PLL1_SetVCOInputRange(LL_RCC_PLLINPUTRANGE_4_8);3 ?! s' C4 m% U# I9 K! J
  86.   LL_RCC_PLL1_Enable();9 ~- H! H% z+ D+ q
  87. . O! U2 b  q+ L- m& E( `
  88.    /* Wait till PLL is ready */# p; F4 ~# I8 o1 Y) ~) V, P0 @
  89.   while(LL_RCC_PLL1_IsReady() != 1)
    # s9 L) f  b0 ?
  90.   {
    % F- l. G) H( @7 m) x* L$ v1 ^& o
  91.   }
    ) q2 |  w  ~) r1 D) B1 y; `+ v0 p

  92. 3 M" y, X$ c; Q3 z8 {. o+ u% u
  93.    /* Intermediate AHB prescaler 2 when target frequency clock is higher than 80 MHz */
    & i' f# e) J3 x4 c- I" w* Y
  94.   LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_2);0 C- m6 N7 k" z) i' \8 ~, w

  95. 5 c: j$ P! S* L! P: U
  96.   LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL1);+ R0 K# Y& s9 _7 o6 c- W

  97. + s4 }* l% g. q9 ?1 N$ e
  98.    /* Wait till System clock is ready */7 P( i* p3 u2 B+ {/ p+ V7 V
  99.   while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL1)
    1 s1 f/ t" C: v( k
  100.   {5 }6 Z1 d, S  o: U% N$ o# D8 y) N( B# |
  101.   }
    ! Q( J8 P+ e5 N+ o6 J, [+ }

  102.   q: B9 `* M0 k& Z# L% Y
  103.   /* Insure 1µs transition state at intermediate medium speed clock based on DWT*/1 l; y9 H+ w; ]- }8 g
  104.   CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
    $ W0 g7 B# Y+ b) G6 @
  105.   Z4 r) e2 ]# |. E, H
  106.   DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;. B8 E. U3 F! Z) V3 A' ?- J1 c3 v
  107.   DWT->CYCCNT = 0;
    5 y/ Z) ]& G. i. b6 J9 e
  108.   while(DWT->CYCCNT < 100);
    - m1 v/ X* m, w: r

  109. , B9 C- W( J) s' N; r" o6 e- K
  110.   LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1);: Y% |0 z" ]8 D  J+ x: y1 f, [0 K6 x
  111.   LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1);
    9 H* R9 _. A$ q4 T0 W
  112.   LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1);* j7 a! N. m2 G1 [- V: t
  113.   LL_RCC_SetAPB3Prescaler(LL_RCC_APB3_DIV_1);! }/ a; V8 S1 Y3 j9 T

  114. - l3 H& ^! E. m: N$ k
  115.   LL_Init1msTick(160000000);
    " |: r+ d/ B+ ^9 r  U7 g

  116. % {& [- ~3 I* S% O$ k
  117.   LL_SetSystemCoreClock(160000000);
    7 Z0 L# f) X% [
  118. }  z% N9 X+ d- A
  119. % P7 E  Q4 H% [0 s" `. ^/ Q$ e
  120. /**; P" f1 N9 o, _3 D
  121.   * @brief GPIO Initialization Function
    9 P. Z+ q$ R# ^/ O! ^( |3 }% S: I
  122.   * @param None" S2 F& u" o" J3 L) y. ?/ i8 t+ f
  123.   * @retval None! W- W0 h7 _! w4 ~
  124.   */. j. t, J; N, Y# ~- ?- G- i
  125. static void MX_GPIO_Init(void)0 {9 @8 p' F4 M5 k, k3 y, @
  126. {
    : }& Z7 B) K2 b
  127.   LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
    8 O* p6 s6 Q7 M

  128. 7 Z! U: o" Y9 \! h, @5 A  }8 f
  129.   /* GPIO Ports Clock Enable *// M8 R& J8 V( n# P* e9 d
  130.   LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOC);
    ; d1 [6 {: a8 }# p0 n
  131. ! P" b% w4 R5 I! j" A& V
  132.   /**/
    % k. S$ f" l7 L+ U
  133.   LL_GPIO_ResetOutputPin(LED1_GPIO_Port, LED1_Pin);
    * M" o* f- k( U/ F- w3 ^  C5 \

  134. 0 |2 B: h. J9 ]$ k
  135.   /**/
    % Z4 p2 `0 V) ~; K7 W1 c0 f2 ]
  136.   GPIO_InitStruct.Pin = LED1_Pin;: w$ s" \% X# s8 X- o* d2 M, L! L5 Q
  137.   GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
    0 y$ X. p: |# w
  138.   GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;% z& G2 y( @7 g: N
  139.   GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;: W5 G5 S$ {* f- S% J2 S  ]4 Y- `
  140.   GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
    $ B0 h; i1 l+ G7 X% H
  141.   LL_GPIO_Init(LED1_GPIO_Port, &GPIO_InitStruct);
    " `$ x4 S6 c/ ^2 G; }2 s# b$ m

  142. % L; F: V2 K7 G5 x- f# p; A4 p  a, {
  143. }
    * X! [) n: v3 `  K

  144. " s2 S8 A1 a: q9 U3 r
  145. ( [) \& x5 c5 u, E

  146. . ?+ a- Y5 p. y; |
  147. int main(void); ~0 l5 _6 I% M; ~0 @* O
  148. {9 S/ g) ]6 x: j: W; b" x" s
  149.   LL_AHB3_GRP1_EnableClock(LL_AHB3_GRP1_PERIPH_PWR);: s4 q! f: y% P0 ]9 a9 b
  150.   SystemClock_Config();
    3 S7 r3 s* r& @$ X. `% M
  151.   SystemPower_Config();
    ) e9 `- u" i' A5 k+ C
  152.   MX_GPIO_Init();! x8 s8 ^  F- S; E
  153.   MX_ICACHE_Init();4 J& T0 ^8 @" {0 Q" m. N$ Y
  154.   while (1)" L& }$ G# ]' b
  155.   {
    ! Q# ^, z; j, z5 G' ~! A
  156.                 LL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);/ R! G$ p8 q% B  W$ m) d
  157.                 LL_mDelay(500);- H  \: W) g/ {# D2 ]2 q
  158.   }' Z; U* J( u9 N& O' G( T
  159.   /* USER CODE END 3 */
    6 v0 I" Z5 r; ]4 U) J
  160. }
      u. E5 u  q( W, Z% p  k

  161. 4 V2 S2 `& ]9 D6 z
  162. # z& m0 \# E1 K2 }

  163. : j* ?" W+ e; U
  164. #ifdef  USE_FULL_ASSERT
    $ H: {8 i: w6 A/ t# b% x) a9 T8 k
  165. /**
    2 q6 d, A2 j9 G( W
  166.   * @brief  Reports the name of the source file and the source line number. R& D, [0 C- A! A7 T
  167.   *         where the assert_param error has occurred.) J" Z: a' H4 z* _
  168.   * @param  file: pointer to the source file name
    ; K) ?8 q) b  V/ M; O) h8 ~
  169.   * @param  line: assert_param error line source number
    6 H- h$ j- X- t2 t6 X
  170.   * @retval None5 d& C9 [  V. D
  171.   */1 @/ A" l3 S8 I0 E. e& F2 j3 w
  172. void assert_failed(uint8_t *file, uint32_t line)! R8 A6 P( c4 R7 v
  173. {: \  e1 L- t, f
  174.   /* USER CODE BEGIN 6 */6 X8 p1 B5 Q, D" |: P2 d9 j! v( A
  175. ) o. J3 N+ J8 ?) d! y
  176.   /* User can add his own implementation to report the file name and line number,3 a4 P* o! e6 V" r% \, t/ j$ @7 z
  177.      ex: printf("Wrong parameters value: file %s on line %d", file, line) */4 P( X; w, P3 b0 ], w
  178. : A  Y6 d* r3 }2 @1 S8 o2 t* W
  179.   /* Infinite loop */
    9 G3 K6 @8 s& E' W  H
  180.   while (1)
    . [/ h' d& I5 o, F* H8 ~
  181.   {
    7 w9 P& G; Y9 O
  182.   }4 }. {" l+ H( {' u' C7 a2 c, _0 K" Y9 M
  183.   /* USER CODE END 6 */
    / w7 t9 D2 E( ^  G
  184. }0 E) J( j( w9 w$ Y9 G+ l! P
  185. #endif /* USE_FULL_ASSERT */
    / i! ?6 C1 L& u9 X+ i# D2 O& G/ Y
复制代码
在完成之后,编译,就可成功下载点灯,具体可查看附件。
' |8 b2 s4 t4 v. r
03-点灯图.png
$ H: r6 l% f5 A
好了,先分享到这,过年后来了的第一篇。
- G5 Q3 t  W+ @8 @" x
# N, x7 O( z  Q$ a+ T: W; E0 x
" Y7 w& w0 b, D) L' W
附件:工程源码 Demo.rar (716.81 KB, 下载次数: 1)
收藏 评论1 发布时间:2023-2-2 23:27

举报

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

期待下一篇

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