STM32----SysTick实现监控开机时长

SysTick实现监控开机时长

systick系统定时器,又叫滴答定时器。在我看来比TIM使用起来要简单。
在实现监控开机时长的例子中:配置定时器以相同的时间间隔进入中断,在中断不断累加计数变量,然后利用计数变量和时间间隔计算出相应的时长。
首先是对SysTick的配置,主要配置其进入中断的时长,一般来说SysTick使用的AHB时钟,计数计数器加一的时间为1/72000000s.在SysTick_Config()函数中参数为进入中断的计数。配置好后,计数器中的数值即为配置的数,每一个时钟周期计数器中的数减一,当计数器中的数为0时触发中断,进入中断服务函数。

void SysTick_Init(void)
{
	if(SysTick_Config(SystemCoreClock/1000))
	{
		while(1);
	}
	
	SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
}

SystemCoreclock的值为系统时钟的值72MHz。对于配置函数SysTick_Config(),配置成功返回0,配置失败返回1.
SysTick->CTRL表示SysTick的使能位。
在这里SysTick_Config()函数的参数为SystemCoreclock/1000,经过计算可以知道进入中断一次的时间为1ms。
t = (1/72000000) * (SystemCoreclock/1000)
设置变量在中断中统计进入中断的次数,从而得到时间。

void SysTick_Handler(void)
{
	Delay_Times++;
	count_1s++;
	if(count_1s == 1000)
	{
		flag = 1;
		count_1s = 0;
	}
	else
	{
		flag = 0;
	}
}

变量Delay_Times用来统计进入中断的次数,变量count_1s和flag控制串口每隔1秒钟向上位机打印一次。
主函数:

int main(void)
	
{
	SysTick_Init();
	GPIO_Config();
	USART_Config();
	
	SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;//使能SysTick
	flag = 0;
	while(1)
	{
		if(flag)
		{
			secs = Delay_Times/1000;
			mins = secs/60;
			hours = mins/60;
			secs = secs - mins*60;
			mins = mins - hours*60;
			printf("the time is:%d:%d:%d\r\n",hours,mins,secs);
		}
		else
		{
			
		}
	}
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您解答关于STM32系统滴答定时器(systick)应用的问题。 系统滴答定时器(systick)是STM32中一个非常重要的计时器,它是一个24位的递减计数器,每当计数器减为0时,会触发一个中断。它通常用于操作系统的时间片轮转、延时函数的实现等。 在STM32中,我们可以通过如下代码使能系统滴答定时器: ```c // 使能系统滴答定时器 SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; ``` 然后,我们可以通过如下代码设置系统滴答定时器的时钟源和计数器值: ```c // 设置系统滴答定时器的时钟源和计数器值 SysTick->CTRL &= ~SysTick_CTRL_CLKSOURCE_Msk; // 使用处理器时钟作为时钟源 SysTick->LOAD = SystemCoreClock / 1000 - 1; // 设置计数器值为1ms ``` 在这段代码中,我们将系统滴答定时器的时钟源设置为处理器时钟,每次计数器减1代表1个处理器时钟周期的时间。然后我们将计数器的初值设置为`SystemCoreClock / 1000 - 1`,这里的`1000`代表我们希望系统滴答定时器每1ms中断一次。 最后,我们需要在中断服务函数中处理系统滴答定时器中断: ```c void SysTick_Handler(void) { // 处理系统滴答定时器中断 } ``` 在中断服务函数中,我们可以编写自己的代码来处理系统滴答定时器中断。例如,可以实现一个简单的延时函数: ```c void delay_ms(uint32_t ms) { uint32_t i; for (i = 0; i < ms; i++) { while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)); // 等待计数器减为0 } } ``` 这个函数可以让程序在执行到它的时候暂停一段时间,等待系统滴答定时器中断触发一定次数后再继续执行。 希望这些代码可以帮助您更好地理解STM32系统滴答定时器的应用。如果您还有其他问题,请随时提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值