乐鑫技术交流
直播中

王伟

8年用户 1553经验值
私信 关注
[问答]

ESP8266用NMI中断做一个信号,在后台运行时,中断发生的频率会不准怎么解决这个问题?

我们现在用NMI中断做一个信号,但发现在后台运行时,中断发生的频率会不准,似乎是被系统后台其它任务影响了。
请问具体应该怎么改?才能让NMI成为最高优先级?

void ICACHE_FLASH_ATTR myt_init(void)
{
    #define NMI_SOURCE_SEL_REG 0x3ff00000
    WRITE_PERI_REG(NMI_SOURCE_SEL_REG, (READ_PERI_REG(NMI_SOURCE_SEL_REG)&~0x1F)|(0x1+0x7*2) );

    NmitimSetFunc(mytpwm_tim1_intr_handler);

  RTC_REG_WRITE(FRC1_CTRL_ADDRESS,   FRC1_CTRL_DIV_V  | FRC1_ENABLE_TIMER | TM_EDGE_INT);

  RTC_REG_WRITE(FRC1_LOAD_ADDRESS, FRC1_TOTAL_LOADV);

    TM1_EDGE_INT_ENABLE();
    ETS_FRC1_INTR_ENABLE();

}
                                                                                                                                                      

回帖(1)

回头太晚

2024-7-10 17:51:15
要解决ESP8266在后台运行时NMI中断频率不准确的问题,可以尝试以下步骤:

1. 确保NMI中断是最高优先级:在ESP8266中,可以通过设置中断优先级来确保NMI中断具有最高优先级。您可以使用`ets_isr_attach()`函数来设置中断优先级。例如:

```c
void ICACHE_FLASH_ATTR myt_init(void) {
    // ...
    ets_isr_attach(ETS_NMI_INTR_SOURCE, mytpwm_tim1_intr_handler, NULL);
    // ...
}
```

2. 优化中断处理函数:确保中断处理函数尽可能高效,以减少中断处理时间。这可以通过减少函数中的计算和操作来实现。

3. 调整中断触发条件:检查NMI中断的触发条件,确保它们不会受到系统后台任务的影响。这可能需要调整硬件或软件设置。

4. 使用定时器中断替代NMI中断:如果可能的话,可以考虑使用ESP8266的定时器中断替代NMI中断。定时器中断通常具有更好的实时性能和可预测性。例如,使用`os_timer_setfn()`函数设置定时器中断:

```c
void ICACHE_FLASH_ATTR myt_init(void) {
    // ...
    os_timer_setfn(&my_timer, mytpwm_tim1_intr_handler, NULL);
    os_timer_arm(&my_timer, 1000, 1); // 设置定时器周期为1000微秒,重复1次
    // ...
}
```

5. 检查系统配置:确保ESP8266的系统配置没有影响NMI中断的性能。这可能包括检查电源管理设置、时钟设置等。

6. 升级固件:如果您使用的是较旧的ESP8266固件版本,可能存在已知的中断问题。尝试升级到最新版本的固件,看看是否能解决问题。

通过以上步骤,您可以尝试解决ESP8266在后台运行时NMI中断频率不准确的问题。如果问题仍然存在,可能需要进一步检查硬件或软件设置。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分