Змінюй хід війни! Допомагай ЗСУ!

STM32F103RC. Втручання в роботу DMA під час запису до Flash

🔴 21:27 Повітряна тривога в м. Харків та Харківська територіальна громадаСлідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
Статус: Offline
Реєстрація: 10.03.2007
Повідом.: 8263
  • 🔴 21:27 Повітряна тривога в м. Харків та Харківська територіальна громадаСлідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #1
STM32F103RC. Втручання в роботу DMA під час запису до Flash

Є проект на GNU ARM Eclipse для STM32F103RC. У ньому перший канал DMA1 циклічно зчитує 7 значень по 32 біти з ADC1->DR до буфера в SRAM. Запит надходить кожні 21 мкс від ADC1, що знаходиться у подвійному режимі з ADC2.

ADC1 безперервно оцифровує аналогові входи: ADC12_IN8, ADC12_IN15, ADC12_IN14, ADC12_IN4, ADC123_IN3, ADC1_IN16 (Vsense) і ADC1_IN17 (Vrefint). Після одного програмного запуску перетворення на етапі ініціалізації, результати у такій послідовності безперервно потрапляють до буфера, оновлюючи попередні результати.

Все так і було, поки не знадобилося зберігати кілька параметрів. Для цього зі сайту STMicroelectronics взяв приклад "EEPROM emulation in STM32F10x microcontrollers". Після стирання сторінки (20 мс) або запису параметра (20 мкс) послідовність результатів у буфері змінюється.

Складається враження, що запис до Flash блокує роботу DMA. Будь ласка, тикніть носом: де про це написано? Поки що роблю так:
Код:
ADC_Cmd(ADC1, DISABLE); // Заборона ADC1.

// Збереження до Flash…

ADC_Cmd(ADC1, ENABLE); // Дозвіл ADC1.
 
  • 🔴 21:27 Повітряна тривога в м. Харків та Харківська територіальна громадаСлідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #2
Прерывания вырубает, с ними логично и дма отпадает
 
  • 🔴 21:27 Повітряна тривога в м. Харків та Харківська територіальна громадаСлідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #3
У pdf до "EEPROM emulation in STM32F10x microcontrollers" заявлено:
Key features
● User-configured emulated EEPROM size
● Increased Flash memory endurance: page erased only when it is full
● Non-volatile data variables can be updated infrequently
Interrupt servicing during program/erase is possible
 
  • 🔴 21:27 Повітряна тривога в м. Харків та Харківська територіальна громадаСлідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #4
У документі "PM0075 Programming manual STM32F10xxx Flash memory microcontrollers" згадується:
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.
Це воно?
 
  • 🔴 21:27 Повітряна тривога в м. Харків та Харківська територіальна громадаСлідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #5
любая операция чтения из флеша останавливает всю машину проца если BSY == 1
чтобы не останавливалось - нужно части в RAM размещать
а вот то что конфликтует с DMA - это интересная багофича, но нетрудно предположить что такое возможно.
 
  • 🔴 21:27 Повітряна тривога в м. Харків та Харківська територіальна громадаСлідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #6
Я припускаю, що можливі й інші конфлікти, не такі явні. Тому в підсумку планую перезавантажувати мікроконтронтролер після зміни вмісту його Flash.
 
  • 🔴 21:27 Повітряна тривога в м. Харків та Харківська територіальна громадаСлідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #7
на лету параметры менять можно в ОЗУ. а затем при переходе в дежурный режим - отправлять их во флеш
все равно же целая страница пишется
 
  • 🔴 21:27 Повітряна тривога в м. Харків та Харківська територіальна громадаСлідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #8
У початковому повідомленні я не вказав, що другий канал DMA1 циклічно зчитує
значення зі пам’яті до GPIOA->BSRR. Так от, якщо ця пам’ять – Flash, то
повністю блокується DMA1 і, відповідно, перший канал.

Тобто, проблема тут (підкреслено):
Код:
// Значення для GPIOA->BSRR, що виставляє 1 на виході PA6 (CS).
[U]const[/U] unsigned int BSRR = GPIO_Pin_6;

// Конфігурація DMA1 канала 2.
DMA_InitStructure.DMA_PeripheralBaseAddr = (unsigned int) &GPIOA->BSRR;
DMA_InitStructure.DMA_MemoryBaseAddr = (unsigned int) &BSRR;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = 1;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel2, &DMA_InitStructure);

Не робіть, як я. :кручусь:
 
  • 🔴 21:27 Повітряна тривога в м. Харків та Харківська територіальна громадаСлідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #9
я буквально вчера натолкнулся на глюк
поставил на пин speed=2MHz
получил такую вещь, что ток вывода в "1" подобен пуллапу т.е. не держит вообще ничего
так-то
stm32f103CB/C8
 
  • 🔴 21:27 Повітряна тривога в м. Харків та Харківська територіальна громадаСлідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #10
пару слов не про STM32, а про TMS320, что касается записи в флеш, то в качестве намека на потенциальные проблемы TI вообще запрещает в своем API при прерываниях писать в флеш, мол даже вероятности гарантировать не собираются, ибо возможны проблемы. Както я пробовал на TMS320F28335 и хотел так да сяк но обойти по хитрому и если память не изменяет уложил в хлам пару чипов при запись в SECTOR A и бо там есть нюансы (бутлоадер писал с детектом пропадания питания).
И многие чипмейкеры пишут в своих аппнотах и ДШ - мол при записи во флеш не увлекайтесь прерываниями.
 
Назад
Зверху Знизу