英飞凌TC264学习(三)定时器

英飞凌TC264学习(三)定时器

定时器相关的函数:(在LQ_STM.c中)

 /*************************************************************************
 *  函数名称:void STM_Init(STM_t stm, STM_Channel_t channel, uint32 us)
 *  功能说明:STM初始化
 *  参数说明:
 * @param    stm      : STM标号     STM0 、 STM1
 * @param    channel  : STM通道     STM_Channel_0  STM_Channel_1
 * @param    us       : STM定时中断 时间
 *  函数返回:无
 *  修改时间:2020年3月10日
 *  举    例:STM_InitConfig(STM0, STM_Channel_0, 50000);  //STM0 通道0初始化 50000us 进入一次中断
 *  备    注:外部中断服务函数在LQ_STM.c中  中断优先级配置在LQ_STM.h中 可以自行修改
 *************************************************************************/
 void STM_InitConfig(STM_t stm, STM_Channel_t channel, uint32 us)
 {
 	char      interruptState;
 	interruptState = disableInterrupts();

 	Ifx_STM * STM = IfxStm_getAddress((IfxStm_Index)stm);
 	unsigned char Index = (unsigned char)IfxStm_getIndex(STM) * 2 + (unsigned char)channel;

 	IfxStm_CompareConfig *stmCompareConfig = &g_StmCompareConfig[Index];

 	//调用结构体实现配置
 	IfxStm_initCompareConfig(stmCompareConfig);

     //挂起
 	IfxStm_enableOcdsSuspend(STM);

 	//获取STM模块的微秒计时 tick 数值
 	sint32 ticks = IfxStm_getTicksFromMicroseconds((Ifx_STM *)STM, us);

 	//修改ticks数值,使能触发输出
 	stmCompareConfig->ticks = ticks;
 	stmCompareConfig->comparator           = (IfxStm_Comparator)channel;
 	stmCompareConfig->comparatorInterrupt  = (IfxStm_ComparatorInterrupt)channel; //中断选择
 	stmCompareConfig->triggerPriority      = StmIrqPriority[Index];               //中断优先级设置
 	stmCompareConfig->typeOfService        = StmIrqVectabNum[stm];                //服务内核

 	//比较功能初始化
 	IfxStm_initCompare(STM, stmCompareConfig);
 	IfxCpu_Irq_installInterruptHandler((void*)StmIrqFuncPointer[Index], StmIrqPriority[Index]);//配置中断函数和中断号

 	restoreInterrupts(interruptState);
 }

 *  函数名称:void STM_DelayUs(STM_t stm, uint32 us)
 *  功能说明:STM延时
 *  参数说明:
 * @param    stm      : STM标号     STM0 、 STM1
 * @param    us       : STM延时     时间 us
 *  函数返回:无
 *  修改时间:2020310*  举    例:STM_DelayUs(STM0, 5000);  //延时5000us
 *  备    注:使用延时函数时,请确保对应STM模块调用过STM_Init函数

 *  函数名称:uint32  STM_GetNowUs(STM_t stm)
 *  功能说明:STM获取当前时间
 *  参数说明:
 * @param    stm      : STM标号     STM0 、 STM1
 * @param    us       : STM延时     时间 us
 *  函数返回:无
 *  修改时间:2020310*  举    例:int32_t NowTime =  STM_GetNowUs(STM0);  //获取STM0 当前时间
 *  备    注:使用延时函数时,请确保对应STM模块调用过STM_Init函数

delayms和delayus函数的定义也在LQ_STM.c文件中:

 /*************************************************************************
 *  函数名称:void delayms(unsigned short stmms)
 *  功能说明:延时函数
 *  参数说明:无
 *  函数返回:无
 *  修改时间:2020年3月10日
 *  备    注:delayms(1);延时1 ms
 *************************************************************************/
 void delayms(unsigned short stmms)	//
 {
#if 1
	while(stmms--)
	{
	     STM_DelayUs(STM0, 1000);
	}
#else   //不精确延时
	volatile unsigned long i = 0;
	while(stmms--)
	{
		for (i = 0; i < 16580; ++i)
		{
			__asm("NOP"); /* delay */
		}
	}
#endif
 }

 /*************************************************************************
 *  函数名称:void delayus(unsigned short us)
 *  功能说明:延时函数
 *  参数说明:无
 *  函数返回:无
 *  修改时间:2020年3月10日
 *  备    注:delayus(1);延时1 us
 *************************************************************************/
 void delayus(unsigned short us)
 {
#if 0

	 STM_DelayUs(STM0, us);

#else   //不精确延时
	volatile unsigned long i = 0;
	while(us--)
	{
		for (i = 0; i < 16; ++i)
		{
			__asm("NOP"); /* delay */
		}
	}
#endif
 }

