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

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

[复制链接]
shenxiaolin_mai 发布时间:2023-2-2 23:27
        说实话,我不喜欢hall库,也许很多人用起来很顺手,但是我用起来不习惯,而且LL库效率明显高得多,也许是没有接触过上层代码的原因吧,那么我就来说一下LL库的环境搭建以及点灯。
# ^0 _1 h5 i7 ?. G3 Q8 n        我们首先根据官方的LL库以及例程做更改,新建文件夹,拷贝文件,具体如下图。
  E) t6 l/ a8 d" H6 Z1 @1 O
01-文件夹.png

4 k* G) G3 q& d
        并将文件拷贝到个个文件夹内,方便将文件归类以及后期文件管理,具体的可以看附件里,附件内的源码。具体的可以查看keil工程下的文件,如下图

; \( r+ w9 y" j- g0 I
02-文件.png
& D7 k3 P* z% R# G$ P- n: o
文件拷贝完成之后,然后添加文件路径和初始化定义,然后增加如下代码到Main.c文件。

/ \9 `2 M/ C4 v, k4 {9 n2 n" N

  1. 8 U4 {1 C9 W" N2 v% B
  2. #include "stm32u5xx_ll_icache.h"
    : t7 B5 B: v, U# N7 |# a9 R
  3. #include "stm32u5xx_ll_pwr.h"
    6 x$ S0 c" j( m. L+ ?$ Y
  4. #include "stm32u5xx_ll_crs.h"
    4 _; Y3 o6 ~& |5 h- E
  5. #include "stm32u5xx_ll_rcc.h"
    9 B# p0 \$ a2 g
  6. #include "stm32u5xx_ll_bus.h"
    : f1 A: N4 }5 D* t3 |/ V
  7. #include "stm32u5xx_ll_system.h"# E6 X% _* B/ b1 {0 N6 q# Z
  8. #include "stm32u5xx_ll_exti.h"8 _0 [/ V4 {; H0 p
  9. #include "stm32u5xx_ll_cortex.h"
    2 h7 v# J; G2 F2 u% }, O
  10. #include "stm32u5xx_ll_utils.h"( a5 t9 D! b& Z8 y% z& \
  11. #include "stm32u5xx_ll_dma.h"
    ( o) Q" t2 R% Y# m
  12. #include "stm32u5xx_ll_gpio.h"
    , n3 V: E% x& y8 N2 }
  13. #include "stm32u5xx_ll_lpgpio.h"
    ( y0 ?: g3 r: R. e) c) v0 \
  14. ) Y+ l4 ~* m( ~
  15. * Z; ?. u1 ]8 J+ y* k8 X; c) D

  16. * k+ |7 v6 o( y, d: J

  17. $ {3 d' ]! a1 I% B: ?& \4 A
  18. #define LED1_Pin LL_GPIO_PIN_7
    ! E; U& b6 a# @$ P7 O: E( ~
  19. #define LED1_GPIO_Port GPIOC
    3 d; U; {, a* F/ G& k0 N9 E7 Z9 e
  20. : Z; O7 [- j- {  r& f7 H
  21. % n4 J  I9 @9 R' @/ m9 d+ c

  22. 3 ~7 R5 J6 y' @7 v' v" G6 H* I6 @8 H
  23. /**# l6 Q3 p9 Q7 @& \0 R8 r$ j! T
  24.   * @brief Power Configuration, ~) `: e, [# v* \
  25.   * @retval None
    " g& X9 E6 L' R  c/ _: S
  26.   */
    " c! v2 r. i0 v* X. L- Y" J
  27. static void SystemPower_Config(void)  D! O. u- P) U6 [  R8 W6 I- n
  28. {
    - {4 D0 [- `! Z
  29. + ^7 K% `; q) `: l  u
  30.   /*0 u+ T& F: r, A/ ~+ y: h$ ]
  31.    * Disable the internal Pull-Up in Dead Battery pins of UCPD peripheral
    " U9 ~( P6 {9 O  L" ^
  32.    */
    6 T6 k  k9 i! ]
  33.   LL_PWR_DisableUCPDDeadBattery();6 q* M1 F, C. P) f
  34. : K7 {7 }) a  ~+ G1 y1 W' s
  35.   /*) G# L+ z1 s* r# b1 U
  36.    * Switch to SMPS regulator instead of LDO
    4 x0 x; {: U3 x: x: {$ b1 `/ _
  37.    */* F3 _& N6 `6 x. k6 a6 ^% C
  38.   LL_PWR_SetRegulatorSupply(LL_PWR_SMPS_SUPPLY);* B9 Q/ o4 v; S; G
  39. ' u5 t& a  w" \
  40.   while(LL_PWR_IsActiveFlag_REGULATOR()!=1)
    ; Y  K; K4 @. H0 @8 y
  41.   {
    ' r4 V8 ~/ c; _; [  a
  42.   }
    $ _  q& a% l* a6 X# \
  43. }
    5 O( H' i: o: s3 J% _
  44. / v, i5 E8 x- L6 R
  45. /**
    1 }+ Z% j) V3 h! r  Y) M! I  m6 ~
  46.   * @brief ICACHE Initialization Function- \. y+ S* X5 u1 q% w. M, R
  47.   * @param None
    - [- D1 A* g5 F) }( g( m8 b- S
  48.   * @retval None5 W9 h3 @) A+ j& x- [# u: f
  49.   */
    : A1 h1 t; R' Y: B4 ]* V- N
  50. static void MX_ICACHE_Init(void)
    1 P/ G' O$ X* ]! Q7 s
  51. {
    3 [: J6 N+ i8 o" \4 L& G

  52. ; Q" m8 M, n" Y% K, _
  53.   /** Enable instruction cache in 1-way (direct mapped cache)
    % p5 X( s8 H" R+ i- H0 D
  54.   */! ~9 b+ ^% g) T7 F* e0 D: D1 Z
  55.   LL_ICACHE_SetMode(LL_ICACHE_1WAY);+ E2 `$ z; V4 a, e7 |% P9 R
  56.   LL_ICACHE_Enable();
    . l8 ~# i5 M; N5 @
  57.   /* USER CODE BEGIN ICACHE_Init 2 */' S+ W" X' g; ]+ {" |1 d6 @

  58. , A- ?; g, _$ q5 A: {' }, G
  59.   /* USER CODE END ICACHE_Init 2 */; q9 D( I9 w* N- J7 m$ l- M/ l

  60. ! V4 E+ M% `2 i
  61. }
    $ _) _' Y0 \9 p+ A& y6 E' }; a
  62. 2 I' L/ q  Q3 C+ m
  63.   J& F7 Z; x0 A1 g9 \& y9 f: x
  64. void SystemClock_Config(void)- c7 u, Z" T7 k, o1 L
  65. {, r8 g, |2 V  I/ z7 R6 ?' K2 O3 [0 r
  66.   LL_FLASH_SetLatency(LL_FLASH_LATENCY_4);
    & M+ e* S, B% K( B4 `/ v' K
  67.   while(LL_FLASH_GetLatency()!= LL_FLASH_LATENCY_4)
    ; q3 ^0 f% B' Q* X" ~4 V" m( ^
  68.   {
    . h3 L2 g; G5 D, V2 d1 g
  69.   }4 M+ {: L. m0 _+ B" R" n

  70. 8 l$ D5 u. G* ~) Z# c
  71.   LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE1);
    ' d) g2 y- s! J& \  ?
  72.   LL_RCC_MSIS_Enable();7 q+ n1 A; u! r, w* Z4 T5 R

  73. / T5 p& o4 M) P. c5 x& e
  74.    /* Wait till MSIS is ready */, D+ X$ M) Q" U7 N# R$ F' n& t8 ~
  75.   while(LL_RCC_MSIS_IsReady() != 1)  H' f5 q, h0 {" Y# Z' {7 x
  76.   {
    + f! Z9 q7 ~9 s0 Z6 Y) l
  77.   }! e) O3 P! A' c& G- I  W
  78. , F  J1 B- W& P8 T, h' O
  79.   LL_RCC_MSI_EnableRangeSelection();/ i7 `/ A, h8 ^& U2 G' G
  80.   LL_RCC_MSIS_SetRange(LL_RCC_MSISRANGE_4);
    ) I2 p! u  [( `
  81.   LL_RCC_MSI_SetCalibTrimming(16, LL_RCC_MSI_OSCILLATOR_1);
    8 g4 |8 q( I- s5 U, i, Q
  82.   LL_RCC_PLL1_ConfigDomain_SYS(LL_RCC_PLL1SOURCE_MSIS, 1, 80, 2);3 D9 g4 e* K& X3 ^1 _. y
  83.   LL_RCC_PLL1_EnableDomain_SYS();* }( a2 T: n8 T" J
  84.   LL_RCC_SetPll1EPodPrescaler(LL_RCC_PLL1MBOOST_DIV_1);
    / G2 w# r: F  ~/ Y* z/ f
  85.   LL_RCC_PLL1_SetVCOInputRange(LL_RCC_PLLINPUTRANGE_4_8);
    4 ~; X( _* ~2 Q
  86.   LL_RCC_PLL1_Enable();; A/ ], l( E/ |2 ?' m0 Z- [
  87. 1 I& a8 f9 B( u% d7 a5 y
  88.    /* Wait till PLL is ready */6 L3 W( w6 T# ?+ ~9 b* r
  89.   while(LL_RCC_PLL1_IsReady() != 1)1 I- e- j% v/ b  u3 Z) q
  90.   {
    9 Z# w! _. y. Y3 @0 I; f: Q
  91.   }+ i4 |$ W. g2 R& d' w% U2 V; C% m2 y

  92. " n5 M+ |4 J3 P8 C6 t2 n$ j& p+ U  \
  93.    /* Intermediate AHB prescaler 2 when target frequency clock is higher than 80 MHz */
    0 c- e  M% V2 y/ Q! E
  94.   LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_2);
    1 a& S/ \0 S# M
  95. 2 k2 v+ n* E/ L: i8 K
  96.   LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL1);8 {6 i: o) {! g

  97. 5 V  N0 g3 p0 z+ o0 B
  98.    /* Wait till System clock is ready */
    3 h1 H5 |' C. `8 n( A, G) ?) m
  99.   while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL1)
    ( S5 Q* H" \! w+ C5 ?  k' F
  100.   {! _; p0 p# T9 E
  101.   }& z: |4 G8 b' P" P4 Y- A" _# x- c" |
  102. + V5 e% D2 b3 U+ U
  103.   /* Insure 1µs transition state at intermediate medium speed clock based on DWT*/6 S1 j: `* S2 ?$ h- ?
  104.   CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;2 {: b; ]% q7 X% D! i2 n
  105. ( x4 C2 J8 k  H2 V3 j
  106.   DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;$ z: P5 {$ e1 y2 y0 X
  107.   DWT->CYCCNT = 0;" A0 d1 k: {, O5 A
  108.   while(DWT->CYCCNT < 100);
    4 l5 w0 K7 r1 f) ^: ~" I2 }

  109. 3 D6 s& [; D: T+ x2 I
  110.   LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1);3 B& ~! u2 a' G1 Q" n+ w# P
  111.   LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1);% h+ W2 P, n( X  F* I& ~" o
  112.   LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1);/ w/ {+ J' Q" r
  113.   LL_RCC_SetAPB3Prescaler(LL_RCC_APB3_DIV_1);
    $ D, g& ^$ [& G, h/ O$ \

  114. 0 [, ~/ U; B$ i& i0 f: _/ `
  115.   LL_Init1msTick(160000000);/ \' _  l$ Y9 {8 S8 N4 \3 m6 b. z
  116. % @* @. S0 [) e
  117.   LL_SetSystemCoreClock(160000000);; L7 M/ `3 {0 j( y
  118. }
    $ F, U* {( b1 Z0 K

  119. 1 o( W4 r5 m$ `/ y/ W
  120. /**( P  O6 d$ Y& I+ G1 \3 O0 e
  121.   * @brief GPIO Initialization Function& s; K( b, H' r4 x: U
  122.   * @param None  ^: f0 O0 C/ p& J
  123.   * @retval None
    ( m- v6 m) E. o# e$ y
  124.   */1 T( ?( K) y1 q# V" @5 _
  125. static void MX_GPIO_Init(void)2 H0 s" V. c! F  \/ |. ~
  126. {
    1 K( N$ m3 W4 w3 f# K( o( C/ ]+ d. M
  127.   LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
    / a: G/ R# R! j9 t( ?
  128. & P* a. C% e8 U
  129.   /* GPIO Ports Clock Enable */
    + e+ n: R3 t! n" B" F
  130.   LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOC);9 F' j) N# O5 u- W% U& L7 B  c
  131. ( F* @' h; A4 l4 N& V0 `5 o
  132.   /**/
    ! f# f% Q: j6 N" t& y2 l6 n
  133.   LL_GPIO_ResetOutputPin(LED1_GPIO_Port, LED1_Pin);
    5 C9 S* j  `8 q0 v4 L

  134. , W8 N, v$ K! V+ e
  135.   /**/
    / Q0 W5 R0 ?  `" ^9 Z
  136.   GPIO_InitStruct.Pin = LED1_Pin;3 T) f6 d9 b, @+ U. F
  137.   GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;' v/ L6 g$ |- i# n2 G, q( I7 c1 k
  138.   GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
    2 P; h- C* D  |) J# ?" l4 f
  139.   GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;7 z" T' l, f( ^
  140.   GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;) h, p& C- P; {0 ]
  141.   LL_GPIO_Init(LED1_GPIO_Port, &GPIO_InitStruct);, W. h1 g/ o7 t$ F9 u

  142. : c+ N5 R4 Z7 x& e3 b# s
  143. }+ |6 h- A  h/ f3 S

  144. 4 Z4 n1 U  x6 F( d: f( L; E

  145. " W( A6 `8 h$ v
  146. : P" z! ]; }# e0 e5 e
  147. int main(void)
    0 e  n$ B: L0 k( x  Q3 Z4 g
  148. {$ y3 @' b8 R3 g
  149.   LL_AHB3_GRP1_EnableClock(LL_AHB3_GRP1_PERIPH_PWR);5 P' G4 t& _/ D( Q- C! {# W
  150.   SystemClock_Config();% a1 l( S* |/ @1 x0 H8 _. ]. S
  151.   SystemPower_Config();
    " v% h) I0 Z1 O0 z
  152.   MX_GPIO_Init();
    6 i# h6 e2 ?0 M6 y
  153.   MX_ICACHE_Init();- m8 ^5 x( S+ @5 M5 g' g- {
  154.   while (1)
    # P1 S) E( ^4 o7 I8 d. s5 D
  155.   {& D; t% |/ [7 n3 N
  156.                 LL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);. t8 s, N' ^6 j/ i, _/ B
  157.                 LL_mDelay(500);+ c/ f  g& ^( i+ w
  158.   }; b$ ]2 A9 t  I- x# z- Q
  159.   /* USER CODE END 3 */
    $ t4 Z5 `7 P- H; U/ M1 P
  160. }) v2 h* _; y( t# w& W" k2 P

  161. . g+ |6 e6 c, S8 \, Y$ p
  162. & E1 P7 ^; ~0 d, Y; O
  163. * A3 j( w! f, m8 i3 m6 z; m( M
  164. #ifdef  USE_FULL_ASSERT3 X* O, d! ]3 |
  165. /**# H- ?+ y8 _1 r0 {3 h) M. T
  166.   * @brief  Reports the name of the source file and the source line number; v' ^" Q: ?2 @1 H3 E
  167.   *         where the assert_param error has occurred.
    ! G0 o7 Z3 K# G
  168.   * @param  file: pointer to the source file name
    : t2 y* m! A: Q2 c" ?8 p0 k
  169.   * @param  line: assert_param error line source number
    5 L1 n6 I. `  D: a, \
  170.   * @retval None
    * T# f" K; }+ d# ?4 c; c
  171.   */
    - u. w0 v' R, w% E; s* ^
  172. void assert_failed(uint8_t *file, uint32_t line): l7 k8 x0 M& e4 }& C3 r0 C. |( S
  173. {
    $ N0 \2 ]" c3 s5 I6 j
  174.   /* USER CODE BEGIN 6 */
    " `6 p4 F+ @- V5 p

  175. 7 D$ P9 u% g9 T4 M
  176.   /* User can add his own implementation to report the file name and line number,
    * J1 r9 {+ D4 [/ H
  177.      ex: printf("Wrong parameters value: file %s on line %d", file, line) */
    1 q+ x& F$ B% h! O! l5 y+ Q

  178. + e6 _% |! M  _& i6 D9 J- }
  179.   /* Infinite loop */
    $ n* I/ ~( g  Q7 J
  180.   while (1)
    ; e6 H5 P: F% e/ Y
  181.   {6 p' f/ w1 b8 @
  182.   }
    ; A, s  T7 A; P+ O+ V# X- n
  183.   /* USER CODE END 6 */, [0 X3 K4 |' J4 d. R, Y' Y# n
  184. }1 n7 h% _" Q8 p: `. q0 s% p6 V; u
  185. #endif /* USE_FULL_ASSERT */, Z: G  Y7 ^+ F9 A. O! l9 M0 i) d
复制代码
在完成之后,编译,就可成功下载点灯,具体可查看附件。

1 t# t' [0 j6 }
03-点灯图.png
: Y' p- L" L) Z) w
好了,先分享到这,过年后来了的第一篇。
7 Q7 {5 A1 r8 o4 u" M: l1 b
  e+ E, [& ~; P, @
" A3 k" u1 h5 L* O$ C3 q( a4 ]! G4 v
附件:工程源码 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 手机版