这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 高校专区 » 竞赛辅导 » 英飞凌TC264学习(三)定时器

共9条 1/1 1 跳转至

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

高工
2022-01-16 12:09:14     打赏

英飞凌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

 *  函数返回:无

 *  修改时间:2020年3月10日

 *  举    例:STM_DelayUs(STM0, 5000);  //延时5000us

 *  备    注:使用延时函数时,请确保对应STM模块调用过STM_Init函数



 *  函数名称:uint32  STM_GetNowUs(STM_t stm)

 *  功能说明:STM获取当前时间

 *  参数说明:

 * @param    stm      : STM标号     STM0 、 STM1

 * @param    us       : STM延时     时间 us

 *  函数返回:无

 *  修改时间:2020年3月10日

 *  举    例: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闪烁


}





关键词: TC264     学习     定时器    

专家
2022-01-16 12:41:46     打赏
2楼

参考和学习


专家
2022-01-16 12:51:22     打赏
3楼

学习学习


专家
2022-01-16 14:12:56     打赏
4楼

感谢分享


高工
2022-01-16 15:04:08     打赏
5楼

感谢楼主的分享,很实用了。


高工
2022-01-16 19:57:36     打赏
6楼

谢谢分享,学习学习


专家
2022-01-16 19:59:55     打赏
7楼

谢谢


高工
2022-01-16 21:24:35     打赏
8楼

学习


工程师
2022-01-16 23:17:36     打赏
9楼

代码写的蛮不错的


共9条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]