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

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

[复制链接]
shenxiaolin_mai 发布时间:2023-2-2 23:27
        说实话,我不喜欢hall库,也许很多人用起来很顺手,但是我用起来不习惯,而且LL库效率明显高得多,也许是没有接触过上层代码的原因吧,那么我就来说一下LL库的环境搭建以及点灯。
' w5 p8 U- W7 |9 ?. }3 c+ J8 n        我们首先根据官方的LL库以及例程做更改,新建文件夹,拷贝文件,具体如下图。
1 U, s1 q) u. [; I8 U0 o. W0 }
01-文件夹.png

) {9 b3 B3 U  G+ p4 W% C9 q
        并将文件拷贝到个个文件夹内,方便将文件归类以及后期文件管理,具体的可以看附件里,附件内的源码。具体的可以查看keil工程下的文件,如下图
: t7 z- q# }( x; {
02-文件.png

3 t; }, r7 M& S6 U# i6 J9 p
文件拷贝完成之后,然后添加文件路径和初始化定义,然后增加如下代码到Main.c文件。

# r/ e4 g# w: [) B

  1. 7 [- r/ G" X5 G# P( u- U. I3 H6 t
  2. #include "stm32u5xx_ll_icache.h"
    + E  x1 [% ^: F1 f
  3. #include "stm32u5xx_ll_pwr.h"
    * |; ^: U, ]: z1 K3 q: s4 H6 U
  4. #include "stm32u5xx_ll_crs.h"8 U6 S! B8 u: t6 w8 D) w
  5. #include "stm32u5xx_ll_rcc.h"
    5 h* f4 q% @+ G- `7 r6 W
  6. #include "stm32u5xx_ll_bus.h"
    1 b3 o" A5 i3 R& ]0 X
  7. #include "stm32u5xx_ll_system.h"/ f2 x4 {$ \+ K
  8. #include "stm32u5xx_ll_exti.h"
    & Y2 T. u# X: @. x- p3 q' a
  9. #include "stm32u5xx_ll_cortex.h"
    ! s0 K% p, F9 |: Q) n( \* [$ b. e
  10. #include "stm32u5xx_ll_utils.h"
    7 }* J) x# _; `3 b3 B3 B5 V
  11. #include "stm32u5xx_ll_dma.h"$ A2 a- n% Q2 W0 o8 v, h6 P; s
  12. #include "stm32u5xx_ll_gpio.h"& @8 B, k, U, [
  13. #include "stm32u5xx_ll_lpgpio.h"
    4 M4 i# I+ x( h, c$ e; [

  14. 7 J0 e% V/ X) @& c, J. H0 i' ^
  15. 7 O- I1 u% e, d

  16. 1 Q6 X6 s' u& Q

  17. / ?0 D/ \1 U) Y3 f) \# ^1 q; q
  18. #define LED1_Pin LL_GPIO_PIN_7
    / Y; z) E( T" ~3 j! }
  19. #define LED1_GPIO_Port GPIOC) z. V1 Y8 g, y  }9 J

  20. % Z- \$ B8 N- K/ ~# R

  21. , h) V" w  X" N4 z3 _
  22. ! F8 P! ^3 x7 b% Y, {+ O
  23. /**2 m" p+ W) T/ w9 d
  24.   * @brief Power Configuration4 `$ I% X  a" K  t. W/ [. z; X
  25.   * @retval None
    : F: ^" K1 E& r& W  s+ D% q6 N
  26.   */" ?; G' n  E$ w) n$ h. @
  27. static void SystemPower_Config(void)) O7 z. u: m0 K* M; q
  28. {! R. b1 ~  @0 B* n! J; Q
  29. 2 m0 G( C4 P; D6 S9 s! H
  30.   /*
    9 Z& R1 R. R1 @! W9 {9 X; S
  31.    * Disable the internal Pull-Up in Dead Battery pins of UCPD peripheral' o2 d# d+ r* U" l
  32.    */
    9 b( w8 f6 F3 |2 r+ S  f- S
  33.   LL_PWR_DisableUCPDDeadBattery();
    % l5 y( E7 Z* P, J' y% e9 I

  34. 3 D/ V/ o, G% q
  35.   /*
    , E5 H& W& C$ E( R% M; I) ~
  36.    * Switch to SMPS regulator instead of LDO
      [8 W5 P8 m" |* m* ^' B2 y0 I4 u
  37.    */
    . E+ U4 ?/ V8 ?. C1 p8 E
  38.   LL_PWR_SetRegulatorSupply(LL_PWR_SMPS_SUPPLY);6 C9 x; c2 k5 A5 H. a+ p* M1 ~
  39. . g" N! G- k$ W( [9 \: d
  40.   while(LL_PWR_IsActiveFlag_REGULATOR()!=1)
    7 s" f0 W" a) S9 Z
  41.   {
    4 `, {! j, b% ]% F% p) c. h
  42.   }
    0 u; Z+ G4 b, k, P& P0 A
  43. }3 A/ u: \$ b3 v& E
  44. + t; y; S( T/ m7 c5 @
  45. /**
    ( b4 {4 R1 w* ^# e9 Q6 F9 {  U9 w
  46.   * @brief ICACHE Initialization Function
    7 E% K7 `0 A; b* @% K9 A
  47.   * @param None
    6 E* A- [9 R; A$ X2 y0 ^
  48.   * @retval None, j6 q9 A( f. ^5 Z& H3 @7 m
  49.   */$ a, F$ Q6 w) M- Q
  50. static void MX_ICACHE_Init(void)8 F* a& s4 S. k( i) h
  51. {. u" H/ T5 K. }, L( u- K

  52. 0 d. b3 p' w  H, E
  53.   /** Enable instruction cache in 1-way (direct mapped cache)
    / N# Y' z2 i" J4 ~1 x& O
  54.   */
    5 k- S) g( _4 O6 Z  _# u
  55.   LL_ICACHE_SetMode(LL_ICACHE_1WAY);' G( F" _3 ^9 M/ F$ y3 ]" v- R; t
  56.   LL_ICACHE_Enable();* d: J$ Z2 @% a' M, E: ~' B# R9 S1 B
  57.   /* USER CODE BEGIN ICACHE_Init 2 */: _3 ]$ k" o2 O" X- o* O: B

  58. 5 G0 U' |  w$ a
  59.   /* USER CODE END ICACHE_Init 2 */
    # l. {. t: h# O! p
  60. " v) Z7 e$ m: I" d' Y- m! p
  61. }
    $ [9 l+ X' G8 T* F; ~+ i) c* Q  U2 X

  62.   t9 o5 ~* a# k/ s4 N

  63. 1 \" |, F- g5 ~& _
  64. void SystemClock_Config(void)
    . _3 U+ t, L, r. u6 Z
  65. {8 k) }9 g% V# I4 v* \
  66.   LL_FLASH_SetLatency(LL_FLASH_LATENCY_4);
    ) O* O- h+ p# g8 c: M6 J
  67.   while(LL_FLASH_GetLatency()!= LL_FLASH_LATENCY_4)
    # U7 P6 @" A4 u/ {
  68.   {
    # ]! P- }" z% J0 b$ O) B
  69.   }0 @3 O0 z" G3 ]0 r$ d( x, x

  70. + Y. ]2 E8 U4 W7 O3 ~+ x6 f; i
  71.   LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE1);
    4 Z- ]' M+ l- e, T
  72.   LL_RCC_MSIS_Enable();
    0 Y. Q: j- V1 b; B" w7 M1 {( a: s
  73. 2 K" @, X. p3 d1 z  y
  74.    /* Wait till MSIS is ready */; h, W  Z" W- k+ E
  75.   while(LL_RCC_MSIS_IsReady() != 1)
    7 |; ^: Y% a7 V7 _" e. Q1 U% B  b# h
  76.   {
    ( `2 E7 {/ T. A' t
  77.   }" {. ?8 W2 q7 \  h5 k1 X/ q
  78.   ?( L: c! ^+ L
  79.   LL_RCC_MSI_EnableRangeSelection();8 e& J; \# v' M5 e4 m
  80.   LL_RCC_MSIS_SetRange(LL_RCC_MSISRANGE_4);
    - f" R: I( Y, C+ {% F
  81.   LL_RCC_MSI_SetCalibTrimming(16, LL_RCC_MSI_OSCILLATOR_1);( X. o6 r! C$ u/ p
  82.   LL_RCC_PLL1_ConfigDomain_SYS(LL_RCC_PLL1SOURCE_MSIS, 1, 80, 2);
    ' l# ^& w  Y& b
  83.   LL_RCC_PLL1_EnableDomain_SYS();
    - R5 T& N' x5 H
  84.   LL_RCC_SetPll1EPodPrescaler(LL_RCC_PLL1MBOOST_DIV_1);
    : D6 k* a9 T6 l! A
  85.   LL_RCC_PLL1_SetVCOInputRange(LL_RCC_PLLINPUTRANGE_4_8);; R! \0 Q' H8 D/ w- N9 C/ s( e
  86.   LL_RCC_PLL1_Enable();7 m. C) K/ l4 {9 C

  87. 7 C* m( ?7 y8 C; W
  88.    /* Wait till PLL is ready */
    ) G8 D( s; P# l$ b; W! L
  89.   while(LL_RCC_PLL1_IsReady() != 1)1 A+ a* X/ n/ S+ e: m2 [8 c
  90.   {
    . B2 N( k7 P: {( i6 B
  91.   }
    5 \6 Y, _6 s! @6 j, B0 ^4 i8 v) W# y% ]

  92. 5 N1 L5 Z& V" k0 M5 H
  93.    /* Intermediate AHB prescaler 2 when target frequency clock is higher than 80 MHz */; V+ E) X! k% ~: {; a( B+ _
  94.   LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_2);2 Y( c, L) X# O7 e7 z1 Y2 F$ F9 ]

  95. 8 @1 y& }+ P- a: J) V" j
  96.   LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL1);7 D, p, B/ [/ c* V+ F6 z5 A
  97. 1 r' k5 v8 \' o( B+ Z( ^/ ~; L4 ?" E
  98.    /* Wait till System clock is ready */
    % W, c# x: k$ m6 |
  99.   while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL1)( D) K8 h8 v3 R2 k( f" o* W0 j
  100.   {
    7 x+ g/ b$ y% D9 ^1 ]5 r9 m
  101.   }' L  d0 l7 N, ~

  102. ! ?4 X9 G& Z$ _, x3 ~
  103.   /* Insure 1µs transition state at intermediate medium speed clock based on DWT*/
    5 h( i* |4 e, W
  104.   CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;7 Q3 C1 x" o6 {* K

  105. " x5 _5 |( Y$ y/ s! k& E: S
  106.   DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;( U  v) U+ L* Y3 j# Y. H
  107.   DWT->CYCCNT = 0;9 Z( w* B! d" D# _
  108.   while(DWT->CYCCNT < 100);- f# S; ~+ d5 ?* l, h' h% G2 B
  109. ' n% K$ a# \0 w0 V9 Z
  110.   LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1);
    9 b8 l  x- b7 e
  111.   LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1);
    - o+ y+ n8 {" ]/ `
  112.   LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1);
    5 \1 i% I6 R2 d+ j$ t) p/ N- U0 k
  113.   LL_RCC_SetAPB3Prescaler(LL_RCC_APB3_DIV_1);
    ! P% P# d( o: ^# R0 v. ^7 a3 r1 Q

  114. 8 k; L/ g, R2 L. C. U$ ~
  115.   LL_Init1msTick(160000000);
    % I4 C& O+ J* q) U) M* ?

  116. ( P3 N; ^& R" E9 v8 G) x, g3 `
  117.   LL_SetSystemCoreClock(160000000);
    2 ?" b- U) [# ~- A. K" Z
  118. }. q8 f/ z' e/ X4 W4 q5 r% z! f

  119. 5 j2 l8 F- g5 n7 t' _5 K1 D
  120. /**
    * J4 ?/ [8 x1 I
  121.   * @brief GPIO Initialization Function
    2 K% M$ `. f0 ^' |( ^" a8 t
  122.   * @param None! N+ n  B, B; N3 I
  123.   * @retval None
    9 {8 a' q# _8 a) i
  124.   */' c7 A6 h" u/ z+ D
  125. static void MX_GPIO_Init(void)
    $ a0 m" Z- `% q! [+ X1 }# ^
  126. {- m9 S* A8 j( u  ^
  127.   LL_GPIO_InitTypeDef GPIO_InitStruct = {0};3 l, t0 }8 {. S: J- Q) Y% `

  128. + _0 Q1 F. c. B3 p) r% Y3 `
  129.   /* GPIO Ports Clock Enable */
    $ K* ?, b, K0 G. ~4 ^8 E& D8 v
  130.   LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOC);; J  W& O. m7 M" n% G& ~- S

  131. ) M2 E, i% I: C1 g6 n2 t
  132.   /**/4 Y+ M& x  W  C) L% N1 R5 @
  133.   LL_GPIO_ResetOutputPin(LED1_GPIO_Port, LED1_Pin);" u2 a1 J1 ?0 Q! _" ?( R
  134. ' W. h4 Z- P+ d6 J% d
  135.   /**/
    ; w- q) B7 X7 P; O& r2 Y( j+ g
  136.   GPIO_InitStruct.Pin = LED1_Pin;
    4 _) A9 n7 a  w) n+ @/ e' |
  137.   GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;0 w% z) T0 Z) N  w
  138.   GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;2 C* b$ h7 G8 |6 I: v3 u
  139.   GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
    / b% T0 z) ~; i3 A- L! {8 F5 X+ M
  140.   GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
    4 R9 B7 W; g6 o+ t3 W9 c+ i9 f
  141.   LL_GPIO_Init(LED1_GPIO_Port, &GPIO_InitStruct);
    + T/ N! i( |6 ~$ D  N8 f$ o
  142. / W1 b7 R$ q! y! J* Q) j
  143. }6 T, p. ~7 W8 t, L  F3 z( K0 ^
  144. + K5 G5 i8 s1 O3 ~) x4 m
  145. $ I) }2 P* h* p, O; d' T

  146. - W. r: v$ a* h4 x
  147. int main(void)
    - N9 S7 d! Z1 V3 R6 N" Y4 w
  148. {$ x7 Q: |% U) t" ]2 ^0 K2 d
  149.   LL_AHB3_GRP1_EnableClock(LL_AHB3_GRP1_PERIPH_PWR);
      Y% x5 w* w0 `0 N0 G
  150.   SystemClock_Config();: T( K  K% ?. j5 c' {7 d
  151.   SystemPower_Config();; v$ ~' q5 ~- e7 X. [4 s9 O
  152.   MX_GPIO_Init();" I- k8 ]. ^" T) _; E
  153.   MX_ICACHE_Init();9 i0 R) N' D7 F/ N2 w; ^! d  ~5 v
  154.   while (1)3 N0 C. M% c2 C1 z  c' p
  155.   {
    . q' C. x% ?! G4 t8 I( t
  156.                 LL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);" A) t2 a3 i7 T7 \: g# \7 {- T
  157.                 LL_mDelay(500);7 c0 ?; H6 f! L7 h- y8 }
  158.   }
      }  H0 X7 s. m3 s; S
  159.   /* USER CODE END 3 */3 y4 g# y. w& c! k
  160. }
    9 f9 S, a, Q0 W' x

  161. / f: ]) d% l0 J) L+ l$ S) }% r
  162. $ I: N3 s: `- q/ Z

  163. ; `% f3 L, H' S9 {
  164. #ifdef  USE_FULL_ASSERT
    % m$ E3 z5 U8 F0 `
  165. /**
    7 w8 e' T7 Z+ s- n
  166.   * @brief  Reports the name of the source file and the source line number( C1 N% @5 j8 N4 M/ k
  167.   *         where the assert_param error has occurred.
    8 E" F  F# U% ?
  168.   * @param  file: pointer to the source file name5 m% U) c- t4 {( a8 Q$ y+ P! j
  169.   * @param  line: assert_param error line source number, d2 Y( v, j- C) d( r
  170.   * @retval None
    , @8 K7 ^4 r# Q/ z' D
  171.   */
    3 [. J0 e( K5 d/ U( v
  172. void assert_failed(uint8_t *file, uint32_t line)
    * `- u. g8 ]% J- l' B6 v2 K
  173. {2 @  v% }- i$ j; J' J1 f
  174.   /* USER CODE BEGIN 6 */) A% d- I- p1 c

  175. / E, b# M& [+ K- K
  176.   /* User can add his own implementation to report the file name and line number,
    1 j; l8 [$ T& s2 @6 y# k8 y& ]
  177.      ex: printf("Wrong parameters value: file %s on line %d", file, line) */
    : L- m9 w+ ^. s# t& `1 \- q, f
  178. . n! E/ O& Z: F" \1 w. ~" L
  179.   /* Infinite loop */& m+ b8 j  ]! x$ S0 e! a9 H! [+ W( c
  180.   while (1)9 F% u: V2 k; C  J% ]
  181.   {
    4 m( p5 S6 h0 p9 Q* Q
  182.   }
    " x: d7 e9 x2 R, k- L4 d$ ~" C
  183.   /* USER CODE END 6 */
    ' J( W& A& ^- x0 S: s
  184. }
    6 Z6 r& ?% O/ {$ J: ^$ t5 p! S+ N% F
  185. #endif /* USE_FULL_ASSERT */# h2 G! u  J8 o9 d
复制代码
在完成之后,编译,就可成功下载点灯,具体可查看附件。

9 [8 b# S' u8 P) Q; G' Q
03-点灯图.png
" H* l/ D' {% p
好了,先分享到这,过年后来了的第一篇。

( U  Z  ?1 g9 t* t7 _  @- {1 q8 U4 z, m  _$ N6 S- ^  h
) C' K" Z; O! F: O
附件:工程源码 Demo.rar (716.81 KB, 下载次数: 3)
收藏 评论1 发布时间:2023-2-2 23:27

举报

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

期待下一篇

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版