TC397 EB MCAL开发从0开始系列 之STM配置实战二
本文详细介绍了在TC397 EB开发板上使用MCAL配置STM模块实现LED闪烁的完整流程。主要内容包括:1) STM模块的基本配置步骤和参数设置;2) MCU时钟和硬件资源分配的关键配置;3) Resource模块的资源管理机制;4) ISR中断服务配置及实现原理;5) 从初始化到中断回调的完整代码解析,包括Stm_EnableAlarm、Stm_DemoAppCbk等关键函数。通过配置100M
文章目录
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模块
-
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. 编译验证


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

所有评论(0)