1. 前言

本文将介绍如何在TC397 EB开发板上使用MCAL配置STM(系统定时器)模块,实现LED闪烁功能。STM模块用于定时中断和事件计时,是嵌入式系统中常用的定时器模块。

2. STM模块配置步骤

  • 添加MCAL模块
    在这里插入图片描述
    在这里插入图片描述

  • STM模块配置

STM模块配置较为简单,StmDevErrorDetect可以根据需要勾选
在这里插入图片描述

3. MCU模块配置

3.1. McuClockSettingConfig_0

在这里插入图片描述

McuSTMFrequency 指定了 STM(System Timer)硬件定时器的输入时钟源频率(单位:Hz)。该频率是 STM 计时精度的基础,直接影响定时器计数值与实际时间的换算关系。
定时精度计算:
STM 通道的定时周期由以下公式决定:
实际周期 = (比较值 CompareValue) × (预分频 Prescaler + 1) / McuSTMFrequency
示例:
若 McuSTMFrequency = 100 MHz,需生成 1 ms 周期:
CompareValue = 100,000(当 Prescaler=0 时)。

3.2. McuHardwareResourceAllocationConf_0

在这里插入图片描述

找到McuHardwareResourceAllocationConf_0
STM_CMPx_NOT_USED 比较寄存器 未使用 无需该定时器资源时
STM_CMPx_USED_BY_STM 比较寄存器 被STM模块占用 用于生成周期性中断/触发事件
STM_CMPx_USED_BY_WDG 比较寄存器 被看门狗(WDG)占用 用于触发看门狗刷新

4. Resource模块

  1. ResourceM 模块的核心作用
    Resource Management (ResM) 是 AUTOSAR 中的资源管理模块,主要解决:

    • 硬件资源冲突预防:协调多个 SWC(软件组件)或 BSW(基础软件)模块对共享硬件资源(如外设、内存、总线)的访问
    • 初始化顺序控制:确保硬件依赖模块按正确顺序初始化
    • 访问仲裁:实现类似"锁"的机制,保证资源独占访问
    • ECU 状态管理:管理 RUN/SLEEP 等状态转换时的资源分配
      在这里插入图片描述

5. ISR模块配置

5.1. IrqStmConfig

咱们使用的是IrqStm0SR0
在这里插入图片描述

6. EB MCAL STM 中断实现原理深度分析

6.1. Stm初始化

Stm_Ticksvalue = (uint32)GetParamU32(szString);
/* Enable the STM module for interrupt mapping*/
Stm_EnableModule(STM_Timer0);
/*Initialization of STM IRQ service*/
IrqStm_Init();

// 使能中断路由
SRC_STM0SR0.B.SRE = 1U;  // 设置SRE位使能中断路由

// 注册应用回调
Stm_EnableAlarm(STM_Timer0, STM_0_Cmp0, STM_Cont_Mode, Stm_Ticksvalue,Stm_DemoAppCbk);
void Stm_EnableAlarm(const uint8 ModuleNumber,
       const uint8 CompareRegisterId, const uint8 TimerMode, const uint32 Ticks,
       const Stm_CallbackFnPtrType Stm_Applicationfunction)
{
    ... ...
    // 回调函数注册表
    Timer_DrivFuncCallbackType Mcu_17_Timer_DrivFuncCallbackLst[TIMER_NO_OF_CALLBACK];

    StmkernelStatusPtr->CompareRegValue[CompareRegisterId] = Ticks;

    // 用户ID分配(在Stm_EnableAlarm中设置)
    StmkernelStatusPtr->Stm_ArrayFunctionPtr[CompareRegisterId] = Stm_Applicationfunction;
    ... ...
}

6.2. 中断回调函数Stm_DemoAppCbk

static void Stm_DemoAppCbk(void) {
  if (Stm_Toggle == 1) {
    //    Dio_WriteChannel(TRB_LED, STD_HIGH);
    Stm_Toggle = 0;
  } else {
    //    Dio_WriteChannel(TRB_LED, STD_LOW);
    Stm_Toggle = 1;
  }
}

6.3. 中断服务函数STM0SR0_ISR

#if IRQ_STM0_SR0_TOS != IRQ_TOS_DMA
#if ((IRQ_STM0_SR0_PRIO > 0) || (IRQ_STM0_SR0_CAT == IRQ_CAT2))
#if ((IRQ_STM0_SR0_PRIO > 0) && (IRQ_STM0_SR0_CAT == IRQ_CAT1))
IFX_INTERRUPT(STM0SR0_ISR, 0, IRQ_STM0_SR0_PRIO)
#elif (IRQ_STM0_SR0_CAT == IRQ_CAT2)
ISR(STM0SR0_ISR)
#endif
{
  /* Enable Global Interrupts */
  ENABLE();

  /* Call Wdg periodic processing function */
  Mcu_17_Stm_CompareMatchIsr(0U, 0U);

  *(volatile uint32 *)0xF0001040 = 0x01; /* clear interrupt iscr */
}
#endif
#endif
void Mcu_17_Stm_CompareMatchIsr
(
  const Mcu_17_Stm_StmIdentifierType StmTimerId,
  const Mcu_17_Stm_StmCmpIdentifierType StmCmpId
)
{
    ... ...
    // 通过UserID索引回调函数
    if( Mcu_17_Timer_DrivFuncCallbackLst[(UserId - (uint8)0x1U)] != NULL_PTR)
    {
        Mcu_17_Timer_DrivFuncCallbackLst[(UserId - (uint8)0x1U)](StmTimerId, StmCmpId);
    }
    ... ...
}

7. 编译验证

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

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