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

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

[复制链接]
shenxiaolin_mai 发布时间:2023-2-2 23:27
        说实话,我不喜欢hall库,也许很多人用起来很顺手,但是我用起来不习惯,而且LL库效率明显高得多,也许是没有接触过上层代码的原因吧,那么我就来说一下LL库的环境搭建以及点灯。; s% e" ^* y; B" [; @
        我们首先根据官方的LL库以及例程做更改,新建文件夹,拷贝文件,具体如下图。
  Q, L& [! t- ~& q
01-文件夹.png
* d4 w& {. L6 ~  z
        并将文件拷贝到个个文件夹内,方便将文件归类以及后期文件管理,具体的可以看附件里,附件内的源码。具体的可以查看keil工程下的文件,如下图
* h0 `4 r; ~) U. z. t
02-文件.png
/ |! v' e  s* t/ v; j: Q7 U
文件拷贝完成之后,然后添加文件路径和初始化定义,然后增加如下代码到Main.c文件。
/ T( N5 h/ e' V0 \, q, f/ h

  1. * u: R9 K7 _6 e: G: v, q$ [
  2. #include "stm32u5xx_ll_icache.h"
    ' A  v, `, p8 ?( e1 Q9 H
  3. #include "stm32u5xx_ll_pwr.h"0 I# B# h9 T7 V7 r& W. e& P5 c! ]
  4. #include "stm32u5xx_ll_crs.h". E2 ?2 G2 d2 G7 t: f
  5. #include "stm32u5xx_ll_rcc.h"
    4 k' n& m+ i4 K  v6 ^- Z6 F
  6. #include "stm32u5xx_ll_bus.h"" B% R" R0 J$ {
  7. #include "stm32u5xx_ll_system.h"
    9 }. f! @5 Q( G, E* W* m  w
  8. #include "stm32u5xx_ll_exti.h"2 W/ q3 R1 L) L4 d5 }- r: q% g+ G. B
  9. #include "stm32u5xx_ll_cortex.h"
    2 f. @9 Q6 E2 W& f4 D0 d* ^" C
  10. #include "stm32u5xx_ll_utils.h"8 M" R' Q8 f% ]7 H
  11. #include "stm32u5xx_ll_dma.h"
    + C4 [/ a; G' m$ p/ y" N* R0 X/ Q
  12. #include "stm32u5xx_ll_gpio.h"
    7 A. G& B# k( L0 a2 p
  13. #include "stm32u5xx_ll_lpgpio.h"& \0 R* c# t" U9 n2 r, }
  14. 6 d; K# ^" x: \( D1 i

  15. ' f9 \7 H$ E7 D: ~* z- u7 Q
  16. : z" {4 `1 @' V% T

  17. . n) r* m" f$ V2 ]
  18. #define LED1_Pin LL_GPIO_PIN_78 T! i5 a% F$ l% N. L3 q, l7 k& j
  19. #define LED1_GPIO_Port GPIOC
    9 t+ G% i" _: c

  20. 5 B) f; z4 Q/ b" p+ ]* \, S) V5 y

  21. : J3 ~' r; v" S
  22. # C! R0 Z; o& \8 Y; i5 K6 q! N
  23. /**/ n; ?) @. G9 I! T- U! T
  24.   * @brief Power Configuration0 h  l! \  [; K1 ~7 O
  25.   * @retval None
      G) F2 R) q" v7 O
  26.   */6 l* s# x6 W" @+ n" s' v* p
  27. static void SystemPower_Config(void), O% l, a5 Q; D& v9 S9 u& s
  28. {/ s7 j2 z' j: h' X7 Z- S( J

  29. 3 I/ M7 b1 J5 v( H- _$ R
  30.   /*
    " c/ I1 k5 ~" L' H0 z8 O# K1 v
  31.    * Disable the internal Pull-Up in Dead Battery pins of UCPD peripheral
    1 Z% \/ r8 @$ W2 Y9 _0 [8 r$ O
  32.    */
    ) M% t% Z" y7 t5 g6 P" ^. U2 `8 t
  33.   LL_PWR_DisableUCPDDeadBattery();
    ) L3 }8 v: \; H, T7 B7 a# G
  34. ) w! ]5 ~$ b- l' i/ N7 |" [
  35.   /*
    : b/ x4 Y0 Z( a+ Y! e
  36.    * Switch to SMPS regulator instead of LDO
    * m) H( N! k" T) r, `  H/ V. R
  37.    */3 Y! F4 J0 q! w( f
  38.   LL_PWR_SetRegulatorSupply(LL_PWR_SMPS_SUPPLY);
    ) J" M) Q+ M: M2 f. @
  39. , P) V) M1 v: V$ S1 ]" b) S- [, M
  40.   while(LL_PWR_IsActiveFlag_REGULATOR()!=1); K. Z+ o$ h. |4 k8 J8 k9 f2 x
  41.   {
    9 n1 F  [8 V  }. B2 k
  42.   }7 D" p, }" `8 E" z8 G
  43. }" [3 J3 u$ Z. X  F( v

  44. " j, S; F& v+ n2 g7 Z9 e
  45. /**! p( O/ H& J0 G, i- J5 H
  46.   * @brief ICACHE Initialization Function1 Q6 T# Q2 {' [6 Z4 b5 d/ q
  47.   * @param None
    , f% S- U) `% S8 X6 j7 Z) @0 U
  48.   * @retval None( _. H% r+ B* c, Q1 I0 x6 {
  49.   */
    1 e7 k$ e9 A3 R5 Q
  50. static void MX_ICACHE_Init(void)
    . |5 L8 s6 L/ \4 [/ R& M
  51. {8 R! Y! |  Q* I/ k+ [3 R2 p- C
  52. ( W! z/ F3 d( M' ~0 R
  53.   /** Enable instruction cache in 1-way (direct mapped cache)
    ! ~3 ]8 U& h2 O7 |* M9 \
  54.   */& W. U: K- \# N) j6 E3 D
  55.   LL_ICACHE_SetMode(LL_ICACHE_1WAY);
    2 d1 c1 j+ E" q( g6 \
  56.   LL_ICACHE_Enable();- ^3 Q7 R5 f! r& E$ c2 n
  57.   /* USER CODE BEGIN ICACHE_Init 2 */4 `6 e) K% E* \/ I! W" t

  58. $ H& Y+ p9 P' h0 V- z
  59.   /* USER CODE END ICACHE_Init 2 */- y) h0 g7 q6 ]8 f" O. R

  60. ' G6 j! S  ]/ w5 P2 D! Z
  61. }
    " Q% g" ^/ ?. f% s
  62. 2 Y4 I/ Z  B0 L* R' f9 B
  63. - s" {& P4 E# \7 Y" E$ n
  64. void SystemClock_Config(void)& @3 W. p; b- j; ]4 {' x0 |  q
  65. {
    6 N8 T- o, i0 l; o
  66.   LL_FLASH_SetLatency(LL_FLASH_LATENCY_4);
    0 C& d7 ~9 V/ `% y& w
  67.   while(LL_FLASH_GetLatency()!= LL_FLASH_LATENCY_4)
    & C- ]  Y* j3 O8 b7 t. `1 I" Y, }
  68.   {
    : {8 X6 v$ {5 Q/ q6 T: }" Z* [2 \, D
  69.   }
    0 j1 b  R; w# c8 v
  70. ( j$ U/ W; ]% K, n6 ^/ j
  71.   LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE1);
    7 I: }( z' G7 x, E. R  H/ k
  72.   LL_RCC_MSIS_Enable();. K: [+ k5 d& |; R4 V. {

  73. 6 y+ |' K; A% n, Z. g9 A6 M
  74.    /* Wait till MSIS is ready */3 R" E5 K2 [. Z9 r2 {8 z
  75.   while(LL_RCC_MSIS_IsReady() != 1)4 |8 r5 C# p( Z5 Q: d
  76.   {! M1 _, d9 D( F% l) V( i
  77.   }7 @% j9 p, Z( \, V( N# A/ }
  78. 0 C8 Z8 N6 I7 I5 V( ^
  79.   LL_RCC_MSI_EnableRangeSelection();
    ' Q& U; ]0 w& L7 g4 S. ]
  80.   LL_RCC_MSIS_SetRange(LL_RCC_MSISRANGE_4);  t0 x" ?  g/ {; X8 ]0 z+ R) p3 ^8 R
  81.   LL_RCC_MSI_SetCalibTrimming(16, LL_RCC_MSI_OSCILLATOR_1);5 k4 _* B0 P: e* w/ O
  82.   LL_RCC_PLL1_ConfigDomain_SYS(LL_RCC_PLL1SOURCE_MSIS, 1, 80, 2);
    - w) }7 z$ [7 l% |
  83.   LL_RCC_PLL1_EnableDomain_SYS();, b1 @6 \! N% o% `' O9 |8 E$ F- v
  84.   LL_RCC_SetPll1EPodPrescaler(LL_RCC_PLL1MBOOST_DIV_1);3 m/ b! J' |6 |8 o4 V
  85.   LL_RCC_PLL1_SetVCOInputRange(LL_RCC_PLLINPUTRANGE_4_8);+ j6 x- _6 T7 E: K
  86.   LL_RCC_PLL1_Enable();
    5 A+ j- B% K' c) F
  87. ' ~3 }, |# ]5 \8 H% L; n
  88.    /* Wait till PLL is ready */! e/ O3 L7 s* C3 X; W/ b- L" [
  89.   while(LL_RCC_PLL1_IsReady() != 1)) B' o$ V" w  L! r
  90.   {
    ' d) E' n3 y. U
  91.   }
    , s5 T3 T( e/ m6 G

  92. 7 A  l4 g+ M# r% q* Z; Q& P9 ]5 P
  93.    /* Intermediate AHB prescaler 2 when target frequency clock is higher than 80 MHz */
    . N1 Q( h. }# {
  94.   LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_2);8 `( z8 d7 l* ]  l
  95. + u; ~. {3 e( @: r8 m3 x
  96.   LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL1);; E2 c. X. O) j* k7 }; F# t. ?* e' j
  97. 1 R0 a# m# V+ t% E$ c+ ~
  98.    /* Wait till System clock is ready */$ w' a  t$ M0 n6 n* r: \
  99.   while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL1)
    / A6 C$ y- Y: J: X* q" K
  100.   {
    1 X7 B9 b4 q+ @( _) `0 b; e' H
  101.   }
    # }" x$ [) g: a' S& X5 j

  102. ( d2 h1 s4 N( ~3 l7 i
  103.   /* Insure 1µs transition state at intermediate medium speed clock based on DWT*/! i5 d* R8 {& G, q
  104.   CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
    : b8 q1 p2 q7 ]; b) C
  105. 0 m' _, w6 f. _: }: C. s: A* [, o
  106.   DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;$ x, k% {+ p) l  r4 a
  107.   DWT->CYCCNT = 0;" b9 H1 a5 k* _# N
  108.   while(DWT->CYCCNT < 100);$ \, t8 c  a0 @& Y- H/ f

  109. # V% \4 b7 F$ ~* ~1 M
  110.   LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1);% C$ B( a1 j+ ^, |) l
  111.   LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1);( u. M4 ?3 z& u) \" f
  112.   LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1);
    " Z8 T/ G# ]* k5 C
  113.   LL_RCC_SetAPB3Prescaler(LL_RCC_APB3_DIV_1);
    , r: T3 W, o1 s; @+ S

  114. 2 ]- A  V. B: z3 N, I+ c
  115.   LL_Init1msTick(160000000);
    ' T- z+ o7 D0 Q0 X4 K4 u0 W% i7 |
  116. 0 O+ j- I4 B4 }; ~
  117.   LL_SetSystemCoreClock(160000000);
    ' E# F: |1 j# ?7 i5 ]* ]/ ?% J* ]
  118. }
    : i4 v  m/ O9 l( U4 i! R

  119. $ P+ `* q5 d- n0 k
  120. /**
    / F5 `; c5 U" w" _% y# o+ u% r
  121.   * @brief GPIO Initialization Function; V5 J4 k1 B! F' c+ j, }
  122.   * @param None) X0 F4 v" K, ?& ^" s
  123.   * @retval None
    % K9 E# S8 M( d# D, F' N
  124.   */
    3 H) i. A: _3 P6 c6 S
  125. static void MX_GPIO_Init(void)
      v9 j: s+ b7 J, g
  126. {
    % Y  q2 R2 q- _" {9 i& H" r
  127.   LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
    4 D/ s# h5 n: O: p% E1 v5 [

  128. 8 |& J2 c1 d2 O7 Y) e
  129.   /* GPIO Ports Clock Enable */' L; q5 X" q! c9 S0 ]0 h
  130.   LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOC);
    3 m9 v" @9 ]& a4 w$ A# d( r3 U, H
  131. 0 \: f7 x. n# K( P, Y
  132.   /**/
    % P; \6 f3 H9 y3 r, J
  133.   LL_GPIO_ResetOutputPin(LED1_GPIO_Port, LED1_Pin);
    7 B. u. E( D9 T
  134. - S9 X2 |% Y% J& O0 Q
  135.   /**/
    ; d' j5 J$ H7 H) u8 w+ f
  136.   GPIO_InitStruct.Pin = LED1_Pin;5 `  u  M# u) s0 V4 q
  137.   GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;  v" @7 [2 p/ v) k
  138.   GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
    ' V' d: J1 J! d& z# m7 O
  139.   GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;- M; S3 s8 I# z4 R+ L7 e
  140.   GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;- n0 r; C7 O7 |
  141.   LL_GPIO_Init(LED1_GPIO_Port, &GPIO_InitStruct);
    # ~& m4 \$ W9 N' R7 |8 W- o) C
  142. $ H  [' y1 U4 Z5 C2 w3 o3 W
  143. }4 F6 Z! ~  k' h" H

  144. 9 [, W: R  H/ O8 D; a" E  o2 \

  145. ' Q$ x7 m- z& A) l, C# i
  146. ; w3 o+ @& F: Y  I2 u
  147. int main(void)
    - Q" W/ V9 ^* B$ q: j+ n( N: w
  148. {$ |2 g; V# c8 ?9 O  F' d; T7 e
  149.   LL_AHB3_GRP1_EnableClock(LL_AHB3_GRP1_PERIPH_PWR);
    8 }+ b) U+ {9 b1 |
  150.   SystemClock_Config();$ M; I" Z9 p& G! b$ ]
  151.   SystemPower_Config();
      v  R, v/ [; q3 b
  152.   MX_GPIO_Init();' B4 I/ D. S; ]& ]* I! T6 z" C
  153.   MX_ICACHE_Init();
    / D; g! {3 [" x$ H& x
  154.   while (1)# W1 T( e' m. Y/ c
  155.   {' b7 h. t$ S3 ~1 g$ t
  156.                 LL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);: ~" |6 z9 F& N, U  C$ R( D+ L
  157.                 LL_mDelay(500);
    $ t$ b; e% I  T0 P$ b8 G' E$ O
  158.   }
    % k5 B5 k3 c# d/ Y* Y0 h+ L
  159.   /* USER CODE END 3 */$ M' O3 d+ F" Q5 {8 S
  160. }4 ^2 t/ V1 c0 d; B# q' P5 J/ U) F  e5 {

  161. : `( P) M8 b1 a' P  t
  162. 7 F4 K9 m5 Y+ Y0 r( [

  163. & O6 S; ~5 t2 S0 m; d1 {' ^7 |
  164. #ifdef  USE_FULL_ASSERT8 }2 L5 C+ _" M) ~
  165. /**8 @6 V8 Z: h1 V
  166.   * @brief  Reports the name of the source file and the source line number
    2 e' x6 b( X+ A9 p2 n3 A& v% ?$ ?
  167.   *         where the assert_param error has occurred.
    % c5 u- n& h$ u' a0 W. a8 [) j7 M
  168.   * @param  file: pointer to the source file name
    " z! F2 u+ }% m
  169.   * @param  line: assert_param error line source number# v# n, K7 K3 R% x
  170.   * @retval None, m- E. n- }5 J0 b, G* f7 M
  171.   */
    3 ]. P/ V, Q. [9 a5 X
  172. void assert_failed(uint8_t *file, uint32_t line)
    " n" Q$ {+ n- f4 G/ E1 y, j  `
  173. {6 O: h+ @" p+ d) R0 w( L' N4 M
  174.   /* USER CODE BEGIN 6 */- D; U. j- v$ }! R) |

  175. * ~4 ]3 K7 u- i  {- j7 j
  176.   /* User can add his own implementation to report the file name and line number,1 `4 z( t% T3 I
  177.      ex: printf("Wrong parameters value: file %s on line %d", file, line) */
    6 ?/ `- x# c! n3 @

  178. + e7 K  _' x2 ^
  179.   /* Infinite loop */5 _7 k6 D  [8 M5 E* K, Z* x& m
  180.   while (1)
    * o% p  z1 u1 V! A
  181.   {
    , r# u4 ~' h/ U2 P
  182.   }
    2 j5 u4 g+ D7 _+ [/ p5 H
  183.   /* USER CODE END 6 */
    4 w& G" K' p3 D; v; D
  184. }$ I  P2 G' w  J" `
  185. #endif /* USE_FULL_ASSERT */
    0 z. d$ k8 d) K" `0 N* a/ N0 }+ S7 G
复制代码
在完成之后,编译,就可成功下载点灯,具体可查看附件。

! g: Y1 j2 }! y
03-点灯图.png

. a6 p2 s3 W0 w+ S
好了,先分享到这,过年后来了的第一篇。

9 A/ O3 k& c' Y; T3 F  M4 q  |3 c3 q  E8 b' t7 q* p( `! F8 t
) V. d' m8 D) C4 w0 H3 _+ m4 ^
附件:工程源码 Demo.rar (716.81 KB, 下载次数: 1)
收藏 评论1 发布时间:2023-2-2 23:27

举报

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

期待下一篇

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