英飞凌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闪烁
}