SysTick_Handler cortex-m0 LPC1114
就在前一段时间,有人突然问我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,对照前面寄存器相关位的定义可以知道,时钟设置为等于主频,打开系统定时器中断,允许定时器运行。
SysTick_Handler cortex-m0 LPC1114相关推荐
- 基于安路FPGA的Cortex M0移植【FPGA】
基于安路FPGA的Cortex M0移植 这其实是今年上半年参加集创赛安路科技杯时候做的内容,当时忙着考研复习大概做了个框架参赛,没想到还混到一个分赛区二等奖加一次公费旅游,现在保研后闲着写点博客记录 ...
- hardfault常见原因_XMC实验分享之四十八: Cortex M0的Hard Fault发生原因
凡是在Cortex M系列内核上写过程序的程序员, 没有不知道Hard Fault的. 大多数程序出现问题的表现就是进入Hard Fault. 但是进入Hard Fault的原因是甚么, 为了查明这个 ...
- 基于Cortex M0+的STM32L0系列简介
L0系列是意法半导体于2014年新推出的超低功耗的MCU,基于ARM Cortex M0+内核.目前有STM32L0x1,STM32L0x2,STM32L0x3三个子系列,默认主频为32M,RAM都是 ...
- 32 位 ARM® Cortex®-M0+内核 单片机
PY32F003 系列微控制器采用高性能的 32 位 ARM® Cortex®-M0+内核,宽电压工作范围的 MCU.嵌入高达 32Kbytes flash 和 4Kbytes SRAM 存储器,最高 ...
- 32位ARM®Cortex®-M0+内核单片机 XL32F003系列MCU
XL32F003系列微控制器采用高性能的32位ARM®Cortex®-M0+内核,宽电压工作范围的MCU.嵌入高达64 Kbytes flash和8 Kbytes SRAM存储器,最高工作频率32 M ...
- 新唐ARM®Cortex™-M0特点总结
ARM®CortexTM-M0特点: 主频50mhz主频,0.9DMIPS/MHz(相当于8位和16位产品的2-4倍) 小的处理内核,系统和存储器,可以降低器件成本 完善的电源管理(睡眠,深度睡眠和深 ...
- ARM Cortex M0权威指南_PDF电子书下载 带书签目录 高清完整版 http://pan.baidu.com/s/1jGKQSwY MariaDB入门很简单_PDF电子书下载 带
ARM Cortex M0权威指南_PDF电子书下载 带书签目录 高清完整版 http://pan.baidu.com/s/1jGKQSwY MariaDB入门很简单_PDF电子书下载 带 ...
- 英飞凌tle985x芯片简介--集成了Arm®Cortex®M0的H桥驱动芯片
TLE985X解决方案的简介 Infineon`s integrated motor driver optimizes the target applications by offering cost ...
- Cortex‐M3和Cortex‐M0是否都能位带操作
最近在进行stm32l011f4的编程,想到stm32有位带操作,便想试一试,但是事与愿违,先贴下位带操作代码 Cortex‐M0的位带操作代码 //IO输出方向设置 #define SDA_IN() ...
- 基于ARM Cortex M0 核心的低功耗蓝牙BLE芯片
MS1793S 是一款基于ARM Cortex M0 核心的低功耗蓝牙芯片,射频采用2.4GHz ISM 频段的频率,2MHz 信道间隔,符合蓝牙规范.MS1793S使用高性能的ARM®Cortex® ...
最新文章
- oracle 常用故障,Oracle常见问题解决方案汇总
- 简述HTML DOM及其节点分类
- irrlicht v1.6 例程18 Splitscreen
- 批量提交 kafka_Kafka精华问答|kafka的使用场景是什么?
- 开源大数据:MLSQL
- .Net 面试题 汇总(二)
- 获得Azure订阅LoadBalancer的脚本
- 反编译object文件c语言,能不能通过反编译程序看.sys文件的源代码!
- 计算机组成原理知识点总结白中英,计算机组成原理知识点总结.pdf
- 基于HTTP协议的Java文件传输
- 联想笔记本电脑B490、B480拆机教程(清灰、换硅脂、换散热器)详细步骤
- Java音乐播放:获取音频信息
- java.lang.null_java.lang.nullpointerexception 怎么解决
- OpenCV中文文档4.0.0学习笔记(更新中……)
- LeetCode/LintCode 题解丨一周爆刷字符串:独特的摩尔斯编码
- 铣床是什么?怎么分类
- WordPress网站速度优化教程
- 串口通信之————IIC(软件驱动)
- 载药脂质体并表面修饰各种分子定制
- 计算机办公软件应用实训,计算机专业职业教育实训系列教材:Office 2007办公软件实训教程...
热门文章
- spring @value
- iOS多线程编程的知识梳理
- JVM知识(三):内存模型和可见性
- zookeeper的集群配置
- CSS里各种垂直水平居中方式的基础用法
- 整合ssh model $$_javassist_13 cannot be cast to javassist.util.proxy.Proxy
- CVS的几个学习小站及配置说明
- 如何解决EXCEL中的科学计数法
- 支持FreeMarker需要哪些JAR包?
- Airflow 中文文档:用upstart运行Airflow