STM32F103 在启用 USART 的页面更新时挂起

STM32F103 hangs on page update with USART enabled

我目前正在研究STM32F103,我想对闪存进行编程。但是,似乎使用同时接收字节的 USART 设备对闪存进行编程会使它挂起:

FLASH_BASE->CR |= FLASH_CR_PER;
while (FLASH_BASE->SR & FLASH_SR_BSY);

FLASH_BASE->AR = pageAddr;
FLASH_BASE->CR |= FLASH_CR_STRT; // Hangs forever when receiving
                                 // data on USART2 in the same time
while (FLASH_BASE->SR & FLASH_SR_BSY);
FLASH_BASE->CR &= ~FLASH_CR_PER;

之前禁用USART2上的RE标志并在之后重新启用它可以避免问题,但是它阻止我在操作期间接收数据,这是可能的,因为接收中断在RAM中。

其实看起来跟中断本身没有关系,因为没有接收中断还是挂了。

有什么想法吗?

STM32 闪存接口在擦除和写入操作期间锁定其整个 数据总线,这样任何读取操作在访问期间都会停止页面擦除可能需要长达 40 毫秒STM32F1xx(在 STM32F2xx 上是一个巨大的 800ms!)。因为代码也是来自闪存的 运行,指令获取和代码执行在此期间停滞,延迟中断处理并导致 USART 溢出错误。

解决这个问题的一种稍微复杂的方法是对 USART 接收器使用 DMA,但这并不总是可行或直接的,并且可能无法解决实时系统中处理器停顿引起的其他问题。

这个小惊喜金块隐藏在 Flash Programming Manual, separate from the Reference Manual:

During a write operation to the Flash memory, any attempt to read the Flash memory will stall the bus. The read operation will proceed correctly once the write operation has completed. This means that code or data fetches cannot be made while a write/erase operation is ongoing.

而实际的计时信息在datasheet中:

他们似乎已将信息散布在不同的文件中,以引起对这个陷阱的最大惊奇!