我将 STM0 设置为 TC275 比较模式,以运行一个简单的操作系统。
在我的应用程序中,代码的运行符合预期。
现在,我开始在引导加载程序中使用相同的逻辑,但不幸的是,我发现在擦除/写入闪存后,定时器中断不再被触发。
调试时 我注意到STM0_CMP0 寄存器停止递增,但 STM0_tiM0 却一直正常运行。
下面是我的定时器代码和擦除功能的片段,其中我禁用了重置功能。
初始化函数
EXTERN bool_t IFX_OSISR_Initialise(void){ /* Set timer configuration
to default values */ IfxStm_Timer_Config timerConfig; bool_t
status = FALSE; IfxStm_Timer_initConfig( timerConfig, MODULE_STM0);
timerConfig.base.frequency = IFX_OSISR_STM_CLK_FREQ; /*
timer frequency */ timerConfig.base.isrPriority =
ISR_PRIORITY_TIMER_STM; /* interrupt priority */
timerConfig.base.isrProvider = IfxSrc_Tos_cpu0; /*
interrupt provider */ timerConfig.base.minResolution = (1.0 /
timerConfig.base.frequency) / 1000; /* Mini resolution of the timer in
seconds */ timerConfig.comparator = IfxStm_Comparator_0;
/* Comparator used for timer */ /* Initialize the STM timer
with the user configuration */ status = IfxStm_Timer_init(
g_timerDriver, timerConfig);// IfxStm_Timer_setSingleMode(
g_timerDriver,1); return status;}
启动功能
void IFX_OSISR_Start(void){ /* Start the STM */ IfxStm_Timer_run( g_timerDriver);}
中断处理程序
IFX_INTERRUPT(interruptHandlerSTM, 0, ISR_PRIORITY_TIMER_STM);
void interruptHandlerSTM(void){ /* Clear the interrupt flag and set
the next compare value */ IfxStm_Timer_acknowledgeTimerIrq(
g_timerDriver); /* Increment number of ticks since startup */
OsIsr_cntTicks = (OsIsr_cntTicks + 1u); /* execute handler of OS
module */ OS_ActivateTask();}
我的擦除闪存功能按预期运行,而且是通过 SPRAM 运行的。
boolean iState = IfxCpu_disableInterrupts(); /* Get the
current state of the interrupts and disable them*/ uint16
endInitSafetyPassword = IfxScuWdt_getSafetyWatchdogPasswordInline();
IfxScuWdt_clearSafetyEndinitInline(endInitSafetyPassword);
/* Erase the given sector */
IfxFlash_eraseMultipleSectors(sector.startAddress, 1);
IfxScuWdt_setSafetyEndinitInline(endInitSafetyPassword);
IfxFlash_waitUnbusy(FLASH_MODULE0, sector.flashType);
IfxCpu_restoreInterrupts(iState);
smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/AURIX/AURIX-TC275-STM0-in-compare-mode-stops-triggering-interrupts-after-flash-erase/td-p/705592
共2条
1/1 1 跳转至页
TC275处于比较模式的STM0在闪存擦除后停止触发中断怎么解决?
关键词: TC275 Aurix 中断 闪存
2楼
要解决这个问题,我们可以按照以下步骤进行:
1. 首先,确保在擦除/写入闪存之前,已经正确地保存了STM0的当前状态,包括STM0_CMP0寄存器的值。
2. 在擦除/写入闪存的过程中,确保不会干扰STM0定时器的正常运行。这可能需要在擦除/写入过程中禁用中断,然后在操作完成后重新启用中断。
3. 在擦除/写入闪存操作完成后,恢复STM0的原始状态,包括恢复STM0_CMP0寄存器的值。
4. 检查STM0定时器中断的配置,确保在擦除/写入闪存操作后,中断仍然可以被正确触发。
5. 如果问题仍然存在,可以尝试在擦除/写入闪存操作前后添加一些调试信息,以便更好地了解问题发生的原因。
以下是一个示例代码片段,展示了如何在擦除/写写入闪存操作前后保存和恢复STM0的状态:
```c
// 保存STM0的状态
uint32_t stm0Cmp0Value = IfxStm_Stm0_CMP0_Get();
// 擦除/写入闪存操作
EraseFlash();
WriteFlash();
// 恢复STM0的状态
IfxStm_Stm0_CMP0_Set(stm0Cmp0Value);
// 重新启用中断(如果之前禁用了)
IfxCpu_enableInterrupts();
```
共2条
1/1 1 跳转至页
回复
| 有奖活动 | |
|---|---|
| 硬核工程师专属补给计划——填盲盒 | |
| “我踩过的那些坑”主题活动——第002期 | |
| 【EEPW电子工程师创研计划】技术变现通道已开启~ | |
| 发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
| 【EEPW在线】E起听工程师的声音! | |
| 高校联络员开始招募啦!有惊喜!! | |
| 【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
| 送您一块开发板,2025年“我要开发板活动”又开始了! | |
我要赚赏金打赏帖 |
|
|---|---|
| Chaos-nano:专为低资源单片机设计的轻量级协作式异步操作系统(ATMEGA328P轻量级操作系统)—— 详细介绍被打赏¥16元 | |
| FPGA配置被打赏¥10元 | |
| Chaos-nano协作式异步操作系统:赋能MicrochipAVR8位单片机的革新之路被打赏¥15元 | |
| 基于esp32开发时串口工具的注意点被打赏¥24元 | |
| 基于FireBeetle2ESP32-C5开发板的舵机控制被打赏¥20元 | |
| 【分享开发笔记,赚取电动螺丝刀】MAX78000开发板制作的电子相册被打赏¥32元 | |
| 基于FireBeetle2ESP32-C5开发板的超声波测距及显示被打赏¥21元 | |
| FireBeetle2ESP32-C5上RTC电子时钟的实现被打赏¥25元 | |
| 【分享开发笔记,赚取电动螺丝刀】MAX78000开发板读取SD卡被打赏¥23元 | |
| 【S32K3XX】Standby RAM 重启后数据异常问题调查被打赏¥38元 | |
我要赚赏金
