博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Systick中断函数SysTick_Handler的实现引发的思考
阅读量:4297 次
发布时间:2019-05-27

本文共 1595 字,大约阅读时间需要 5 分钟。

    就在前一段时间,有人突然问我SysTick_Handler(void)这个定时器中断处理函数是怎么定义的?根据以往的经验,我感觉在底层应该会有一个类似于函数声明的东西的存在,但是往下跟程序的话,一直都没有找到相应的定义或者声明,那么究竟SysTick_Handler这个函数怎么来的呢?是不是可以人为的做修改呢?给我的第一感觉是,肯定是可以做修改的,毕竟只是一个 函数 的名字而已,于是就翻看LPC1114的数据手册,结合网上的一些参考文件,去理清楚到底是怎么回事。

那么还是非常容易找到SysTick_Handler()这个函数的位置的,如下图所示:

    我们会发现,几乎所有的中断函数的名字都已经在这里写好了,所以我们有的时候在程序中使用的一些中断,都可以在这个地方进行查找。
    那么,我们如果想要改变一个中断的名字,那么只需要在这里做下修改就可以了,在程序中再使用我们自己定义的中断的名字,但是结合实际的情况来考虑问题,如果我们修改了这些中断函数的名字的话,那么就会降低我们代码的可移植性,所以基本上我们在这里不建议大家做修改。

      说到了定时器中断处理函数,那么定时器Systick是怎样来进行设置的呢?

 上图是LPC1114系统滴答定时器SysTick的结构图。系统滴答定时器位于Cortex-M0内核中,也就是说对于LPC1114或者其他的以CortexM0为内核的板子中,都会有这个系统的定时器。它存在的主要目的是为嵌入式操作系统提供100HZ(即10ms)的定时功能。
    
    系统定时器一共有四个寄存器:这个可以从数据手册上面清楚的了解到:

SYST_CSR    :  系统定时器控制和状态寄存器
SYST_RVR    :  系统定时器重载值寄存器
SYST_CVR    :系统定时器当前值寄存器
SYST_CALIB  : 系统定时器校准寄存器

    在系统定时器的四个寄存器中,SYST_CALIB为校准寄存器,这个是在出厂之前就已经配置好了的,我们不必考虑这个寄存器。那么我们一共需要配置3个寄存器就可以完成我们工作的模块。

  那么接下来我们对我们所要操作的三个寄存器做进一步的剖析
(1)SYST_CSR   寄存器

    CSR寄存器用到的位有4个,bit0用于是否开启定时器,置1的话就是允许,bit1用于控制是否产生中断,该位置为1为允许产生中断,bit2用于设置定时器的时钟源,设为1,定时器的时钟源为主时钟,反之设为0的话定时器的时钟源为主时钟的一半。
(2)SYST_RVR   寄存器   

    RVR寄存器用到0~23位,这个值是定时器倒计时的初始值,打开定时器以后,就会从这里设置的值倒计时到0,倒计时到0以后,又会从此值开始倒计时。
(3)SYST_CVR  寄存器   

    CURRENT  :  读此寄存器返回系统定时器的当前值,给这个寄存器赋值,将使定时器归0,且清CTRL中的COUNTFLAG位。
    CVR寄存器也是用到0~23位,这是一个状态寄存器,当定时器开始运作的时候,这个值在不断的变化,从RVR寄存器获取初值以后,倒计时到0.

系统定时器函数——SysTick_Config()函数

 系统自带的Systick函数,由CMSIS提供,位于core_cm0.h文件中,在使用的时候,可以直接调用的,函数有一个参数ticks,由函数内部的语句
  SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; 
知道ticks就是重载值,表示两次中断的计数。
    
SysTick_Config()函数中的LOAD就是我们之前说的RSR,VAL就是CVR,CTRL就是之前的CSR,上面的操作就是对寄存器相应位进行设置的过程。
    函数中,对控制寄存器的bit0,bit1,bit2都置1,对照前面寄存器相关位的定义可以知道,时钟设置为等于主频,打开系统定时器中断,允许定时器运行。

你可能感兴趣的文章
删远端分支报错remote refs do not exist或git: refusing to delete the current branch解决方法
查看>>
python multiprocessing遇到Can’t pickle instancemethod问题
查看>>
APP真机测试及发布
查看>>
iOS学习之 plist文件的读写
查看>>
通知机制 (Notifications)
查看>>
10 Things You Need To Know About Cocoa Auto Layout
查看>>
C指针声明解读之左右法则
查看>>
一个异步网络请求的坑:关于NSURLConnection和NSRunLoopCommonModes
查看>>
iOS 如何放大按钮点击热区
查看>>
ios设备唯一标识获取策略
查看>>
获取推送通知的DeviceToken
查看>>
Could not find a storyboard named 'Main' in bundle NSBundle
查看>>
CocoaPods安装和使用教程
查看>>
Beginning Auto Layout Tutorial
查看>>
block使用小结、在arc中使用block、如何防止循环引用
查看>>
iPhone开发学习笔记002——Xib设计UITableViewCell然后动态加载
查看>>
iOS开发中遇到的问题整理 (一)
查看>>
Swift code into Object-C 出现 ***-swift have not found this file 的问题
查看>>
为什么你的App介绍写得像一坨翔?
查看>>
RTImageAssets插件--@3x可自动生成@2x图片
查看>>