【单片机/嵌入式】【梁山派】学习日志06:滴答定时器-系统时钟

滴答定时器SysTick

一、滴答定时器-介绍

SysTick定时器可用作标准的下行计数器,是一个24位向下计数器,有自动重新装载能力,可屏蔽系统中断发生器。Cortex-M4处理器内部包含了一个简单的定时器,所有基于M4内核的控制器都带有SysTick定时器,这样就方便了程序在不同的器件之间的移植。SysTick定时器可用于操作系统,提供系统必要的时钟节拍,为操作系统的任务调度提供一个有节奏的“心跳”。正因为所有的M4内核的芯片都有Systick定时器,这在移植的时候不像普通定时器那样难以移植。

RCU 通过 AHB 时钟(HCLK)8 分频后作为 Cortex 系统定时器(SysTick)的外部时钟。通过对 SysTick 控制和状态寄存器的设置,可选择上述时钟或 AHB(HCLK)时钟作为 SysTick 时钟。关于系统时钟的介绍可参考用户手册的第89页。

 

SysTick定时器设定初值并使能之后,每经过1个系统时钟周期,计数值就减1减到0时,SysTick计数器自动重新装载初值并继续计数同时内部的COUNTFLAG标志位被置位,触发中断(前提开启中断),运行中断服务函数SysTick_Handler()

二、滴答定时器-寄存器

在GD32F3X0用户指南有关SysTick寄存器的介绍:

在core_cm4.h中可查看其定义:

关于寄存器的配置在core_cm4.h下的SysTick_Config函数中已经写好了:

三、滴答定时器-库函数

SysTick定时器的使用主要有SysTick_Config()函数和systick_clksource_set(uint32_t systick_clksource)函数,SysTick_Config()函数主要用来设置定时时间,systick_clksource_set()函数用来选择SysTick时钟源

四、系统默认时钟的设置

GD32单片机的系统时钟配置(换晶振)https://www.bilibili.com/read/cv9446355

系统时钟是在”startup_gd32f450_470.s”启动文件中进行配置的。

单片机进入main函数前会先进入SystemInit()函数进行时钟配置。SystemInit()就是配置时钟的第一层,里面有很多等待晶振上电、判断晶振是否稳定的程序语句。等待晶振上电稳定需要一段时间。关键在于最后的system_clock_config()函数。

 

下面的代码即为“system_gd32f4xx.c”文件44到57行,通过取消某一行宏定义的注释,以选择某一时钟作为系统时钟源(主频)。若某一行时钟宏定义被取消注释后,上面的函数system_clock_config()即可判断需要调用哪一个时钟源函数。

这里调用的是system_clock_200m_25m_hxtal()函数,即系统默认时钟频率为200MHz,采用25M外部高速晶振。进入该函数查看一下:

五、滴答定时器-配置

在systick.c中找到systick_config()这个函数:

SystemCoreClock / 1000U时钟次数,即放入重装载寄存器中的值,因为此时系统默认时钟为200MHz,故每计数一次时钟为1/200 000 000s的时间,那么计数SystemCoreClock / 1000U 个时钟的时间就是SystemCoreClock / 1000U * 1/200 000000s = 1 / 1000U = 1ms

函数SysTick_Config()位于’’core_cm4.h’’文件中:

NVIC_SetPriority(SysTick_IRQn, 0x00U);是开启中断,每当定时1ms时间到就会进入到中断函数SysTick_Handler里面,所以每进入一次中断就是1ms,如果我们定时5ms,只需要进入5次中断即可。

函数NVIC_SetPriority()同样位于’’core_cm4.h’’文件中:

参数IRQn是一个枚举变量,定义于’’gd32f4xx.h’’文件中。

六、滴答定时器-使用

GD32官方也给我们写好了延时1ms的函数,void delay_1ms(uint32_t count),有一个参数count,这个就是我们要延时的时间的ms数,延时1ms就是delay_1ms(1),延时1s就是delay_1ms(1000)。需要注意的是这个延时是阻塞延时,在延时的时间里一直在等待,比较浪费系统资源,慎用。

七、滴答定时器-LED闪烁

主函数:

延时函数delay_1ms()如下:

 

虽然delay函数中仅包含一个空循环,但之所以只需要调用delay_1ms()函数即可进行延时,正是因为在空循环时,滴答定时器systick仍然在计时并且触发中断。而systick的中断服务函数正好包含了delay_decrement()函数,所以可以不断递减count的值,实现延时。

系统所有中断的中断服务函数都包含在"gd32f4xx_it.c"文件中。

 

posted @ 2022-11-05 17:06  U羊U  阅读(1353)  评论(0编辑  收藏  举报