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

时间:2015-03-11 09:02:50

标签: embedded stm32 cortex-m3

我目前正在研究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中。

实际上,看起来它与中断本身无关,因为它在没有接收中断的情况下仍然会挂起。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

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

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

这个小小的惊喜金块隐藏在Flash Programming Manual中,与Reference Manual分开:

  

在对闪存的写操作期间,任何读取闪存的尝试都将   停下巴士。一旦写入操作,读操作将正确进行   完成。这意味着在写入/擦除时无法进行代码或数据提取   手术正在进行中。

虽然实际时间信息在datasheet中: STM32F103 Flash Timing

他们似乎已经将信息传播到不同的文件中,以便在这个问题上引起最大的惊喜!