
我在进行双bank升级的时候,会先进行FLASH的批量擦除。在连续的升级过程中发现成功几次后出现了执行擦除flash操作时程序卡死的情况,直观上看灯没有闪烁。成功次数不规律,可能更新2次后才卡死一次,也有更新4次、6次卡死的。我尝试在进行擦除之前关中断 __disable_irq();发现测试连续30次升级都没卡死,但没有找到根本原因。注:调用擦除bank的函数执行在CAN接收中断里的一个自定义函数中,有怀疑是进入了一些死循环中。 之前怀疑过是上图的while循环,在擦除时有个等待的函数,使用了systick,如果再中断中执行,或者我使用了__disable_irq()会不会导致进不去systick中断,导致死循环超时不可用。但实际测试时好像没有影响 |
comp输出用于tim1刹车,消隐源和pwm输出是不是得是同一个TIM?
STM32G431内部运放1和2输出连接的ADC为什么不是OPAMP?
workbench6.3.2生成的代码,无法用pilot电机参数识别,无法通讯
stm32G474的flash模式如何判定?single bank 和dual bank
STM32G474高精度定时器HRTIM配置死区互补PWM极端输出问题
hrtim里update reset和reset update同时打开不会互相激励吗,另外为什么现在定时器周期值不用-1了
STM32G473 解除写保护失败
HRTIM 变频控制输出的第一个周期频率异常
求助:keil在debug时出现Cannot access Memory*** error 122: AGDI: memory read failed (0xF81AF008)
STM32中比较适合做FOC控制的芯片
如果程序正常逻辑不用到这个中断,那不会有什么问题,也就是说没有超时判断发生,标志位及时置位起来。
不过这样关闭中断不合适,使得某些函数失效,有特殊情况死循环发生。所以慎用。
可以考虑针对其他可能发生的中断进行关闭。注意最好是先关闭外设,再关闭内核的。
至于升级程序卡住,最好屏蔽其他无关功能后再测试分析哪些可能性,从你测试关闭中断上看,多半和某些时序有关。
我担心因为中断优先级方面问题,导致些访问互锁;或者中断的循环嵌套导致堆栈溢出进而程序崩溃;
临时地使用disableirq也不是不可以,但要清楚这只是临时关闭CPU端对中断请求的响应,外设端该申请中断的依然会申请,相关中断请求标志依然会出现,
等enableirq后会根据优先级高低依次处理;当然,如果在enableirq之前将可能出现的中断标志做个清零又是另外一回事。
另外,你调用disableirq后再做擦除操作,会永远检测不到超时,即会失去超时检测的意义;
建议将擦除操作放到主程序里来进行;