2015-03-11 4 views
0

В настоящее время я работаю над STM32F103, и я хочу запрограммировать вспышку. Однако, как кажется, что программирование вспышки с USART устройства, принимающего байт в то же время сделать его висит: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; 

Отключение флаг RE на USART2 до и повторного включения, что после того, как избежать этой проблемы, но это мешает мне от приема данных во время операции, что было бы возможно, поскольку прерывание приема находится в ОЗУ.

На самом деле, похоже, что он не связан с самим прерыванием, поскольку он все еще висит без прерывания приема.

Любая идея?

+0

Является ли таблица векторов прерываний неподвижной? –

+0

На самом деле, моя проблема была ошибкой в ​​обработке UART, в libmaple См .: https://github.com/leaflabs/libmaple/issues/109 И: https://github.com/leaflabs/libmaple/issues/107 Флаг RXNE был неправильно проверен во время прерывания Кроме того, я переместил прерывания uart в раздел RAM – Gregwar

ответ

2

Интерфейс памяти STM32 Флэш блокирует его всю шину данных во время стирания и записи, таким образом, что любая операция чтения тормозится во время доступа к странице стирания может занять до 40 мс на STM32F1xx (это массовый 800ms на STM32F2xx!). Поскольку код также запускается из флэш-памяти, команда извлекает и, следовательно, блокирует выполнение кода в течение этого времени, задерживает обработку прерываний и вызывает ошибку переполнения USART.

Одним из сложных способов решения этой проблемы является использование DMA для приемника USART, но это не всегда возможно или просто и не может решить другие проблемы, вызванные остановкой процессора в системах реального времени.

Этот маленький сюрприз самородок скрыт в Flash Programming Manual, отдельно от Reference Manual:

Во время операции записи в флэш-памяти, любая попытка чтения флэш-память будет стойло автобус. Операция чтения будет выполняться правильно после завершения операции записи . Это означает, что код или выборки данных не могут быть выполнены во время операции записи/стирания .

Хотя текущая информация о времени находится в datasheet: STM32F103 Flash Timing

Они, кажется, распространили информацию вокруг отдельных документов выпытать максимальное удивление в этом Gotcha!

+0

На самом деле, моя проблема не в том, что это «срыв» на 40 мс, но он просто висит навсегда – Gregwar

+0

Я * никогда * не выполняю код после моей страницы START, если данные UART получены во время стирания моей страницы. – Gregwar

+0

Кроме того, даже если я помещаю код, который удаляет страницу в ОЗУ и прерывание USART в ОЗУ, оно все еще зависает – Gregwar