当前位置: 首页 > news >正文

(四)GTM_TOM模块定时器中断应用

文章目录

  • 功能:
  • interrupt.c文件:
    • 简单分析:
      • 中断服务函数
      • 初始化函数
  • interrupt.h 文件:
  • 主函数调用
  • 测试现象:


功能:

**定时1ms的中断(使用GTM模块的子单元TOM0模块),借助LED检测,分别300ms 500ms间隔闪烁2个LED **

基于iLLD库,跟外设GTM模块的子模块TOM相关的基本都在:

#include "IfxGtm_Tom_Timer.h"
#include "IfxGtm.h"
#include "IfxGtm_Cmu.h" 

interrupt.c文件:

#include "Interrupt.h"
#include "IfxGtm_Tom_Timer.h"
#include "IfxPort.h"
#include "Blinky_LED.h"

#define ISR_PRIORITY_TOM    9                       /* Interrupt priority number                                    */
#define TOM_FREQ            1000.0f                    /* TOM frequency                                                */


short one_sec_flag = 0;

IfxGtm_Tom_Timer g_timerDriver; //类似linux文件句柄

/* Macro to define the Interrupt Service Routine. */
IFX_INTERRUPT(interruptGtmTom, 0, ISR_PRIORITY_TOM);
/* Interrupt Service Routine of the TOM */
void interruptGtmTom(void)
{
    static int i,j,one_sec = 0;
    IfxGtm_Tom_Timer_acknowledgeTimerIrq(&g_timerDriver);                       /* Clear the timer event            */
    i++;j++;one_sec++;
    if(i>=300){
        i = 0;
        IfxPort_togglePin(LED2);                                                     /* Toggle the LED                   */
    }
    if(j>=500){
        j = 0;
        IfxPort_togglePin(LED1);
    }

    if(one_sec>=1000){
        one_sec = 0;
        one_sec_flag = 1;
    }
}

void initGtmTom(void)
{
    Ifx_GTM *gtm = &MODULE_GTM;

    /* Step 0: Initialize TOM timer configuration */
    //初始化TOM的结构体
    IfxGtm_Tom_Timer_Config timerConfig;
    IfxGtm_Tom_Timer_initConfig(&timerConfig, &MODULE_GTM);

    /* Step 1: Enable GTM */
    //使能GTM模块
    IfxGtm_enable(gtm);

    /* Step 2: Set GCLK frequency (global clock) and  Set CMU_CLK4 frequency (global clock)*/
    //设置GTM内部CMU的总时钟频率为100MHZ,以及CMU的内部子时钟CMU_CLK0频率为1MHZ(当然可以设置CMU_CLK0-7)这里设置1MHZ是由讲究的,肯定有个范围的
    IfxGtm_Cmu_setGclkFrequency(gtm, 100000000);
    IfxGtm_Cmu_setClkFrequency(gtm, IfxGtm_Cmu_Clk_0, 1000000);

    /* Step 3: Configure FXCLK (flexible clock) */
    //再将FXCLK的时钟,绑定到CMU_CLK0的下面(就是FXCLK使用的是CMU_CLK0-7哪个时钟)
    timerConfig.gtm->CMU.FXCLK.CTRL.B.FXCLK_SEL = 1; //1代表使用的是CMU_CLK0  2代表使用CMU_CLK1,以此类推


    timerConfig.base.frequency       = 1000.0f; // Set timer frequency to 1 kHz
    timerConfig.base.isrPriority     = ISR_PRIORITY_TOM; // Set interrupt priority
    timerConfig.base.isrProvider     = IfxSrc_Tos_cpu0;  // Set interrupt provider 设置cpu0 处理1khz的中断
    timerConfig.tom                  = IfxGtm_Tom_0;    // Use TOM_0
    timerConfig.timerChannel         = IfxGtm_Tom_Ch_0; // Use channel 0
    timerConfig.clock                = IfxGtm_Tom_Ch_ClkSrc_cmuFxclk0;  // 这里TOM是使用FXCLK时钟的分频时钟作为TOM输入时钟,这里参数代表对FXCLK时钟是否分频

    /* Step 5: Enable  the required clocks */
    //使能FXCLK和CMU_CLK0的时钟
    IfxGtm_Cmu_enableClocks(gtm, IFXGTM_CMU_CLKEN_FXCLK |IFXGTM_CMU_CLKEN_CLK0);

    /* Step 6: Initialize and start the TOM timer */
    //初始化TOM模块,以及开启定时器计数
    IfxGtm_Tom_Timer_init(&g_timerDriver, &timerConfig);
    IfxGtm_Tom_Timer_run(&g_timerDriver);
}

简单分析:

中断服务函数

IFX_INTERRUPT(interruptGtmTom, 0, ISR_PRIORITY_TOM);
void interruptGtmTom(void)
{
}

TC334系列中断服务函数都是这么写的,IFX_INTERRUPT(中断服务函数名字,0,中断优先级)

然后里面就是精准定时LED闪烁的时间一个是500ms 一个 是300ms 闪烁,以及一个1s精准定时


