时钟滴答定时器(sysclk)用法详解

本文详细介绍了STM32的sysclk(时钟滴答定时器)的使用,包括定时、us/ms级延时和计时功能。通过具体的代码示例,展示了如何实现LED间隔闪烁、us级定时以及定时器超时判断等操作,适用于stm32f103开发板,基于Cortex-M3内核。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录:

概述:本篇博客针对sysclk内核定时器(时钟滴答定时器)的常见用法进行总结,分别实现sysclk的定时、延时、计时功能,全部为代码,寄存器描述需参考《Cortex-M3 权威指南》。

平台:stm32f103奋斗开发板   开发环境:MKD5


1:sysclk的定时功能

2:sysclk的us/ms级延时功能

3:sysclk计时功能


1:sysclk的定时功能:LED1、LED2、LED3分别间隔不同的时间闪烁

main.c函数

/*
*FUNC:使用内核中的滴答定时器实现定时功能
*MCU:stm32f103
*DATE:2016/08/30
*/

#include "Sys_Driver.h"
#include "Led_Driver.h"
#include "RCC_Driver.h"

/*主函数*/
int main()
{
	SysTick_Init(INT_10MS,SysTick_CLKSource_HCLK_Div8);    /*内核滴答定时器配置*/
	RCC_PeriphClock_Config();                              /*外设时钟配置*/
	Led_Init();                                            /*LED灯初始化*/
	while(1)
	{
		/*任务1:led1每隔1s闪烁*/
		if(led1_flsh_times >= 100)
		{
			led1_flsh_times = 0;
			led1_on_off = !led1_on_off;
			if(led1_on_off == 1)
			{
				LED_ON(1);
			}
			else
			{
				LED_OFF(1)
			}
		}
		
		/*任务2:led2每隔2s闪烁*/
		if(led2_flsh_times >= 200)
		{
			led2_flsh_times = 0;
			led2_on_off = !led2_on_off;
			if(led2_on_off == 1)
			{
				LED_ON(2);
			}
			else
			{
				LED_OFF(2)
			}
		}
		
### N32G43X 单片机 `delay_init` 函数实现详解 对于N32G43X单片机而言,其延时函数的设计通常基于SysTick定时器完成。虽然具体的代码可能因开发板或库的不同而有所差异,但核心逻辑与STM32系列相似。以下是关于`delay_init`函数的实现分析: #### 1. **SysTick 定时器简介** SysTick 是 ARM Cortex-M 系列处理器中的一个硬件模块,主要用于提供精确的时间间隔控制功能。它可以通过配置寄存器来设置重装载值以及中断使能状态。 在初始化过程中,`delay_init`的主要作用是对SysTick进行必要的参数设定,使其能够按照指定频率触发滴答事件。具体来说,该过程涉及以下几个方面: - 配置SysTick 的时钟源。 - 设置每滴答一次所需的时间长度(即 Reload Value)。 - 启动 SysTick 计数器并开启相应的中断服务程序(如果需要的话)。 #### 2. **`delay_init` 函数的功能描述** 根据已有资料[^1],可以推测出`delay_init`函数的大致结构如下所示: ```c void delay_init(u8 SYSCLK){ if(SYSCLK == HCLK){ // 如果选择了HCLK作为系统时钟,则直接使用之 SysTick->CTRL |= SysTick_CLKSource_HCLK; } else{ // 若选择的是其他分频后的时钟源则需另行处理 SysTick->CTRL &= ~SysTick_CLKSource_HCLK; } // 设定最大自动加载数值以便后续计算更方便快捷些. SysTick->LOAD = SystemCoreClock /1000 -1 ;//假设希望达到1ms精度 NVIC_SetPriority (SysTick_IRQn,(1<<__NVIC_PRIO_BITS)-1);//最低优先级 SysTick->VAL =0;//清零当前计数值 SysTick->CTRL|=SysTick_ENABLE|SysTick_INTFLAG;//启动systick 并允许其中断发生 } ``` 上述伪代码展示了如何通过调整不同的输入变量SYSCLK 来改变实际使用的时基单位,并最终达成预期效果——创建固定周期性的延迟机制。值得注意的是,在这里我们设定了每次重新装入计数器前的最大值为(SystemCoreClock/1000)-1 ,这意味着当CPU运行速度较快时可能会得到更加精细的结果;反之亦然。 另外一点需要注意的就是关于异常响应级别的定义部分(NVIC),在这里将其安排到了尽可能低的位置上以减少对实时性能的影响程度。 #### 3. **关键点解析** ##### (1)**时钟源的选择** 正如前面提到过的那样,ARM架构提供了两种可供挑选的方式用来驱动内部计时装置的工作节奏—一种是以未经任何修改的形式直接采用主振荡信号(HCLK);另一种则是经过一定比例缩小之后再加以运用(DIV8)[^4] 。因此,在编写此类应用程序的时候就需要特别留意这一点,因为错误地指派了不恰当类型的脉冲序列很可能导致整个系统的运作偏离预想轨迹之外。 ##### (2)**时间基准的确立** 为了确保所构建出来的等待区间具备足够的准确性,必须合理规划好每一个独立单元之间相互转换的比例关系。例如说如果我们期望获得千分之一秒钟级别上的分辨率,那么就应该把Reload Register里的数据填充成接近于目标值的样子[(SystemCoreClock/1000)-1 ]。当然啦,这个操作的前提条件是我们已经确切知晓目前所在环境下的总线速率是多少才行哦! ##### (3)**中断向量表位置更新** 最后一步就是要把新建立起来的服务请求映射至合适的地址空间范围内去执行相应动作咯~ 这里采用了最基础也是最常见的方法论–调用专门设计好的辅助工具函数NVIC_SetPriority()来进行精细化管理各个层次之间的先后顺序排列情况。同时别忘了还要记得清除掉原有的残留记录以免造成不必要的干扰现象哟~ --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值