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

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

[复制链接]
shenxiaolin_mai 发布时间:2023-2-2 23:27
        说实话,我不喜欢hall库,也许很多人用起来很顺手,但是我用起来不习惯,而且LL库效率明显高得多,也许是没有接触过上层代码的原因吧,那么我就来说一下LL库的环境搭建以及点灯。
9 I  d4 L5 ~' P( |3 w        我们首先根据官方的LL库以及例程做更改,新建文件夹,拷贝文件,具体如下图。
5 K7 e0 C1 s5 A" }, Z
01-文件夹.png
+ Z2 X2 E; L" b% U
        并将文件拷贝到个个文件夹内,方便将文件归类以及后期文件管理,具体的可以看附件里,附件内的源码。具体的可以查看keil工程下的文件,如下图
9 N2 p, B* U, s1 I0 p' S9 R3 j
02-文件.png
7 F5 r7 m0 w( b) o2 o9 I
文件拷贝完成之后,然后添加文件路径和初始化定义,然后增加如下代码到Main.c文件。
1 x7 T" ~0 o) R% _! b  b
  1. / n* F9 e  ~3 e( Y. l
  2. #include "stm32u5xx_ll_icache.h"+ H! j0 I1 W7 g2 Q. P0 Y( e
  3. #include "stm32u5xx_ll_pwr.h"
    , p, I9 f1 p  P$ }3 O
  4. #include "stm32u5xx_ll_crs.h"" @8 R: ?( W  I1 l- F
  5. #include "stm32u5xx_ll_rcc.h"
    - [$ o! x) ^6 I
  6. #include "stm32u5xx_ll_bus.h"
    9 f, B( d8 Y6 U# _! S) C8 H4 {
  7. #include "stm32u5xx_ll_system.h"1 X0 z+ @4 t: n2 z9 I
  8. #include "stm32u5xx_ll_exti.h"
    . d9 p0 H% A, h/ V% Z
  9. #include "stm32u5xx_ll_cortex.h"- Z' y) ?. q5 K9 f
  10. #include "stm32u5xx_ll_utils.h"9 W7 Y1 E: j- Y/ |0 y
  11. #include "stm32u5xx_ll_dma.h"
    ' N. N5 ]3 E( }6 C
  12. #include "stm32u5xx_ll_gpio.h"
    1 ]) g8 p% D( k2 S8 h
  13. #include "stm32u5xx_ll_lpgpio.h"5 M( l4 O& q6 o2 r7 A& Q1 X
  14. 5 c2 `2 I" ], E! U) {! N  o
  15. ; C) P9 ?$ J$ Y/ j+ G
  16. 0 E" Q' Z5 E0 s2 o' y5 O
  17. - p0 Q) {7 `" s7 B0 _
  18. #define LED1_Pin LL_GPIO_PIN_79 C9 G) s$ L) G0 A% f
  19. #define LED1_GPIO_Port GPIOC- M4 q& m! v. y5 p0 S

  20. ( }3 R; v6 i& y
  21. . H% K! T8 O$ P# ^* j' u7 C
  22. 6 X$ J% Y- r! \, u- C
  23. /**
    0 W- j  E2 ?2 {+ _( n
  24.   * @brief Power Configuration4 ~/ [3 b: s7 |+ Y' \& ?" A
  25.   * @retval None
    " X% c* L, Q0 O/ n: S9 X' Y$ @
  26.   */
    - J& s& |. s) F2 ~; A0 X/ c" P
  27. static void SystemPower_Config(void)# [1 s9 x/ Z0 S+ |: A
  28. {
    ( N: P8 \8 S  s% T# V. z
  29. & T% O- f  e  q! @( P3 [; X9 b
  30.   /*
    $ P" q: f* [9 u- r
  31.    * Disable the internal Pull-Up in Dead Battery pins of UCPD peripheral- X+ S5 A5 G! L
  32.    */- @3 {7 M4 M+ n+ U' o$ d7 T3 Z
  33.   LL_PWR_DisableUCPDDeadBattery();
    ; D% ~) T& f+ h2 ^

  34. 0 Q5 X9 }2 S, p
  35.   /*
    ) F/ o2 w3 N0 Z. n8 u0 d. X! s
  36.    * Switch to SMPS regulator instead of LDO
    ( o4 G) i: D: K8 S: i/ B
  37.    */
    ) `; M/ U# J; y1 n4 z! Z& x/ |/ |
  38.   LL_PWR_SetRegulatorSupply(LL_PWR_SMPS_SUPPLY);
    " F7 f8 N4 ~$ _0 B: ^* @

  39. : s! B- L* T; Y) d
  40.   while(LL_PWR_IsActiveFlag_REGULATOR()!=1)( o/ h+ @* T  U, C. B0 h
  41.   {
    5 a3 n4 S; t* k) L& S4 i; S
  42.   }. u3 g- k& {' x+ A: l. G
  43. }" i7 n5 ~% Q/ B) q9 m

  44. ' `( {/ g$ F) a/ N
  45. /**
    4 A' |! r2 P) q) ^
  46.   * @brief ICACHE Initialization Function, P6 `9 q" r. V. {
  47.   * @param None4 y: t( c- e1 J. T& k0 W" G
  48.   * @retval None
    " O( H2 L& Z2 q1 `6 \
  49.   */
    " H; c- \1 v9 Q: a4 P0 s" |( ^
  50. static void MX_ICACHE_Init(void)
    6 f* H5 @$ Q" g  x
  51. {
    5 s+ Q/ J  S' h

  52. 6 `: @, H' G  Z$ N: O5 b0 W
  53.   /** Enable instruction cache in 1-way (direct mapped cache)6 B- n1 f  ^) c
  54.   */) y4 P* Y2 D% B6 M. W$ ]+ \5 J
  55.   LL_ICACHE_SetMode(LL_ICACHE_1WAY);3 |, m! x* {/ w. g$ S* g
  56.   LL_ICACHE_Enable();
    % p  D' \- U2 d1 C$ E+ u( C3 X. G- D
  57.   /* USER CODE BEGIN ICACHE_Init 2 *// V: A* g2 t0 Q& I* y# V
  58. ) w9 @# t/ S( c9 B0 R6 R
  59.   /* USER CODE END ICACHE_Init 2 */
    ( j9 e$ j2 M/ p

  60. ( ]9 {5 m! j% {8 z& m3 M
  61. }
    # M  _  R1 f% T! l

  62. ( p2 Y5 Z4 E  q3 U; [
  63. ! y/ X0 h  m* D8 U% u) m: R! D9 J
  64. void SystemClock_Config(void)
    * R  |" a* t1 X  w0 O' l4 g
  65. {8 M9 h& ?/ n2 B3 Z6 t
  66.   LL_FLASH_SetLatency(LL_FLASH_LATENCY_4);1 ^1 P* b% p9 {# d, Z" o5 Q' m
  67.   while(LL_FLASH_GetLatency()!= LL_FLASH_LATENCY_4)% Z. h& B( ]( Q8 R, e0 _2 e
  68.   {6 j6 O  _9 v0 H
  69.   }6 U6 J& Q( H; {) j4 D9 Y

  70. / l% Q. N' U  Q0 ]3 h5 W1 Q7 _. K
  71.   LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE1);
    ( K9 s7 O' X2 y* Y- ?9 @$ I  X
  72.   LL_RCC_MSIS_Enable();. L# t+ O' Y, ~: Z* c' ~5 U; O+ L
  73. # F4 z# S8 M2 i3 J* p0 k
  74.    /* Wait till MSIS is ready */; S, m* s2 u2 G3 s+ }8 ?! n! J
  75.   while(LL_RCC_MSIS_IsReady() != 1)7 n8 b  ]. \0 K. f
  76.   {
    * _: `; a: V3 a3 H4 d
  77.   }
    6 m' ?6 ]0 K. ~( ^

  78. 9 _6 V1 W. V5 J, }
  79.   LL_RCC_MSI_EnableRangeSelection();: O2 n3 r% h, ?1 G
  80.   LL_RCC_MSIS_SetRange(LL_RCC_MSISRANGE_4);
    ( n0 Q% R! }7 a: V3 Q. T
  81.   LL_RCC_MSI_SetCalibTrimming(16, LL_RCC_MSI_OSCILLATOR_1);% m3 m/ g4 _; c" p" A" I
  82.   LL_RCC_PLL1_ConfigDomain_SYS(LL_RCC_PLL1SOURCE_MSIS, 1, 80, 2);' w0 Z. G1 r4 P
  83.   LL_RCC_PLL1_EnableDomain_SYS();
    $ ]0 |. s; m: y! U( U$ e
  84.   LL_RCC_SetPll1EPodPrescaler(LL_RCC_PLL1MBOOST_DIV_1);
    . p" q4 X+ t) B! m
  85.   LL_RCC_PLL1_SetVCOInputRange(LL_RCC_PLLINPUTRANGE_4_8);- U+ y3 u$ n, O% M7 z, G
  86.   LL_RCC_PLL1_Enable();* M. z9 \1 B. b& ~  Q1 F5 z  H! W9 W# T
  87. " X5 E0 R4 f* u& P& p, d) e
  88.    /* Wait till PLL is ready */
    : B  P/ V1 _& H5 f7 X9 f
  89.   while(LL_RCC_PLL1_IsReady() != 1)
    / d" S! q7 ?( J' E; H, g
  90.   {$ ]- F& T- o- C& \
  91.   }4 X# N" {8 F1 V+ R+ F
  92. ; O. D$ l, M: z9 n  X' w% s
  93.    /* Intermediate AHB prescaler 2 when target frequency clock is higher than 80 MHz */! @5 c2 A) T; B  R1 x" d
  94.   LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_2);* d- J5 l3 n/ s2 L7 `
  95. ! W; x4 P' I0 y5 K( _' P* W3 ]
  96.   LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL1);6 }  z6 r0 b( W: ]6 G1 ?' v
  97. 4 `9 a5 J. e3 ^8 u% P! ~% L
  98.    /* Wait till System clock is ready */  J7 c# }" H# \- X/ ^! W
  99.   while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL1): L6 I3 J  G9 E6 y* |7 r
  100.   {
    - y# q. F7 h+ h9 ]- A9 I4 ^  q+ J8 B
  101.   }2 C( a. Z3 y3 x- Y+ `% L
  102. * y8 p% [( U9 b4 u  M0 u
  103.   /* Insure 1µs transition state at intermediate medium speed clock based on DWT*/. K# X8 L3 A0 Y3 _' h
  104.   CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;/ e9 g+ E% ^7 Z7 g0 H( T" I( g, c
  105. ( T2 ~# u! _: f3 h  N8 t
  106.   DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
    - t; A$ K2 |2 X8 |
  107.   DWT->CYCCNT = 0;
    , A: g) R: O& e) M4 u( x0 E3 k
  108.   while(DWT->CYCCNT < 100);* M" K6 A) S" \3 v" E# m! C+ X1 p' x" D

  109. . I  y" v- n# o
  110.   LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1);
    , F$ e4 K; @& _4 W$ E7 R) y
  111.   LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1);  F9 H- u5 V; T8 I) n% L% ~# R
  112.   LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1);
    ; f4 A( s; }; M3 O) L! Q; S, m
  113.   LL_RCC_SetAPB3Prescaler(LL_RCC_APB3_DIV_1);2 K' `8 l3 M/ G8 L8 c6 ^) A* ^
  114. . G/ e5 Z! t: _! N  Z& Y) y- ?
  115.   LL_Init1msTick(160000000);
    7 Y1 m9 T# n; N0 i7 ]) \5 q) W' [
  116. ! ^4 U  j0 C; P0 E( Q
  117.   LL_SetSystemCoreClock(160000000);
    6 r7 K% l* d4 Z9 K$ S/ p
  118. }# ]4 k9 ~* K7 O

  119. * T  |/ G% f, S0 J7 {& q" Y" ]* ~' D& T
  120. /**
    ( n" A6 X( v3 E) h: O, L) w
  121.   * @brief GPIO Initialization Function3 b. y* i" n- B/ b( G. v' J
  122.   * @param None
    % O8 n- G+ u$ i
  123.   * @retval None5 T( f* S( E/ k
  124.   */
    ! d" m2 S- E! s9 k4 U" t
  125. static void MX_GPIO_Init(void)( j. z2 i: M% f7 V6 t" h' V
  126. {0 R: P7 c, k4 H8 J
  127.   LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
    / @* Z' L! n' Z& g, S
  128. 6 v# U8 [/ \- L
  129.   /* GPIO Ports Clock Enable */1 c0 [) T; \8 b! L/ D8 ?" a
  130.   LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOC);
    : L, c: J. @9 z. w

  131. 1 d4 S2 g$ f% V9 b
  132.   /**/2 t* f0 Y6 a( I4 q
  133.   LL_GPIO_ResetOutputPin(LED1_GPIO_Port, LED1_Pin);
    $ ^4 \( R8 O1 n+ d  R# G0 z- O
  134. ' C8 B* l5 ^' q3 l% n3 G" {* g
  135.   /**/) h9 \8 f5 B; w; \6 F) ^) Q7 ?% x
  136.   GPIO_InitStruct.Pin = LED1_Pin;- a6 r. s* W# S
  137.   GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;) @7 P8 w" t& o2 o+ g) K
  138.   GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
    : t/ B* [9 W6 C. R
  139.   GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;0 r* W& |# j. U' }$ H6 x" G
  140.   GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;8 P! |- U& ~* q% O7 u: T
  141.   LL_GPIO_Init(LED1_GPIO_Port, &GPIO_InitStruct);
    3 T2 ]4 p+ y- F5 G: w% X
  142. % G+ H/ R5 {; E) s2 t' R& A5 O+ i
  143. }
    - k! v) G* o1 Y' s  v' Q

  144. * P/ \7 }9 z% M* r6 X7 e

  145. $ {! l# k8 w& @; N/ \

  146. ' o8 h1 j% h7 ?# E
  147. int main(void)
    2 R; K7 w( Y1 j0 R
  148. {, E& m& L; W% I4 c
  149.   LL_AHB3_GRP1_EnableClock(LL_AHB3_GRP1_PERIPH_PWR);* h% [" z1 l4 v! f, E- H" L
  150.   SystemClock_Config();
    ! U$ R' V( T, W. J
  151.   SystemPower_Config();9 I/ X+ d0 j* C9 P7 H! d! L
  152.   MX_GPIO_Init();, m: J8 |" L# K" S. W* [
  153.   MX_ICACHE_Init();
    ) |: Z) y' P! ^: E0 B/ R; \8 N. m
  154.   while (1)
    , x- x0 w/ \2 w3 @7 c* s% Q9 ~
  155.   {4 v& M) l, `2 U) {0 V
  156.                 LL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);; m' d# v& n) L/ E
  157.                 LL_mDelay(500);, h. p- H& o8 M4 Q
  158.   }9 x8 V: T8 J% R+ K- p
  159.   /* USER CODE END 3 */% F) j% [3 k) z' W) D* l  C
  160. }: s* Y# w! J8 u, J  C; e/ L

  161. : O5 N) M+ T( L* _

  162. - I8 a; o2 m0 I5 @$ h9 a
  163.   X6 i5 |" V/ e7 T
  164. #ifdef  USE_FULL_ASSERT
    7 c0 s. }) ^9 y- S3 m* z
  165. /**
    4 j: [) j8 `; j5 Y6 I' ?
  166.   * @brief  Reports the name of the source file and the source line number4 q' a9 m8 x- P- R5 e  @8 Z
  167.   *         where the assert_param error has occurred., d: O  J# g- ~% k% J
  168.   * @param  file: pointer to the source file name
    " S2 W- i2 f9 N
  169.   * @param  line: assert_param error line source number' q9 K) w. `2 Z7 }0 `& i, F
  170.   * @retval None
    + d9 _  h, I7 Q4 ]" i* e
  171.   */5 O6 H6 L, Y; r" l
  172. void assert_failed(uint8_t *file, uint32_t line)
    3 |/ D4 c# a: Q
  173. {
    6 R8 U7 r) b1 I6 g
  174.   /* USER CODE BEGIN 6 */
    * P1 W- Z# l+ I2 L, H
  175.   W7 `9 u2 A5 T! A0 |! c5 r
  176.   /* User can add his own implementation to report the file name and line number,( a! g2 z4 q5 q; k
  177.      ex: printf("Wrong parameters value: file %s on line %d", file, line) */6 d% Q2 T; a- h& p
  178. " w) L* T; J( E
  179.   /* Infinite loop */: p; O5 g5 h5 X2 W9 b% C
  180.   while (1)' l: Q' @2 G2 j+ S( L
  181.   {. p" c& O0 Z! s( g2 u8 q9 ~1 n
  182.   }1 ?' Z) [  z$ ]
  183.   /* USER CODE END 6 */
    ' s; G2 l' }0 S
  184. }
    6 k. {- Y8 @& Z- p) f9 W" H4 d! u" i
  185. #endif /* USE_FULL_ASSERT */
    % y- C% ^( w" m5 T
复制代码
在完成之后,编译,就可成功下载点灯,具体可查看附件。

! x; w7 E' u0 j" y5 q, g- E
03-点灯图.png

; {! q# h+ |( _, T* T- _9 ]
好了,先分享到这,过年后来了的第一篇。
. J; W2 U3 K; O. a1 n
. q( S7 N& o/ G9 O; x6 ]

, J+ c7 Z* H' q  K, U
附件:工程源码 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 手机版