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

SysTick的时钟源

[复制链接]
taiyangshengqi 发布时间:2015-1-7 20:16

' U9 w- u/ W0 W- D# Z

+ z# z: z7 M* _* \9 Y' C( d
7 L; Q& q- ~. F3 C6 Z

" f3 T2 ?& Y9 ]0 C我不得不说意法半导体确实有点风骚!甚至有点变态。我对ST文档 STM32F10XXX参考手册的编辑水平真是不敢恭维。手册中好多说明都是含糊不清,甚至将好多对初学者来说很重要的地方都一笔带过,让人着实摸不着头脑。比如前面我说过的关于NVIC嵌套向量中断控制器的介绍,这部分我认为是非常重要的,但当你看完他这部分介绍,你根本不会设置中断服务程序,他有哪些寄存器都不知道,更别说去设置了,NVIC的详细介绍是在Cotex-M3中有详细的介绍,不多说。今天我们说的是systick定时器。
. L8 z; W  P* ?6 R) ^" w5 \4 R% U+ M. M, [3 ~. j3 z# V  p/ @9 P& X
systick定时器和我上面说的情况一样,在手册中根本没有介绍。我费了九牛二虎之力才在一个犄角格拉里找到systick定时器的英文版的说明。在Cotex-M3有介绍,为什么要找STM32的介绍,是因为功能设置上还有点区别。首先看一下systick定时器的作用,下面是Cotex-M3里的一段话:
8 |# G. q- N5 rSysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。例如,为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。
5 A+ d7 N$ B4 e2 e+ r' b/ q* g* B4 R+ o2 h
下面我们就应用SysTick定时器来裸奔,把它作为一个定时器来用,还是老一套,在寄存器头文件中添加定义寄存器:
; h7 p; G. V! F5 Q5 c% x //***************************************************************** # y! M% S& I% ?, K
//*                               SystemTick-Register                                   6 ?: d' `- X, Y0 @
//******************************************************************* 2 Z2 C5 C' I5 X, _* S
#define SYSTICK_TENMS    (*((volatile unsigned long *)0xE000E01C)) , D& f8 n/ t. ?" T
#define SYSTICK_CURRENT  (*((volatile unsigned long *)0xE000E018))
, Y3 o- W& x2 |% t! c- {+ p #define SYSTICK_RELOAD   (*((volatile unsigned long *)0xE000E014))
; {( g" F" k: k, Q* a7 K, c% h #define SYSTICK_CSR       (*((volatile unsigned long *)0xE000E010))
1 a$ e9 I9 O5 N   9 h2 m& I# ^! d* ~) R

( c- K  g* r9 K. A9 ?8 H+ D+ D配置systick寄存器: 6 K6 \/ q2 H# z) c  }
void SysTick_Configuration(void)
) {, }! y' G( S3 F$ p9 O {   K$ \8 ^, B! |4 Q; n
    SYSTICK_CURRENT=0; //当前值寄存器
- S8 ]. `+ U* v, s" l    SYSTICK_RELOAD=20000; //重装载寄存器,系统时钟20M中断一次1mS
$ Y- T8 ~; j, d& h) y* @    SYSTICK_CSR|=0x06;// HCLK作为Systick时钟,Systick中断使能位
' h3 b. F: q& r# ]: A% w, u5 `8 A  } ' v0 p1 |. e4 l, X# @
中断处理:
& F- h8 c' ^, C8 U2 pvoid SysTick_Handler(void) //中断函数 " c( }2 X, i( e$ H1 U5 W6 K9 i! W8 L
{
: b) V6 S6 r9 I: textern unsigned long TimingDelay; // 延时时间,注意定义为全局变量
7 L2 [+ z, s* x3 s0 x/ H+ s2 W   & ]6 |* o+ U/ F: F
# I- T- s' p3 D0 ]5 j
SYSTICK_CURRENT=0; 7 |* `2 U  ~9 j7 e& J, [
if (TimingDelay != 0x00) 7 T. l* I3 }# J* m! J0 s0 G
TimingDelay--;
1 C8 W) {* M7 h5 r- Q8 {  R }
/ p) f& r# e2 i, i/ P! @6 z利用systick的延时函数: % D! L7 [; F, ], R. l  |, c& H) k% ^' f
   
2 ^0 k6 o. F$ U1 v' ^' j( m! \+ z
* k% L6 D, v9 G% n6 junsigned long TimingDelay;  // 延时时间,注意定义为全局变量
6 d. a4 ]! {! Bvoid Delay(unsigned long nTime)  //延时函数
3 h) R- T! G9 U$ Y { ) `! \- y% j/ @4 H6 C
SYSTICK_CSR|=0x07;   // 使能SysTick计数器
/ X  p/ H, P4 h  QTimingDelay = nTime; // 读取延时时间
) v9 Z3 n6 r- ywhile(TimingDelay != 0); // 判断延时是否结束
3 D" G2 D" T( pSYSTICK_CSR|=0x06;// 关闭SysTick计数器 5 b9 U! C9 G; R; N
}
. n# M) p) i' m# E6 d$ B- m   7 m3 A4 w3 f. Y: v6 j
5 _; O' k8 J# u' q8 {) @; X
int main() ( U8 V! \" [1 G2 o" d5 Z1 S$ A+ W
  {
& b1 E$ `, @3 L2 D  V3 @4 t   SystemInit0();    //系统(时钟)初始化
! w, _) p8 u# h, x+ p/ M& q  stm32_GpioSetup (); //GPIO初始化
: A3 G, y+ N4 P1 [( t/ ^- c" \
* p+ o% W( @- _9 E3 D2 j   SysTick_Configuration(); //配置systick定时器 - S  K/ C. t0 Y$ R
) ?/ Z. G' l, ]; F( R3 A
  while(1)
) V; ]( R) I/ q. v, t8 _5 m8 K  { * H0 V8 y# Q6 i& ?  O
   GPIO_PORTB_ODR|=(1<<5);
0 }, Z/ I4 K$ w- U Delay(1000); //1S
% {! _  V- |3 D" G& D  y  GPIO_PORTB_ODR&=~(1<<5); ; s( z, d8 ^9 Q& ^, z9 _2 L; U  j
  Delay(1000); //1S                                                                                % _0 c4 J4 a- K, N+ I  z! a7 t
   }
  @9 L5 c* U- J# T/ P& a1 _+ T }
* [0 v" {$ z& L) D完成!Delay(1000);实现了1S的精确延时,利用Delay(unsigned long nTime);配合systick定时器可以实现任意时间的精确延时,当然通过定时器TIMx也是可以这样做的,我只是用它来说明systick定时器的用法。

- X) }; {# C9 t9 Z  Q  w& x
赞 收藏 评论3 发布时间:2015-1-7 20:16

举报

3个回答
AndyYau-268557 回答时间:2015-1-7 20:26:58
来看你帖子了,很好,很基本。加油一起
wamcncn 回答时间:2015-1-7 21:10:43
本帖最后由 wambob 于 2015-1-7 21:12 编辑 2 r; a. i* v) i- p2 c& H1 U
: x, t2 _) X% l" O- R
有没有完整的代码,正好需要用 系统滴答做键盘扫描,不过我看NUCLEO 072的文档滴答延迟是250MS
wyxy163@126.com 回答时间:2015-1-7 21:40:30
提示: 作者被禁止或删除 内容自动屏蔽
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版