【英飞凌DAVE - TIMER】

设备

  • 硬件: 英飞凌XMC4200Platform2Go开发板
  • 软件: DAVE

软件中使用定时器的目的和应用

  • 生成精确的时间延迟: 定时器可以用于生成精确的时间延迟,以便在程序中执行特定的操作或任务。这在需要精确时间控制的应用中很常见,比如在通信协议中等待特定时间窗口的到来。

  • 周期性任务调度: 定时器可以用于调度周期性的任务,比如定期执行传感器数据采集、定期发送心跳信号等。通过定时器,可以确保这些任务在预定的时间间隔内得以执行,提高系统的稳定性和可靠性。

  • 计时和计数: 定时器可以用于计时和计数操作,例如测量程序执行时间、计算特定事件发生的次数等。这在性能分析、系统调优和事件统计等方面都非常有用。

  • PWM(脉冲宽度调制)生成: 定时器通常用于生成PWM信号,用于控制电机速度、LED亮度调节、音频输出等应用中。定时器的计数功能可以精确控制PWM信号的周期和占空比。

  • 检测超时和超时处理: 定时器还可以用于检测超时情况,并执行相应的超时处理。例如,在通信中,可以使用定时器来检测数据传输超时,并采取相应的错误处理措施。

总的来说,定时器在嵌入式系统中起着至关重要的作用,它们提供了一种有效的方式来控制时间、调度任务和执行时间相关的操作,从而实现系统的功能和性能要求。

本文意图

在项目开发中,我们经常需要实现定时器或延时功能,即在一定时间后触发特定事件。虽然我们可以简单地使用while或for循环来实现延时,但这种方法的延时时间不够精确,因此最好的方法是利用定时器来触发中断。

    for(int i=0;i<40000;i++){
    	__NOP();
    }

实现步骤

新建DAVE项目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Add new TIMER APP

在这里插入图片描述

双击TIMER APP,设置时间长度,之后在代码中还可以重新设置。

在这里插入图片描述

为了触发event,需要额外添加一个Interrupt APP。

在这里插入图片描述

Add Interrupt APP

在这里插入图片描述

双击Interrupt APP,做一些Configuration。把Interrupt Handler的名字改为自己需要的名称

在这里插入图片描述

连接2个APP

为了将TIMER和INTERRUPT连接起来,右击TIMER APP, 选择“HW Signal connections"

在这里插入图片描述

这样的话,当时间条件满足,会触发中断

在这里插入图片描述

Add DIGITAL_IO APP

因为最后计时结束后想要点亮LED,所以需要添加DIGITAL_IO APP

在这里插入图片描述

双击DIGITAL_IO,选择PIN direction 为Input/Output

在这里插入图片描述

右击APP,进行PIN的配置

在这里插入图片描述

选择LED

generate code

APP 配置好之后,我们点击generate code

在这里插入图片描述

DAVE文件夹下有个Generated 文件夹,会更新。

在这里插入图片描述

Coding

查看APP help

为了了解每个APP 的用法,我们可以右击APP,查看”APP help"

在这里插入图片描述
在这里插入图片描述

代码

#include "DAVE.h"                 //Declarations from DAVE Code Generation (includes SFR declaration)

/**

 * @brief main() - Application entry point
 *
 * <b>Details of function</b><br>
 * This routine is the application entry point. It is invoked by the device startup code. It is responsible for
 * invoking the APP initialization dispatcher routine - DAVE_Init() and hosting the place-holder for user application
 * code.
 */


int main(void)
{
  DAVE_STATUS_t status;


  status = DAVE_Init();           /* Initialization of DAVE APPs  */

  if (status != DAVE_STATUS_SUCCESS)
  {
    /* Placeholder for error handler code. The while loop below can be replaced with an user error handler. */
    XMC_DEBUG("DAVE APPs initialization failed\n");

    while(1U)
    {

    }
  }

  /* Placeholder for user application code. The while loop below can be replaced with user application code. */
/* Note:Input time interval value has to be scaled by 100 to the actual required value.
	     e.g. : required timer interval value = 30.45 micro seconds
	     Input value to the API = 30.45 * 100 = 3045 */

	  TIMER_SetTimeInterval(&TIMER_0, 100000000U);//1s delay
      TIMER_Start(&TIMER_0);
}

/* 中断 */
void Timer_IRQHandler(void)
{
	  TIMER_Stop(&TIMER_0);
	  DIGITAL_IO_SetOutputHigh(&DIGITAL_IO_0);//点亮LED
	  TIMER_ClearEvent(&TIMER_0);
}

One TIMER with many event

如果TIMER不够用的话,我想我们可以用一个TIMER设置不同的时间长度,触发不同的EVENT。但是,这些计时必须不是parallel的,而是顺序的,不然会混乱。


#include "DAVE.h"                 //Declarations from DAVE Code Generation (includes SFR declaration)

#define TIMER_SET_VAL1 	100000
#define TIMER_SET_VAL2 	200000
#define TIMER_SET_VAL3 	300000

