STMCU小助手
发布时间:2022-12-26 15:00
|
概述, _6 X" I% }: r; n; N* ] Systick是一个定时器,Cortex M3,M4的芯片中都有 & U( F: U+ C7 b Systick定时器通常用于实现延时函数,节约MCU资源 3 b7 Z* h8 N" {9 i6 g5 y$ T Systick定时器就是系统滴答定时器,是一个24位的倒计时定时器,计到0为止 / e2 ~; |) d% O4 g) J1 ]4 I: } 从RELOAD寄存器中自动装载定时初始值 只要不把它在Systick控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作' B4 V4 E9 }8 I. J: \! _ + R ]9 ^1 M" A Systick定时器被捆绑在NVIC中,用于产生SYSTICK异常 Systick中断的优先级可以设置 Systick的寄存器& s& ?4 |( i2 T
CTRL 9 o& h- K8 H/ J8 O0 Q6 T
6 f0 w! o0 s( o2 h$ J0 W ENABLE 使能. @* U+ ~: k, } TICKINT 是否产生中断 # G0 c( O* h3 V$ ~- p6 T CLKSOURCE 时钟源,外部时钟源是HCLK的1/8,内核时钟是HCLK' l _+ K, W p( h ! K( \/ s# _: f7 n, O/ ` COUNTFLAG 一个FLAG: {. Q) B J8 h2 V6 V 4 a; Y+ y9 f, I' b* E LOAD ) l( b3 ^$ j0 Z% D
: R. {$ E$ M) u/ X; t/ w8 b4 j VAL1 B: u# J8 k2 e2 Q ! P6 H$ w) `& h/ {9 o
CALIB 不常用 相关函数 Systick_CLKSourceConfig ' b. \9 m( j- N! `, m' F 在固件库中的misc.c文件中(misc.c主要是用于中断管理)4 N2 k( }% F1 | 函数实现如下% ~) f2 H& |0 t9 d. K# L* w : K5 t) N) C* O4 O7 r 2 W( v: W4 {. y: i8 E
SysTick定义如下+ a# N5 l2 U' @ ]" L/ Q # S H$ H7 Q. x y( U 3 n6 I0 @& t( V5 K" @4 z' j3 z core_cm3.h
$ ~2 J! w. f6 a8 W$ \) Y+ v3 f 同一个文件中,查看其结构体类型4 g8 _# n: z( Q8 N% ]/ m
& h: T7 k" c1 i9 a- _- T 查看Systick_CLKSourceConfig函数入口参数的可选项,点击断言
4 ]) R1 b' @+ h& ^7 ~8 M- G; F3 V
% T% I0 b$ [' q6 _9 V# k 可以看到,可选性分别是 SysTick_CLKSource_HCLK_Div8: ]0 r- E3 {# D* t SysTick_CLKSource_HCLK 因此: % N) H' j5 Z% M
内核级别的SysTick_Config SysTick_Config - u2 q* ]! R, ~" C2 [+ F core_cm3.h(用于内核级别的函数)& J, m/ ~' l) U) [. y& v ' p% u" @6 o$ p) l% J
: r$ Q7 F6 R0 |) H: X 入口参数是两个中断之间的时间间隔# d1 k& t. X- v3 }# j& { 3 P0 ^; \ s# f& D: N
2 L8 d5 h( K$ L3 m6 b k& ~ # p( A: E& g3 V# f$ S5 v" t# m8 O' { 判断有效性 2 t: w/ J& J# }6 j. ]% V' D * L, |& q- S4 p
, g' o5 q" e7 A 设定装载值2 U- W- s& _4 q2 @2 n, X " d& x' J$ A' N
6 T) k! E; D/ [ ' x- [1 I) A# B8 W: ] 设定优先级,且初值为0
设置时钟源,开启中断,使能定时器 0 e {9 s" i7 Z4 f; K; D8 P ) |+ C- s u# x% o n2 P 设定了两个Systick中断之间的间隔,也就是说每过这么多的时间,systick的中断服务函数就要运行一次8 [ W) H9 X4 E/ g # Q3 v1 d+ ?, I9 a7 {! S, H 一种实现方法- v7 X9 d. v5 W
这样子,每次Systick定时器减1,都需要进入一次中断服务函数,这样会对CPU造成很大的浪费 : u3 y& v! z; o 另一种实现方法 SYSTEM文件下的& v# n. O9 Y2 b& ^4 x/ T! f delay.c delay.h
( o) W; a5 a/ \3 f4 W4 u z& J 若使用操作系统,则使能该宏
8 u8 B. s; s: t2 A + [3 O$ w- u' i I3 U; N3 u4 P delay_init函数 " E q3 P, n: u( }8 o. G, f0 w [ h* \' T( h5 o5 U
delay_us 注意:nus或nms不能大于LOAD的最大值,即2的24次方-1: I! n9 H5 T0 w
————————————————) ^1 e1 ^0 U2 ?* { Z 版权声明:CodeForCoffee/ g. f- P: k+ P' f! F9 M- y( j |
经验分享 | 利用TIMER定时和捕获功能实现编解码演示
STM32 LSE 不起振排查指南:五大核心原因与快速解决方案
我心中的ST中文论坛
经验分享 | 利用STM32 TIMER实现同频跟随输出示例
2025软件工具兔哥知道
经验分享 | 利用STM32 TIMER实现同频跟随输出示例
经验分享 | 一个基于TIMER事件的中断响应话题_续
经验分享 | 一个基于TIMER事件的中断响应话题
11张图学会STM32定时器!
经验分享 | STM32U5系列TIMER+DMA+DAC应用演示
微信公众号
手机版