初始化函数

初始化一个GTM模块的TOM模块配置参数的结构体,然后设置GTM内部管理时钟的CMU的时钟为100MHZ,然后配置CMU管理的子时钟CMU_CLK0为1MHZ,再将FXCLK绑定到CMU_CLK0上,然后设置FXCLK不分频给到TOM,最后初始化TOM,启动TOM。

IfxGtm_Cmu_setGclkFrequency(gtm, 100000000);

这个设置gtm内部CMU的时钟,有说法的,查看手册可以知道最大最小范围。同样设置CMU_CLK0也是有说法的。

IfxGtm_Cmu_setClkFrequency(gtm, IfxGtm_Cmu_Clk_0, 1000000);

这里时钟配置可以理解为STM32那个CUBE_MAX生成代码的时候,自动配置的,但是要配置在合理范围。


将FXCLK的时钟,绑定到CMU_CLK0的下面(就是FXCLK使用的是CMU_CLK0-7哪个时钟)

timerConfig.gtm->CMU.FXCLK.CTRL.B.FXCLK_SEL = 1; //1代表使用的是CMU_CLK0   2代表使用CMU_CLK1,

根据手册查看:

请添加图片描述


这里TOM是使用FXCLK时钟的分频时钟作为TOM输入时钟,这里参数代表对FXCLK时钟是否分频

    timerConfig.clock                = IfxGtm_Tom_Ch_ClkSrc_cmuFxclk0;  // 这里TOM是使用FXCLK时钟的分频时钟作为TOM输入时钟,这里参数代表对FXCLK时钟是否分频

在这里插入图片描述

interrupt.h 文件:

#ifndef __INTERRUPT_H__
#define __INTERRUPT_H__

void initGtmTom(void);
extern short one_sec_flag ;

#endif

主函数调用

#include "Ifx_Types.h"
#include "IfxCpu.h"
#include "IfxScuWdt.h"

#include "Blinky_LED.h"
#include "Interrupt.h"

IFX_ALIGN(4) IfxCpu_syncEvent g_cpuSyncEvent = 0;

void core0_main(void)
{
    IfxCpu_enableInterrupts();
    
    /* !!WATCHDOG0 AND SAFETY WATCHDOG ARE DISABLED HERE!!
     * Enable the watchdogs and service them periodically if it is required
     */
    IfxScuWdt_disableCpuWatchdog(IfxScuWdt_getCpuWatchdogPassword());
    IfxScuWdt_disableSafetyWatchdog(IfxScuWdt_getSafetyWatchdogPassword());
    
    /* Wait for CPU sync event */
    IfxCpu_emitEvent(&g_cpuSyncEvent);
    IfxCpu_waitEvent(&g_cpuSyncEvent, 1);
    
    IfxCpu_enableInterrupts();          /* Enable interrupts after initialization */

    initLED();
    initGtmTom();
    while(1)
    {

    }
}

LED是上一章节的内容,请回看:(三)点亮LED

测试现象:

LED1,2分别以300ms 500ms间隔闪烁。

http://www.dtcms.com/a/99454.html

相关文章:

  • 基于Python深度学习的鲨鱼识别分类系统
  • 垃圾回收机制的几种实现机制简介
  • 【差分】详解一维前缀和和差分问题
  • Java高级JVM知识点记录,内存结构,垃圾回收,类文件结构,类加载器
  • 无人机进行航空数据收集对于分析道路状况非常有用-使用无人机勘测高速公路而不阻碍交通-
  • BurpSuit抓包失败-基础配置
  • 用war解压缩.7zip文件解压缩正在进行但是结束后文件消失了
  • 计算机二级考前急救(Word篇)
  • python:将mp4视频快进播放,并保存新的视频
  • OpenHarmony子系统开发 - 安全(二)
  • Redisson分布式锁深度解析:原理与实现机制
  • STM32F4单片机SDIO驱动SD卡
  • NLP语言模型训练里的特殊向量
  • Spring Boot整合Kafka详细指南(JDK 1.8)
  • Flutter环境搭建
  • JDK1.8和Maven、Git安装教程自用成功
  • 【MySQL基础】函数之字符串函数详解
  • JVM Java类加载 isInstance instanceof 的区别
  • 洛谷题单1-P5703 【深基2.例5】苹果采购-python-流程图重构
  • JDBC的详细使用
  • 【零基础入门unity游戏开发——2D篇】2D物理关节 —— Joint2D相关组件
  • [Lc4_dfs] 解数独 | 单词搜索
  • PyQt6实例_批量下载pdf工具_界面开发
  • MDK中结构体的对齐、位域、配合联合体等用法说明
  • C#:第一性原理拆解属性(property)
  • 分享一个Pyside6实现web数据展示界面的效果图
  • Springboot学习笔记3.20
  • SmolDocling文档处理模型介绍
  • Python 循环全解析:从语法到实战的进阶之路
  • 人工智能之数学基础:矩阵的相似变换的本质是什么?