ARM Cortex-M0+内核定时器

为什么需要计数器/定时器?计数器/定时器适用范围

在嵌入式应用系统中,能对外部脉冲信号或开关信号进行计数,可以通过计数器来完成。

有些设备要求每间隔一段时间开启并在一段时间后关闭,有些指示灯要求不断地闪烁,可以使用定时信号来完成。

系统日历时钟产生不同频率的声源等也需要定时信号。

定时和计数问题的解决方法是一致的,只不过是同一个问题的两种表现形式。

计数器/定时器实现原理

  1. 完全硬件方式:基于逻辑电路实现,现较少使用。
  2. 完全软件方式:利用计算机执行指令的时间实现定时,占用CPU,不适用于多任务环境。一般仅用于时间较短的延时且重复次数较少的情况。
  3. 可编程计数器/定时器:在设定之后与CPU并行工作,不占用CPU工作时间。

根据需要的定时时间,用指令对定时器设置定时常数,并用指令启动定时器开始计数,当计数到指定值时,便自动产生一个定时输出,或中断信号告知CPU。定时器开始工作后,CPU可以直接去处理其他任务。

如果利用定时器产生中断信号可以建立多任务环境,可以大大提高CPU的利用率。

ARM Cortex-M内核中包含一个简单的定时器SysTick(嘀嗒定时器)

SysTick定时器

被捆绑在嵌套中断向量控制器NVIC中,有效位数是24位,采用减1计数的方式工作,当减1计数到0,可产生SysTick中断,中断号为15。

嵌入式操作系统或使用时基的嵌入式应用系统,都必须由一个硬件定时器来产生需要的SysTick中断,作为整个系统的时基

因为所有使用Cortex-M内核的芯片都带有SysTick,SysTick处理方式相同。所以使用SysTick产生时间“嘀嗒”可以化简嵌入式软件在Cortex-M内核芯片间的移植工作。

SysTick模块的编程结构

4个32位寄存器

ARM Cortex-M0+内核定时器_第1张图片

溢出标志位COUNTFLAG:用于读取计数器状态

时钟源选择位CLKSOURCE:用于选择时钟源

中断使能控制位TICKINT:用于禁止或允许中断

SysTick使能位ENABLE:用于关闭或使能该模块

复位时,寄存器各位为0

ARM Cortex-M0+内核定时器_第2张图片

计数器保存当前计数值,这个寄存器是由芯片硬件自行维护,用户无需干预,系统可通过读取该寄存器的值获得更精细的时间表示。

重载寄存器

用于控制定时器触发的时间间隔,在计数器减到0后,控制及状态寄存器的溢出标志位被置1,产生中断请求,并使用该寄存器的值重载,继续进行减1计数。

重载计数器与计数器都是低24位有效。 

优先级寄存器

编写SysTick模块的初始程序还需要M0+内核优先级设置寄存器SHPR3。

SHPR3:用于设定SysTick模块中断的优先级,位于系统控制模块中。最高两位(31、30)用于设置SysTick优先级,一般设置为3级(0-3级)

只有SysTick、SVC(系统服务调用)和PendSV(可挂起系统调用)等内部异常可以设置其中断优先级,其它内核异常的优先级是固定的。

SVC的优先级在SHPR2中设置,SysTick、PendSV的优先级在SHPR3中设置。

SysTick构件设计

SysTick驱动构件中仅需要一个函数,即初始化函数。

SysTick构件头文件(systick.h)

ARM Cortex-M0+内核定时器_第3张图片

ARM Cortex-M0+内核定时器_第4张图片

使用SysTick构件设计

以SysTick定时器模块为时钟源,每隔一秒通过串口向PC机发送时、分、秒信号。

编程

首先在main函数中初始化SysTick模块。然后在中断服务程序中编写程序,对中断的触发进行计数,从而实现更长时间的定时功能。

SysTick构件中断服务例程

ARM Cortex-M0+内核定时器_第5张图片

ARM Cortex-M0+内核定时器_第6张图片

程序主要实现的功能

  1. SysTick使用内核时钟的16分频,即工作时钟为3MHz
  2. 上电或按复位按钮时,调试串口输出字符串(“苏州大学嵌入式实验室SysTick构件测试用例)。
  3. SysTick每10ms中断一次,在中断里再进行计数判断,每100个SysTick中断LIGHT_BLUE灯状态改变,同时串口输出“MCU记录的相对时间”。

 

嵌入式技术基础与实践(第4版)

 

 

 

你可能感兴趣的:(嵌入式)