uint16_t count=0;
uint8_t __Timer_Flag1=0,__Timer_Flag2=0,__Timer_Flag3=0;
uint8_t __Timer_Set1=0, __Timer_Set2=0, __Timer_Set3=0;
static int sw1_count=0;
#define SW1	XMC_GPIO_GetInput(XMC_GPIO_PORT0,8)
/**

 * @brief main() - Application entry point
 *
 * <b>Details of function</b><br>
 * This routine is the application entry point. It is invoked by the device startup code. It is responsible for
 * invoking the APP initialization dispatcher routine - DAVE_Init() and hosting the place-holder for user application
 * code.
 */
void Timer_Interrupt(void);
void read_switch(void);
void debounce_delay(uint16_t d);
int main(void)
{
  DAVE_STATUS_t status;

  status = DAVE_Init();           /* Initialization of DAVE APPs  */

  if (status != DAVE_STATUS_SUCCESS)
  {
    /* Placeholder for error handler code. The while loop below can be replaced with an user error handler. */
    XMC_DEBUG("DAVE APPs initialization failed\n");

    while(1U)
    {

    }
  }
  //TIMER_Start(&TIMER_0);
  /* Placeholder for user application code. The while loop below can be replaced with user application code. */
  while(1U)
  {
  	read_switch();
	  if(__Timer_Flag1 == 1)
	  {
		  __Timer_Flag1=0;
		  TIMER_SetTimeInterval(&TIMER_0,TIMER_SET_VAL1);
		  TIMER_Start(&TIMER_0);
	  }
	  else if(__Timer_Flag2 == 1 )
	  {
		  __Timer_Flag2=0;
		  TIMER_SetTimeInterval(&TIMER_0,TIMER_SET_VAL2);
		  TIMER_Start(&TIMER_0);
	  }
	  else if(__Timer_Flag3 == 1 )
	  {
		  __Timer_Flag3=0;
		  TIMER_SetTimeInterval(&TIMER_0,TIMER_SET_VAL3);
		  TIMER_Start(&TIMER_0);
	  }
  }
}
void Timer_Interrupt(void)
{
	__NOP();
	__NOP();
	__NOP();
	TIMER_Stop(&TIMER_0);
//	XMC_GPIO_ToggleOutput(XMC_GPIO_PORT0,6);
	if(count++ == 1000)
	{
		TIMER_Stop(&TIMER_0);
//		TIMER_SetTimeInterval(&TIMER_0,100);
//		TIMER_Start(&TIMER_0);
		XMC_GPIO_ToggleOutput(XMC_GPIO_PORT0,6);
		__Timer_Flag1=1;
	}
	else if(count==2000)
	{
		//count=0;
		XMC_GPIO_ToggleOutput(XMC_GPIO_PORT0,7);
		__Timer_Flag2=1;
	}
	else if(count==3000)
	{
		//count=0;
		XMC_GPIO_ToggleOutput(XMC_GPIO_PORT0,7);
		__Timer_Flag3=1;
	}
}
void read_switch(void)
{


	if(SW1 == 0)
	{
		sw1_count++;
		while(SW1 == 0);
		debounce_delay(0x1000);
		if(sw1_count >3)
		{
			sw1_count=0;
		}
		else
		{}
		if(sw1_count == 1)
		{
			__Timer_Flag1=1;
		}
		else if(sw1_count == 2)
		{
			__Timer_Flag2=1;
		}
		else if(sw1_count == 3)
		{
			__Timer_Flag3=1;
		}
	}
}
void debounce_delay(uint16_t d)
{
	while(d--)
	{}
}




  • 25
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Serotonin-timer maven是一个基于Maven构建的库,用于处理与调度任务相关的功能。它能够帮助开发人员在项目轻松地创建和管理定时任务,从而实现自动化和计划性的操作。 该库的核心功能是基于serotonin-timer的调度器模块。它提供了一种简单而强大的方式来定义和执行任务。开发人员可以通过配置简单的表达式来规定定时任务的执行频率,包括秒、分、时、天等。这样,在指定的时间点或时间间隔内,任务会自动触发并执行相关的操作。 除了基本的调度功能,serotonin-timer maven还提供了更多的任务处理选项。开发人员可以设置任务的优先级、并发性等属性,以便更好地控制任务的执行顺序和效率。此外,它还支持任务的错误处理和异常处理机制,保证了任务执行过程的稳定性和可靠性。 使用serotonin-timer maven可以节省开发人员的时间和精力。它简化了定时任务的创建和管理过程,提供了一个可靠的方式来实现自动化操作。无论是在后台运行一些重复性的任务,还是在某个特定的时间点执行关键性的操作,serotonin-timer maven都是一个强大而灵活的选择。 总之,serotonin-timer maven是一个方便实用的Maven库,用于处理定时任务和调度功能。它具有简单易用的特点,并提供了多种高级选项,可以满足不同项目的需求。无论是在个人项目还是在企业级应用,它都是一个值得考虑的解决方案。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

六月悉茗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值