我目前正在研究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中。
实际上,看起来它与中断本身无关,因为它在没有接收中断的情况下仍然会挂起。
有什么想法吗?
答案 0 :(得分:2)
STM32闪存接口在擦除和写入操作期间锁定其整个数据总线,以便在访问期间停止任何读取操作。在STM32F1xx上,页面擦除可能需要长达40ms(它是在STM32F2xx上大规模800毫秒!)。因为代码也是从闪存中运行的,所以在此期间指令取出并因此代码执行停止,延迟中断处理并导致USART溢出错误。
有一种复杂的方法是使用DMA作为USART接收器,但这并不总是可行或直接的,并且可能无法解决实时系统中处理器停顿造成的其他问题。
这个小小的惊喜金块隐藏在Flash Programming Manual中,与Reference Manual分开:
在对闪存的写操作期间,任何读取闪存的尝试都将 停下巴士。一旦写入操作,读操作将正确进行 完成。这意味着在写入/擦除时无法进行代码或数据提取 手术正在进行中。
虽然实际时间信息在datasheet中:
他们似乎已经将信息传播到不同的文件中,以便在这个问题上引起最大的惊喜!