STM32L0 SysTick无法进入中断怎么处理(LL库)
) i* B6 D; L, T" T2 m% ^使用LL库,对systick进行配置
8 L0 C# n* c- R$ z: X* `LL_SYSTICK_SetClkSource(LL_SYSTICK_CLKSOURCE_HCLK);9 g2 l% U+ G6 F. Q8 U( N
LL_SYSTICK_EnableIT();
% }$ W% y5 }1 V4 C9 t2 X! X' v5 q9 x2 e
如此设置,选择了时钟源,打开了中断。讲道理应该可以进中断。但是,事实上却不是这样。systick就是进不了中断。
8 G2 i y2 Y0 d检查一下标志位:( e) M) j8 n# N- D: q& B4 \
6 S' p. _5 w5 x& a& x
& e- _9 R" t9 ]. a! X; d原因是systick没有使能。; e3 H$ H) \1 l
使用如下函数可以初始化systick。
$ U2 P% `1 t- T! u
- @* i. ?- E% h/ E" Y x `- __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)+ R. p7 ~$ n8 m5 c9 T% d& F
- {
$ N- m; v' N7 a* g4 v( @6 j - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)
+ j8 d, A2 @6 i7 j1 |1 w: c+ ~ - {. S4 T/ T* u8 O6 h
- return (1UL); /* Reload value impossible */; p* }* S3 F8 S" k+ K2 P
- }
! M2 q" ^9 Y+ T8 g6 T7 u
/ U* N7 k5 ~7 ]9 F; _- SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */
0 Y. n3 d+ \: r/ a. I' O - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */
/ V7 Z- Y' g0 Z( X p+ U) G4 j - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */* ~3 P2 p! X, x% r6 {
- SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
: J' b3 y2 R+ a5 }0 _# v - SysTick_CTRL_TICKINT_Msk |1 }/ I4 X+ Q4 H# _4 }( l; i0 P9 m
- SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
t, f6 u1 `2 @8 j7 P - return (0UL); /* Function successful */
8 Q: B. ^+ T7 h1 O - }
复制代码
! z6 i# E4 \% E$ @' S
7 {7 c b' G1 k9 R$ D! i9 U这是一个带返回值的函数。传递参数ticks是对reload进行赋值。如果参数合法,则对systick进行初始化。包括reload寄存器设置、优先级设置、Counter Value寄存器设置,还有就是时钟源选择、中断允许、systick使能等操作。返回值表示成功与否。想成功使用systick,直接调用函数SysTick_Config()就可以了。! w" F! M5 y7 Z) | _7 N8 I
/ N9 {3 J" p* c
2 E$ l2 e7 T ~5 y ~
" a7 ^/ N8 Y6 i* ? |