历史上的今天
今天是:2025年03月16日(星期日)
2020年03月16日 | STM32F407ZGT6芯片SysTick定时器模块介绍
2020-03-16 来源:eefocus
本文参考资料《ARM Cortex™-M4F技术参考手册》-4.5章节SysTick Timer(STK),和4.48章节SHPRx,其中STK这个章节有SysTick的简介和寄存器的详细描述。因为SysTick是属于CM4内核的外设,有关寄存器的定义和部分库函数都在core_cm4.h这个头文件中实现。所以学习SysTick的时候可以参考这两个资料,一个是文档,一个是源码。
SysTick简介
SysTick——系统定时器是属于CM4内核中的一个外设,内嵌在NVIC中。系统定时器是一个24bit的向下递减的计数器,计数器每计数一次的时间为1/SYSCLK,一般我们设置系统时钟SYSCLK等于168M。当重装载数值寄存器的值递减到0的时候,系统定时器就产生一次中断,以此循环往复。
因为SysTick是属于CM4内核的外设,所以所有基于CM4内核的单片机都具有这个系统定时器,使得软件在CM4单片机中可以很容易的移植。系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。
SysTick寄存器介绍
SysTick——系统定时有4个寄存器,简要介绍如下。在使用SysTick产生定时的时候,只需要配置前三个寄存器,最后一个校准寄存器不需要使用。
表1.SysTick寄存器汇总

表2. SysTick控制及状态寄存器

表3. SysTick重装载数值寄存器

SysTick属于内核的外设,有关的寄存器定义和库函数都在内核相关的库文件core_cm4.h中。
SysTick配置库函数
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
// 不可能的重装载值,超出范围
if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)
{
return (1UL);
}
/* 设置重装载寄存器 */
SysTick->LOAD = (uint32_t)(ticks - 1UL);
/* 设置中断优先级0x0F */
NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL);
/* 设置当前数值寄存器的值为0 */
SysTick->VAL = 0UL;
/* 设置系统定时器的时钟源为AHB_CLK=168MHz
* 使能系统定时器中断
* 使能定时器
*/
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk;
/* 正常情况返回0 */
return (0UL);
}
用固件库编程的时候我们只需要调用库函数SysTick_Config()即可,形参ticks用来设置重装载寄存器的值,最大不能超过重装载寄存器的值,当重装载寄存器的值递减到0的时候产生中断,然后重装载寄存器的值又重新装载往下递减计数,以此循环往复。紧随其后设置好中断优先级,最后配置系统定时器的时钟为168M,使能定时器和定时器中断,这样系统定时器就配置好了,一个库函数搞定。
SysTick_Config()库函数主要配置了SysTick中的三个寄存器:LOAD、VAL和CTRL,有关具体的部分看代码注释即可。其中还调用了固件库函数NVIC_SetPriority()来配置系统定时器的中断优先级,该库函数也在core_m4.h中定义,原型如下:
__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
{
if ((int32_t)IRQn < 0)
{
SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8 - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);
}else
{
NVIC->IP[((uint32_t)(int32_t)IRQn)] = (uint8_t)((priority << (8 - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);
}
}
因为SysTick属于内核外设,跟普通外设的中断优先级有些区别,并没有抢占优先级和子优先级的说法。在STM32F407中,内核外设的中断优先级由内核SCB这个外设的寄存器:SHPRx(x=1.2.3)来配置。有关SHPRx寄存器的详细描述可参考《Cortex-M4内核编程手册》4.4.8章节。
本文完结!
史海拾趣
|
坛子里好像越来越多的人对此产生了兴趣。我最初的读卡器是用CM200开发的,硬件开发没有什么特别的,CM200内部带地址锁存,接口很方便,其它的按照datasheet照搬就行了。关键是天线板的设计,尺寸形状都会影响,而我觉得这些定了之后,设计的关键又 ...… 查看全部问答> |
|
飞龙教程------51单片机=====最小51系统 51单片机=====最小51系统 电子工程师之家 单片机学习网 http://www.eehome.cn/ 新势力电子单片机 &n ...… 查看全部问答> |
|
我想开发一套数控机床的操作软件,有没有知道这方面的朋友,可以联系我,我在北京,只要你认为你可以做,或者朋友可以做都可以找我,真诚请教!可以加我QQ:913410767… 查看全部问答> |
|
1. 用硬件定时器编写程序,设置时、分、秒定时器,分别对应的地址为:4000H、4002H、4004H,晶振频率为12MHZ(用8096编写) 2.C08__2 MODULE MAIN $INCLUDE(8096.INT) PORT EQU OFFA8H ...… 查看全部问答> |
|
在51单片机系列中,现在生产厂家很多,兼容型号也很多。不同厂家生产的单片机P1口的驱动能力 是不同的。下面仅举最常用的3种单片机为例,谈谈驱动能力。 先说说LS型TTL负载。 LS型TTL负载是指单片机端口所接负载是74LS系列的数字芯片。以TI公司的74 ...… 查看全部问答> |




