EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
什么是SYStiCK:6 s {1 g3 a6 h4 l
这是一个24位的系统节拍定时器system tick timer,SysTick,具有自动重载和溢出中断功能,所有基于Cortex_M3处理器的微控制器都可以由这个定时器获得一定的时间间隔。 & k7 w* v! m/ w5 q! V0 ~
作用:
L4 f. a9 Y I* S1 a c在单任务引用程序中,因为其架构就决定了它执行任务的串行性,这就引出一个问题:当某个任务出现问题时,就会牵连到后续的任务,进而导致整个系统崩溃。要解决这个问题,可以使用实时操作系统(RTOS).
2 ~( Q2 y+ C9 q' D8 t因为RTOS以并行的架构处理任务,单一任务的崩溃并不会牵连到整个系统。这样用户出于可靠性的考虑可能就会基于RTOS来设计自己的应用程序。这样SYSTICK存在的意义就是提供必要的时钟节拍,为RTOS的任务调度提供一个有节奏的“心跳”。 * g, w( i+ _" U, Y! c/ i
微控制器的定时器资源一般比较丰富,比如STM32存在8个定时器,为啥还要再提供一个SYSTICK?原因就是所有基于 ARM Cortex_M3内核的控制器都带有SysTick定时器,这样就方便了程序在不同的器件之间的移植。而使用RTOS的第一项工作往往就是将其移植到开发人员的硬件平台上,由于SYSTICK的存在无疑降低了移植的难度。
: r9 d- K% S4 [* T5 \5 \5 C% p$ b6 ^) ]+ T' x
SysTick定时器除了能服务于操作系统之外,还能用于其它目的:如作为一个闹铃,用于测量时间等。
# u$ ]1 ?# M) n5 d! {! w1 j7 {' L要注意的是,当处理器在调试期间被喊停(halt)时,则SysTick定时器亦将暂停运作。 ; N( H- n9 X3 M& s1 f; y
. f6 ~0 F% q: }" c6 }& S 时钟的选择:
x' M# q/ k9 y& P用户可以在位于Cortex_M3处理器系统控制单元中的系统节拍定时器控制和状态寄存器(SysTick control and status register ,SCSR)选择systick 时钟源。如将SCSR中的CLKSOURCE位置位,SysTick会在CPU频率下运行;而将CLKSOUCE位清除则SysTick会以CPU主频的1/8频率运行。 / Z) X4 o9 O) T& g+ w. V6 J
3.5版本的库函数与以往的有所区别 ; }* Q& a9 V. F/ p' u7 r
不存在stm32f10x_systick.c文件,故原来的一些函数也不存在,比如SysTick_SetReload(u32 reload);SysTick_ITConfig(FunctionalState NewState);等
, ]0 Q( E+ Z# j
6 c4 h( u8 }% ?3 } 在3.5版本的库函数中与systick相关的函数只有两个
2 K& t* C" Z2 F" p第一个,SysTick_Config(uint32_t ticks),在core_cm3.h头文件中进行定义的。 2 p8 d" t( v8 @
第二个,void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource),在misc.c文件中定义的。
/ a( M+ Y/ n# v" F3 [8 z3 s. D4 r; k( Z1 [8 [
SysTick_Config(uint32_t ticks),在core_cm3.h 9 j9 `% A4 r `8 x; \
主要的作用: & y$ Y% K T1 M0 W4 {, X: f: }
1、初始化systick . G. e) _0 {9 p5 i
2、打开systick ; C* `* w+ O$ k; i4 r
3、打开systick的中断并设置优先级 5 `: D* y2 |! Z
4、返回一个0代表成功或1代表失败
' V9 W. q. g" `: e注意:
$ X5 N- J) v8 e5 q$ |Uint32_t ticks 即为重装值,
9 \* x5 N4 @3 y这个函数默认使用的时钟源是AHB,即不分频。 8 B/ G# X: _; ]6 L$ ^
要想分频,调用void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource), $ J! k% H; A: ~4 X4 z1 u( f( y
但是要注意函数调用的次序,先SysTick_Config(uint32_t ticks), % N5 o* X1 P2 Z' f u* `( A) s
后SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
+ `* ?8 |8 ^ w% `! o& J3 J2 U# [- H+ g, d- Y% k, x( d; q0 [, t
+ q" s! ^) f% f ) ?: x1 J+ T" Q: c( M0 Y5 v2 {3 \
% S2 ~6 a @* I 函数说明: 7 E% e2 g# z( P. Z& g; c9 I
( ~. h6 H# Y2 W7 n /** / Y& [7 N" F0 V4 y; _# C
* @brief Initialize and start the SysTick counter and its interrupt.
1 F$ r' J; l3 V+ w- `8 |6 v, c * . u% {7 @* a) Y6 @* Z0 V% M
* @param ticks number of ticks between two interrupts ) _3 d" t; A9 s2 V# J4 f1 w
* @return 1 = faiLED, 0 = successful
0 Q; E U5 J" j6 {% a4 p *
& v0 }$ u- O- \/ `/ r * Initialise the system tick timer and its interrupt and start the
0 t+ n8 R; S0 n7 A+ T * system tick timer / counter in free running mode to generate
) D/ [- Q' d: y7 h+ N4 o, Y * periodical interrupts. " J# {; W6 ^, S
*/
" N0 x% s- e; }" q) Rstatic __INLINE uint32_t SysTick_Config(uint32_t ticks)
& Q0 Y: S( h; S" y) `. T/ O{
( c0 t) H# q5 s$ ^$ F' q IF (ticks > SysTick_LOAD_RELOAD_Msk) return (1);
7 J3 ^8 c6 O/ \4 o6 T /* Reload value impossible */重装载值必须小于0XFF FFFF,为什么,这是一个24位的递减计数器。
2 C1 H& u7 G* Y8 A+ j3 {4 z% Q- b$ r
% d5 d7 e! D7 u: j2 B! S. L SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;
9 ]$ n6 [$ c; x% Z/ n: d* d1 I1 b; j /* set reload register */设置重装载值,SysTick_LOAD_RELOAD_Msk定义见后面
" ~& e& ~2 u, K! A) ~$ ~ NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); $ c2 a+ |1 d( C3 w7 q/ [
/* set Priority for Cortex-M0 System Interrupts */
+ h2 G8 q9 V7 p SysTick->VAL = 0;
: K4 I& w: w# T8 R+ W /* Load the SysTick Counter Value */
. ^) c9 x c% C e SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
- D; s+ n' d" y! F3 ^ D8 l SysTick_CTRL_TICKINT_Msk |
+ D6 V! j7 H) `4 o K SysTick_CTRL_ENABLE_Msk;
* L% X# h8 `. s /* Enable SysTick IRQ and SysTick Timer */ 9 `8 v' B- k' N+ W4 M" Y% s
return (0); 8 C; g1 k9 {, U# F( p0 u
/* Function successful */
/ l2 w" Y# q- a9 \3 k) |}
) X3 K& k* R. m e#endif
9 B+ o* V" @4 V& L! R4 ~6 v: W与systick相关的寄存器定义, {0 s5 g$ I( l& k8 Q( o9 N: S5 _& L) g
5 F6 }1 } C* Y3 _# j! d$ z; ?/** @addtogroup CMSIS_CM3_SysTick CMSIS CM3 SysTick a8 n* T. C$ x
memory mapped structure for SysTick
( J* D# _' I& Z o8 \ @{ / z! x& e' `5 j$ E
*/
9 P- i/ l4 @* P0 W: f5 C) X, U5 Rtypedef struct 5 n" Q: g' `( f: O
{
. M' ^7 a" X2 [) o. R. o* X __IO uint32_t CTRL; /*!< Offset: 0x00 SysTick Control and Status Register */
3 e: D0 l Z4 b __IO uint32_t LOAD; /*!< Offset: 0x04 SysTick Reload Value Register */ 1 g. ~. G) c/ o" u! `
__IO uint32_t VAL; /*!< Offset: 0x08 SysTick Current Value Register */
2 G7 C# q/ d% n! n __I uint32_t CALIB; /*!< Offset: 0x0C SysTick Calibration Register */
' Q+ ^8 I0 @7 Q# [8 s} SysTick_Type;
0 `( `* y$ A v, S8 O7 J9 R4 }$ {& J* |# ]
与systick寄存器相关的寄存器及位的定义
6 m! g2 ^" m& y7 c" N1 } v
8 C# z. K3 [/ W /* SysTick Control / Status Register Definitions */控制/状态寄存器
/ `+ Q- N( O/ V' a0 D! m( Z#define SysTick_CTRL_COUNTFLAG_Pos 16 /*!< SysTick CTRL: COUNTFLAG Position */
. e& W7 c8 {: v3 \ #define SysTick_CTRL_COUNTFLAG_Msk (1ul << SysTick_CTRL_COUNTFLAG_Pos)
6 m% J# V/ H0 d, [0 k0 @& Q9 r5 c/*!< SysTick CTRL: COUNTFLAG Mask */ 溢出标志位 m: }$ c7 S8 x
+ F \3 x1 M( {" u# G
#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */
z8 A Q+ ^8 V( D3 |#define SysTick_CTRL_CLKSOURCE_Msk (1ul << SysTick_CTRL_CLKSOURCE_Pos)
' k# T5 V& h; y7 S! h- h/*!< SysTick CTRL: CLKSOURCE Mask */时钟源选择位,0=外部时钟;1=内核时钟 ! ?( G7 I2 H8 ~! V A1 Z* N
( O0 }) g& A5 A1 k) X0 T4 Q #define SysTick_CTRL_TICKINT_Pos 1 /*!< SysTick CTRL: TICKINT Position */ / W2 |# c* U- r" X# F
#define SysTick_CTRL_TICKINT_Msk (1ul << SysTick_CTRL_TICKINT_Pos) , \2 d$ W/ j K5 ?& y8 [
/*!< SysTick CTRL: TICKINT Mask */异常请求位
2 D$ l ^# o; N: {! [% O# n" G. m8 o- G* d- w8 W
#define SysTick_CTRL_ENABLE_Pos 0 /*!< SysTick CTRL: ENABLE Position */
' W. D" g: }. g0 |6 M#define SysTick_CTRL_ENABLE_Msk (1ul << SysTick_CTRL_ENABLE_Pos) ) Q. B* b0 q/ g7 D
/*!< SysTick CTRL: ENABLE Mask */使能位 * P4 i7 g! n6 _4 k9 e) }1 j, } K
0 t5 d1 D/ G# A j _( |, [# K /* SysTick Reload Register Definitions */
6 |) i2 n" R% Y9 a8 V _( G" N#define SysTick_LOAD_RELOAD_Pos 0 /*!< SysTick LOAD: RELOAD Position */
$ y+ A/ q4 f: ~+ W#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFul << SysTick_LOAD_RELOAD_Pos)
; C6 [$ l+ _4 T- E& O5 Z; n, C/*!< SysTick LOAD: RELOAD Mask */
7 l5 X" \! Z' m& i1 z7 v1 [0 u! H7 R/ O
/* SysTick Current Register Definitions */ 0 _" L; `) F9 \4 F" a$ t! [
#define SysTick_VAL_CURRENT_Pos 0 /*!< SysTick VAL: CURRENT Position */ ( s0 z# U5 ^' M, B' [
#define SysTick_VAL_CURRENT_Msk (0xFFFFFFul << SysTick_VAL_CURRENT_Pos)
}8 ~- b3 F5 W0 {' ?7 H+ m/*!< SysTick VAL: CURRENT Mask */
) r0 R/ s- A* [' [& Q: Q, ]/ R
8 I4 d4 B) r5 L# L3 @3 z/ d /* SysTick Calibration Register Definitions */ - ]. K! X0 t, W
#define SysTick_CALIB_NOREF_Pos 31 /*!< SysTick CALIB: NOREF Position */
" G l4 f' ?: ~9 I* H#define SysTick_CALIB_NOREF_Msk (1ul << SysTick_CALIB_NOREF_Pos)
) e7 f4 V9 g, @- I9 l /*!< SysTick CALIB: NOREF Mask */
4 n* I. n$ ?( f: W; H# \% s8 h, k" [
#define SysTick_CALIB_SKEW_Pos 30 /*!< SysTick CALIB: SKEW Position */ 5 g% g& e" p# g5 E: V4 G) {
#define SysTick_CALIB_SKEW_Msk (1ul << SysTick_CALIB_SKEW_Pos) / I. } u ^* f @4 Q5 k6 `( N
/*!< SysTick CALIB: SKEW Mask */
: g3 e& y- {1 | F& D6 b% I) b
5 C6 ^) r, k3 _; m- I) o0 w2 n #define SysTick_CALIB_TENMS_Pos 0 /*!< SysTick CALIB: TENMS Position */ ' F1 |" e" c/ {" V: \% N
#define SysTick_CALIB_TENMS_Msk (0xFFFFFFul << SysTick_VAL_CURRENT_Pos) /*!< SysTick CALIB: TENMS Mask */
D N* N4 @3 c) r- d" s% m/*@}*/ /* end of group CMSIS_CM3_SysTick */
, y$ C$ B$ C! y6 x) F' ?. G( ?- o
/ G r5 G, @& E3 Q2 a$ O + Z2 q9 R" d) v5 p- G" L4 V
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource) ! a( I3 }6 {# {3 b8 E. D
作用:
; Y# D; d* N# E& H选择systick的时钟源,AHB时钟或AHB的8分频
, r9 n6 F% R, K( `! _默认使用的是AHB时钟,即72MHz . v# M9 Q0 V) j8 d* j+ {% o, ^( \
1 Y9 u. T( b" k) X# V
函数说明:
9 p0 B' e3 C4 I& B. H# p) S/** $ z/ W( Z; I! [# c
* @brief Configures the SysTick clock source.
& g7 Z. }' O# w * @param SysTick_CLKSource: specifies the SysTick clock source.
8 V( y3 a- M" j8 @% Q * This parameter can be one of the following values: ) v1 i) ^1 t3 Q& r: o- m @
* @arg SysTick_CLKSource_HCLK_Div8: AHB clock divided by 8 selected as SysTick clock source.
+ Q% i2 l: [* ~( }9 A * @arg SysTick_CLKSource_HCLK: AHB clock selected as SysTick clock source.
" r2 Y$ i0 T; U- u * @retval None
- V, u( w* n: m& F/ W0 C */
$ O# N. |+ x/ h) gvoid SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource) ' o5 M9 J& s1 ~2 B
{
, H7 F- e( g* \9 n% K' N2 J0 t; ? /* Check the parameters */
4 r6 L# r( |4 G' f P" I* p assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource)); : `6 |6 C' D K3 C& G7 o$ d
if (SysTick_CLKSource == SysTick_CLKSource_HCLK) 9 v" C1 T0 Q, ?
{ " f9 \" m, u; Q& L. E* L W B. j M
SysTick->CTRL |= SysTick_CLKSource_HCLK; " d) T l: R' h9 l" f5 N
}
5 O% K& ^: ^/ L3 u5 x9 c else
( Q8 o2 {/ B! X2 @0 T { 3 J5 X, ^6 L* G
SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;
; e9 o# {# D5 J0 p2 y6 N }
) j* E- g: `. S# z. K1 h# v}
8 S! h4 h6 ^4 V5 t1 k7 `9 p/ y' A: _# }2 J+ p" v7 Q# Q
) X5 X# a' h( a
Systick时钟源的定义:
5 N" G H% L& f5 g/ r/** @defgroup SysTick_clock_source 1 K) P9 S9 A8 ?8 j! U2 f1 ?
* @{
* a4 j9 y1 f6 k */
5 b. }2 P. \, |
$ R+ f' \2 y4 P) g* t$ I #define SysTick_CLKSource_HCLK_Div8 ((uint32_t)0xFFFFFFFB)//将控制状态寄存器的第二位置0,即用外部时钟源 : c" [+ k, j# f A
#define SysTick_CLKSource_HCLK ((uint32_t)0x00000004)//将控制状态寄存器的第二位置1,即用内核时钟
, k# }' Z/ I5 b, P' ?, n#define IS_SYSTICK_CLK_SOURCE(SOURCE) (((SOURCE) == SysTick_CLKSource_HCLK) || \
% p3 n4 w, w. c/ Z ((SOURCE) == SysTick_CLKSource_HCLK_Div8)) 8 l; V* C* N. L4 X
2 s6 k/ D3 Z: G Systick定时时间的设定: 3 ~: i4 |6 Z3 ?$ m0 ^1 |
/ v( R1 e) F& b2 Z! J3 U 重装载值=systick 时钟频率(Hz)X想要的定时时间(S)
$ o% w# Y$ O5 @+ W. M0 n如:时钟频率为:AHB的8分频;AHB=72MHz那么systick的时钟频率为72/8MHz=9MHz;要定时1秒,则
, ]; l" w* z0 h. m; @/ W重装载值=9000000X1=9000000;
, [8 J+ N: T7 A: M* U定时10毫秒 5 d4 T% S/ M' e" s) @- O0 v9 [) W8 @
重状态值=9000000X0.01=90000
' K+ O4 ?% G, mSystick的中断处理函数, : J( S% o1 L, ?3 s+ C
在startup_stm32f10x_hd.s启动文件中有定义。
/ k: i; q7 ?9 ^6 Z( wDCD SysTick_Handler ; SysTick Handler
) u# F- M9 y" G$ j L, Z根据需要直接编写中断处理函数即可: 8 [* ?/ a( _8 i- d. ]0 Q1 s
Void SysTick_Handler (void) 3 F3 f$ O: B, N1 M: j5 l+ Q
{ ;} 8 l$ }5 \$ f6 A0 X8 o* s
注意:
/ k; p# n% |- S2 D& j如果在工程中,加入了stm32f10x_it.c,而又在主函数中编写中断函数,则会报错。
. M- e* b2 H$ I" R) M
% k+ ^- b0 ^( R' b. o% e) ~& A* M9 h, d
因为在stm32f10x_it.c文件中,也有这个中断函数的声明,只是内容是空的。
( {5 E1 M- v, G. g8 u+ W( G/**
( D) x( P* n& u E: j * @brief This function handles SysTick Handler.
! ]% H* n7 J& f. N * @param None
) K- E; I# m* {( H, z * @retval None " A: x2 p2 f% h
*/ / B m6 Z: F! ?8 h$ }# E
void SysTick_Handler(void)
- z$ ?( D8 {* Q$ F+ d- w{ 5 f% U- a) r5 x4 X5 K7 y
}* Q6 J. K8 z: g8 y0 a
% d* e* i5 j) L/ _9 N
中断优先级的修改 $ z8 J7 t- |2 U) T* _
在调用SysTick_Config(uint32_t ticks)之后,调用 void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)。这个函数在core_cm3.h头文件中。 ! ~, B( ^% U. e3 ^* r
具体内容如下: ! y# t* T) H, u
1 B1 e" _8 H( T3 C3 }+ l) |/ }
/**
( N) T& g' O* F * @brief Set the priority for an interrupt
6 @0 r; C2 r- ^( S1 t *
3 Q+ m% }9 S. i: H * @param IRQn The number of the interrupt for set priority 7 M0 L0 f, L4 Y: j
* @param priority The priority to set
2 D2 V/ [9 \: L% ]1 H/ @: d; l * 5 f: S6 w/ G! z. r9 S0 a! t/ l- V. u
* Set the priority for the specified interrupt. The interrupt 5 o, ?" _& ~0 ?' K
* number can be positive to specify an external (device specific) ( K l0 f" ?) T% k+ r
* interrupt, or negative to specify an internal (core) interrupt. 9 s) Y4 @$ ~% c/ E r
*
7 x' N. q0 o- `: J; C$ L * Note: The priority cannot be set for every core interrupt.
: S' X$ u6 [; Z3 j, `8 { */ # m' B! p- e/ s0 _1 {) ]# I2 R
& ^% |+ w+ K; C2 O - h3 I2 Y0 I! s% \0 R
3 Y7 V. i0 _& \0 q9 p+ `
( U" D5 G) R* `6 y static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
( P8 N. q/ ^. k! N, u{ A7 Z6 z- f. |( Y$ K1 Y) B, j$ q& Y
if(IRQn < 0) { ! l/ k/ |2 V: C+ y! c5 L: s- D4 T
SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M3 System Interrupts */
$ Q" ?& B% {- j% {1 q else { # X# h+ h& t2 _# K3 |1 w7 g
NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for device specific Interrupts */
. J S q6 X: Q) Q/ a7 I}
' r) ?2 L* Y( e; e5 @( @9 ^# ?$ _( I& m: F
' y$ }1 C0 K3 X2 S* p3 G1 H5 D# { 下面以一个实例来说明: 2 A# x9 j& J3 r4 U7 M: j: k
利用systick来实现以1秒的时间间隔,闪亮一个LED指示灯,指示灯接在GPIOA.8,低电平点亮。 # u2 g: }! V+ l4 h; p$ _( M
/ ~' b5 _+ q! R L #include "stm32f10x.h"
. @, _- S- o. R' @+ \//函数声明 " h' p9 `: K' Y2 o
void GPIO_Configuration(void);//设置GPIOA.8端口 8 U5 n& _: v! k/ x0 X
u32 t;//定义一个全局变量
5 n, g# g* c t- r: o2 Nint main(void) { // SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); SysTick_Config(9000000); SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); GPIO_Configuration(); while(1); } : m5 S/ k2 a3 t5 d; Q8 N
//GPIOA.8设置函数 void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStruct;//定义一个端口初始化结构体 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//打开GPIOA口时钟 GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;//设置为推挽输出 GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;//设置输出频率50M GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8;//指定第8脚 GPIO_Init(GPIOA,&GPIO_InitStruct);//初始化GPIOA.8 GPIO_SetBits( GPIOA, GPIO_Pin_8);//置高GPIOA.8,关闭LED } //systick中断函数 void SysTick_Handler(void) { t++; if(t>=1) { if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8)==1) {GPIO_ResetBits( GPIOA, GPIO_Pin_8);} } if(t>=2) { if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8)==0) {GPIO_SetBits( GPIOA, GPIO_Pin_8);} t=0; } }
/ P9 j& d) N! }) R5 M) X6 F: _ 模拟后的结果 1、8分频后结果
/ T7 x' |' V* r9 S9 U) } A& X ! l% s! i- j3 _
2、直接调用SysTick_Config(9000000);即不分频的结果,间隔为1/8=0.125s
+ v; u3 @) _/ W ![]()
0 h1 W0 u3 h8 D! E# q: K6 ?# m& t 总结: 1、要使用systick定时器,只需调用SysTick_Config(uint32_t ticks)函数即可, 自动完成了,重装载值的装载,时钟源选择,计数寄存器复位,中断优先级的设置(最低),开中断,开始计数的工作。 2、要修改时钟源调用SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)。 3、要修改中断优先级调用 void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
, L. R0 p. O9 S u9 o2 `( u应用说明: 1、因systick是一个24位的定时器,故重装值最大值为2的24次方=16 777 215, 要注意不要超出这个值。 2、systick是cortex_m3的标配,不是外设。故不需要在RCC寄存器组打开他的时钟。 3、每次systick溢出后会置位计数标志位和中断标志位,计数标志位在计数器重装载后被清除,而中断标志位也会随着中断服务程序的响应被清除,所以这两个标志位都不需要手动清除。 4、采用使用库函数的方法,只能采用中断的方法响应定时器计时时间到,如要采用查询的方法,那只能采用设置systick的寄存器的方法,具体操作以后再做分析。
$ _) V% W, [. }3 ]0 f1 n( @ |