蓝桥杯嵌入式CT117E硬件开发平台经验分享07 | 滴答定时器

蓝桥杯嵌入式CT117E硬件开发平台 | 滴答定时器做精准延时设计

过去我们用51单片机大多采用软件延时方式做一个大致的MS级延时,但是这种延时不是很精准,而且浮动性大,故而本次设计则是采用了STM32F103的滴答定时器做累减操作设计的延时函数。具体实现方式为:

  1. 配置滴答定时器自动重装载的值 -> 启动滴答定时器 -> 累减操作 -> 累减到0 -> 关闭滴答定时器。关于滴答定时器的配置,常用数值为:1MS,10US,1US;设计宏定义,并根据设计的定时器中断时间设计MS延时值宏定义,方法如下:
#define SISTICK_1MS   1
#define SISTICK_10US  100
#define SISTICK_1US   1000

#define SISTICK_TimeSet SISTICK_1MS  //滴答定时器设置的中断时间
#define DELAY_SISTICKTIMESET_MS(N)    (N*SISTICK_TimeSet) //计算的MS延时系数
extern u32 TimingDelay;

void DelaySisTick_Init(u16 SisTick_StateSet)  
{ 
//    SystemCoreClock/1000    //1ms中断
//    SystemCoreClock/100000    //10us中断
//    SystemCoreClock/1000000    //1us中断
	if(SisTick_StateSet == SISTICK_1MS)
    {
		if(SysTick_Config(SystemCoreClock/1000)) //  nTime_ms  ms中断一次,调用不成功则进入死循环,配置成功返回0,出错返回1,AHB时钟,72MHZ
		{
			while(1);
		}
	}
	else if(SisTick_StateSet == SISTICK_10US)
    {
		if(SysTick_Config(SystemCoreClock/100000)) //  nTime_ms  10us中断一次,调用不成功则进入死循环,配置成功返回0,出错返回1,AHB时钟,72MHZ
		{
			while(1);
		}
	}
	else 
	{
		if(SysTick_Config(SystemCoreClock/1000000)) //  nTime_ms  1us中断一次,调用不成功则进入死循环,配置成功返回0,出错返回1,AHB时钟,72MHZ
		{
			while(1);
		}
	}
    SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;      //SysTick_Config 位于core_cm3.h中,配置后先关闭,之后用时再开启
}
  1. 延时函数的设计:开定时器进行累减操作,每到定时器中断一次,就累减一次值,直到为0才停止。
/**
  * @说明     延时函数
  * @参数     nTime: 延时时间
  * @返回值   None
  * @注意: 需要搭配 stm32f10x_it.h  stm32f10x_it.c使用,里面的SysTick_Handler()处理此中断累减
  */
u32 TimingDelay = 0;  //必须为全局变量,让stm32f10x_it.c里面的SysTick_Handler()函数能够使用才行
void DelaySisTick_Time(uint32_t nTime)
{
    TimingDelay = nTime;
    SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; 
    while(TimingDelay != 0);
	SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk; 
}
  1. 中断函数中,记得开启滴答定时器累减操作,执行方法如下:
/**
  * @brief  This function handles SysTick Handler.
  * @param  None
  * @retval None
  */
extern u32 TimingDelay;
void SysTick_Handler(void)
{
	TimingDelay--;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
滴答定时器嵌入式系统中常用的一种计时器,可以用来实现定时任务,比如定时采集数据、定时发送数据、定时控制输出等。 在蓝桥杯嵌入式比赛中,常常会涉及到滴答定时器的使用。下面我们就来介绍一下滴答定时器的使用方法。 滴答定时器的基本原理 滴答定时器嵌入式系统中的一个硬件计时器,它基于一个高精度的时钟源,每隔一定的时间就会触发一个中断。在中断服务程序中,我们可以实现定时任务。 滴答定时器的大致流程如下: 1. 设置计时器的计时周期,即每隔多长时间触发一次中断。 2. 启动计时器,开始计时。 3. 当计时器计时时间达到计时周期时,触发中断,进入中断服务程序。 4. 在中断服务程序中执行定时任务。 5. 中断服务程序执行完毕后,回到主程序。 滴答定时器的使用步骤 在使用滴答定时器时,我们需要先进行一些初始化设置,然后再启动计时器。下面是使用滴答定时器的基本步骤: 1. 设置计时周期 计时周期是指滴答定时器每隔多长时间触发一次中断。我们可以通过修改计时器的预分频和重载值来设置计时周期。 2. 初始化中断服务程序 中断服务程序是指在计时器触发中断时执行的程序。我们需要在程序中定义中断服务程序,并将其与计时器的中断向量绑定。 3. 启动计时器 在初始化设置完成后,我们可以启动计时器,开始计时。计时器启动后,每隔一定时间就会触发中断,执行中断服务程序。 下面是一个简单的滴答定时器使用示例: ```c #include <stdio.h> #include <stdlib.h> #include "stm32f10x.h" void SysTick_Handler(void) // 中断服务程序 { static int count = 0; count++; if (count == 10) // 每隔1s执行一次 { count = 0; printf("Hello World!\r\n"); } } int main(void) { SystemInit(); // 系统初始化 SysTick_Config(SystemCoreClock / 100); // 设置计时周期为10ms while (1) { // 主程序循环 } } ``` 在上面的示例中,我们首先定义了一个中断服务程序SysTick_Handler(),用来在滴答定时器触发中断时执行定时任务。在主程序中,我们调用了SysTick_Config()函数来设置滴答定时器的计时周期为10ms,并启动计时器。在中断服务程序中,我们每隔10次中断(即1s)输出一次“Hello World!”。 总结 滴答定时器嵌入式系统中常用的一种计时器,可以用来实现定时任务。在蓝桥杯嵌入式比赛中,滴答定时器的使用比较常见,需要我们熟练掌握其使用方法。在使用滴答定时器时,我们需要注意计时周期的设置、中断服务程序的定义和启动计时器等问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值