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

Статус: Offline
Реєстрація: 10.03.2007
Повідом.: 8266
  • 🟢 06:33 Відбій тривоги в м. Харків та Харківська територіальна громада.Слідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #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.
 
  • 🟢 06:33 Відбій тривоги в м. Харків та Харківська територіальна громада.Слідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #2
Прерывания вырубает, с ними логично и дма отпадает
 
  • 🟢 06:33 Відбій тривоги в м. Харків та Харківська територіальна громада.Слідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #3
У pdf до "EEPROM emulation in STM32F10x microcontrollers" заявлено:
 
  • 🟢 06:33 Відбій тривоги в м. Харків та Харківська територіальна громада.Слідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #4
У документі "PM0075 Programming manual STM32F10xxx Flash memory microcontrollers" згадується:
Це воно?
 
  • 🟢 06:33 Відбій тривоги в м. Харків та Харківська територіальна громада.Слідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #5
любая операция чтения из флеша останавливает всю машину проца если BSY == 1
чтобы не останавливалось - нужно части в RAM размещать
а вот то что конфликтует с DMA - это интересная багофича, но нетрудно предположить что такое возможно.
 
  • 🟢 06:33 Відбій тривоги в м. Харків та Харківська територіальна громада.Слідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #6
Я припускаю, що можливі й інші конфлікти, не такі явні. Тому в підсумку планую перезавантажувати мікроконтронтролер після зміни вмісту його Flash.
 
  • 🟢 06:33 Відбій тривоги в м. Харків та Харківська територіальна громада.Слідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #7
на лету параметры менять можно в ОЗУ. а затем при переходе в дежурный режим - отправлять их во флеш
все равно же целая страница пишется
 
  • 🟢 06:33 Відбій тривоги в м. Харків та Харківська територіальна громада.Слідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #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);

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