我将 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 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 | |
【分享评测,赢取加热台】使用8051单片机驱动WS2812被打赏40分 | |
【换取逻辑分析仪】rtthread添加RRH62000传感器驱动-基于野火启明6M5被打赏48分 | |
换逻辑分析仪+Verilog多输入门被打赏27分 |