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

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

🟡 17:30 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
Статус: Offline
Реєстрація: 10.03.2007
Повідом.: 8262
  • 🟡 17:30 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #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.
 
  • 🟡 17:30 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #2
Прерывания вырубает, с ними логично и дма отпадает
 
  • 🟡 17:30 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #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
 
  • 🟡 17:30 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #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.
Це воно?
 
  • 🟡 17:30 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #5
любая операция чтения из флеша останавливает всю машину проца если BSY == 1
чтобы не останавливалось - нужно части в RAM размещать
а вот то что конфликтует с DMA - это интересная багофича, но нетрудно предположить что такое возможно.
 
  • 🟡 17:30 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #6
Я припускаю, що можливі й інші конфлікти, не такі явні. Тому в підсумку планую перезавантажувати мікроконтронтролер після зміни вмісту його Flash.
 
  • 🟡 17:30 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #7
на лету параметры менять можно в ОЗУ. а затем при переходе в дежурный режим - отправлять их во флеш
все равно же целая страница пишется
 
  • 🟡 17:30 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #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);

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