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

SysTick的时钟源

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




我不得不说意法半导体确实有点风骚!甚至有点变态。我对ST文档 STM32F10XXX参考手册的编辑水平真是不敢恭维。手册中好多说明都是含糊不清,甚至将好多对初学者来说很重要的地方都一笔带过,让人着实摸不着头脑。比如前面我说过的关于NVIC嵌套向量中断控制器的介绍,这部分我认为是非常重要的,但当你看完他这部分介绍,你根本不会设置中断服务程序,他有哪些寄存器都不知道,更别说去设置了,NVIC的详细介绍是在Cotex-M3中有详细的介绍,不多说。今天我们说的是systick定时器。

systick定时器和我上面说的情况一样,在手册中根本没有介绍。我费了九牛二虎之力才在一个犄角格拉里找到systick定时器的英文版的说明。在Cotex-M3有介绍,为什么要找STM32的介绍,是因为功能设置上还有点区别。首先看一下systick定时器的作用,下面是Cotex-M3里的一段话:
SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。例如,为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。

下面我们就应用SysTick定时器来裸奔,把它作为一个定时器来用,还是老一套,在寄存器头文件中添加定义寄存器:
//*****************************************************************
//*                               SystemTick-Register                                   
//*******************************************************************
#define SYSTICK_TENMS    (*((volatile unsigned long *)0xE000E01C))
#define SYSTICK_CURRENT  (*((volatile unsigned long *)0xE000E018))
#define SYSTICK_RELOAD   (*((volatile unsigned long *)0xE000E014))
#define SYSTICK_CSR       (*((volatile unsigned long *)0xE000E010))
   

配置systick寄存器:
void SysTick_Configuration(void)
{
    SYSTICK_CURRENT=0; //当前值寄存器
    SYSTICK_RELOAD=20000; //重装载寄存器,系统时钟20M中断一次1mS
    SYSTICK_CSR|=0x06;// HCLK作为Systick时钟,Systick中断使能位
  }
中断处理:
void SysTick_Handler(void) //中断函数
{
extern unsigned long TimingDelay; // 延时时间,注意定义为全局变量
   

SYSTICK_CURRENT=0;
if (TimingDelay != 0x00)
TimingDelay--;
}
利用systick的延时函数:
   

unsigned long TimingDelay;  // 延时时间,注意定义为全局变量
void Delay(unsigned long nTime)  //延时函数
{
SYSTICK_CSR|=0x07;   // 使能SysTick计数器
TimingDelay = nTime; // 读取延时时间
while(TimingDelay != 0); // 判断延时是否结束
SYSTICK_CSR|=0x06;// 关闭SysTick计数器
}
   

int main()
  {
   SystemInit0();    //系统(时钟)初始化
  stm32_GpioSetup (); //GPIO初始化

   SysTick_Configuration(); //配置systick定时器

  while(1)
  {
   GPIO_PORTB_ODR|=(1<<5);
Delay(1000); //1S
  GPIO_PORTB_ODR&=~(1<<5);
  Delay(1000); //1S                                                                                
   }
}
完成!Delay(1000);实现了1S的精确延时,利用Delay(unsigned long nTime);配合systick定时器可以实现任意时间的精确延时,当然通过定时器TIMx也是可以这样做的,我只是用它来说明systick定时器的用法。

收藏 评论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 编辑

有没有完整的代码,正好需要用 系统滴答做键盘扫描,不过我看NUCLEO 072的文档滴答延迟是250MS
wyxy163@126.com 回答时间:2015-1-7 21:40:30
提示: 作者被禁止或删除 内容自动屏蔽

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版