定时器中断示例:

main主函数:

/*************************************************************************
*  函数名称:int core0_main (void)
*  功能说明:CPU0主函数
*  参数说明:无
*  函数返回:无
*  修改时间:2020年3月10日
*  备    注:
*************************************************************************/
int core0_main (void)
{
    //char txt[16];

	// 关闭CPU总中断
	IfxCpu_disableInterrupts();

	// 关闭看门狗,如果不设置看门狗喂狗需要关闭
	IfxScuWdt_disableCpuWatchdog(IfxScuWdt_getCpuWatchdogPassword());
	IfxScuWdt_disableSafetyWatchdog(IfxScuWdt_getSafetyWatchdogPassword());

	// 读取总线频率
	g_AppCpu0.info.pllFreq = IfxScuCcu_getPllFrequency();
	g_AppCpu0.info.cpuFreq = IfxScuCcu_getCpuFrequency(IfxCpu_getCoreIndex());
	g_AppCpu0.info.sysFreq = IfxScuCcu_getSpbFrequency();
	g_AppCpu0.info.stmFreq = IfxStm_getFrequency(&MODULE_STM0);

	TFTSPI_Init(1);               // TFT1.8初始化0:横屏  1:竖屏
	TFTSPI_CLS(u16BLACK);         // 清屏
	TFTSPI_P16x16Str(0,0,(unsigned char*)"北京龙邱智能科技",u16RED,u16BLUE);// 字符串显示

	// 按键初始化
	GPIO_KEY_Init();
	// LED灯所用P10.6和P10.5初始化
	GPIO_LED_Init();

	// 串口P14.0管脚输出,P14.1输入,波特率115200
	UART_InitConfig(UART0_RX_P14_1,UART0_TX_P14_0, 115200);

	// 开启CPU总中断
	IfxCpu_enableInterrupts();

	// 通知CPU1,CPU0初始化完成
	IfxCpu_releaseMutex(&mutexCpu0InitIsOk);
	// 切记CPU0,CPU1...不可以同时开启屏幕显示,否则冲突不显示
	mutexCpu0TFTIsOk=0;         // CPU1: 0占用/1释放 TFT

    
	//用户代码
	STM_InitConfig(STM0, STM_Channel_0, 5000000);//STM初始化,5秒高低电平变换一次一次
	STM_InitConfig(STM0, STM_Channel_1, 1000000);//STM初始化,1秒高低电平变换一次一次
    while (1)	//主循环
    {
        //LED_Ctrl(LED0,RVS);        //电平翻转,LED闪烁
        delayms(100);
    }
}

用到的中断服务函数:

/*************************************************************************
*  函数名称:void STM0_CH0_IRQHandler(void)
*  功能说明:
*  参数说明:无
*  函数返回:无
*  修改时间:2020年3月30日
*  备    注:STM0_CH0使用的中断服务函数
*************************************************************************/
void STM0_CH0_IRQHandler(void)
{
	/* 开启CPU中断  否则中断不可嵌套 */
	IfxCpu_enableInterrupts();

	//清除中断标志
	IfxStm_clearCompareFlag(&MODULE_STM0, g_StmCompareConfig[0].comparator);

	//开启新的中断配置,开始下次中断
	IfxStm_increaseCompare(&MODULE_STM0, g_StmCompareConfig[0].comparator, g_StmCompareConfig[0].ticks);

	/* 用户代码 */
	LED_Ctrl(LED0,RVS);        //电平翻转,LED闪烁
}

/*************************************************************************
*  函数名称:void STM0_CH1_IRQHandler(void)
*  功能说明:
*  参数说明:无
*  函数返回:无
*  修改时间:2020年3月30日
*  备    注:STM0_CH1使用的中断服务函数
*************************************************************************/
void STM0_CH1_IRQHandler(void)
{
	/* 开启CPU中断  否则中断不可嵌套 */
	IfxCpu_enableInterrupts();

	//清除中断标志
	IfxStm_clearCompareFlag(&MODULE_STM0, g_StmCompareConfig[1].comparator);

	//开启新的中断配置,开始下次中断
	IfxStm_increaseCompare(&MODULE_STM0, g_StmCompareConfig[1].comparator, g_StmCompareConfig[1].ticks);

	/* 用户代码 */
	LED_Ctrl(LED1,RVS);        //电平翻转,LED闪烁

}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

rgb2gray

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

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

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

打赏作者

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

抵扣说明:

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

余额充值