stm32f103 HAL: зранение данных во внутреннем флеше

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
KT315B
Сверлит текстолит когтями
Сообщения: 1269
Зарегистрирован: Пт июл 21, 2006 15:05:19
Откуда: плод воображения
Контактная информация:

stm32f103 HAL: зранение данных во внутреннем флеше

Сообщение KT315B »

Столкнулся с потребностью сохранять данные во внутреннем флеше МК (F103). Можно было бы во внешнем ЕЕПРОМ, но его на уже разведенной и запаяной плате нет. Проблема, собственно в следующем: при попытке стирания страницы флеша - контроллер намертво виснет. Делаю так:

Код: Выделить всё

FLASH_EraseInitTypeDef EraseInit;
	uint32_t PageError=0;

	EraseInit.TypeErase=FLASH_TYPEERASE_PAGES;
	//EraseInit.Banks=FLASH_BANK_1;
	EraseInit.NbPages=1;
	EraseInit.PageAddress=0x08002000;

	HAL_FLASH_Unlock();
	FLASH_WaitForLastOperation(500);
	HAL_FLASHEx_Erase(&EraseInit,&PageError);
	FLASH_WaitForLastOperation(500);
Толи лыжи не едут, то ли я... Кто виноват и что делать?
R2AIV 73!
Реклама
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: stm32f103 HAL: зранение данных во внутреннем флеше

Сообщение Z_h_e »

Я готовые функции не использовал.
Я делал наподобие этого, все работает. МК как раз 103.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Аватара пользователя
KT315B
Сверлит текстолит когтями
Сообщения: 1269
Зарегистрирован: Пт июл 21, 2006 15:05:19
Откуда: плод воображения
Контактная информация:

Re: stm32f103 HAL: зранение данных во внутреннем флеше

Сообщение KT315B »

Попробовал код из статьи, все равно подвисает... Похоже, не неправильной странице при стирании обращаюсь. Хотя, по мануалам адрес страницы 8 и есть 0x8002000
R2AIV 73!
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: stm32f103 HAL: зранение данных во внутреннем флеше

Сообщение Z_h_e »

Чтобы стереть страницу можно использовать любой адрес из этой страницы.
Быть может эта страница уже занята, попробуйте с другой, например с последней.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
KT315B
Сверлит текстолит когтями
Сообщения: 1269
Зарегистрирован: Пт июл 21, 2006 15:05:19
Откуда: плод воображения
Контактная информация:

Re: stm32f103 HAL: зранение данных во внутреннем флеше

Сообщение KT315B »

Попробовал - заработало. Стирает и пишет. Почему-то виснет при попытках стирать страницы с номером, ближе к использованным. В итоге все кончилось тем, что работаю с 30й страницей ) Еще обнаружил один момент, если страницу стереть, потом записать данные, потом еще раз попытаться записать данные - все намертво виснет. В итоге, похоже, что перед операцией записи в любом случае нужно вызывать операцию стирания. Лучше всего - затолкать данные для сохранения в структуру, и потом эту структуру записывать через указатель одной операцией записи. Проблема решена - спасибо! Теперь буду думать над чтением )
R2AIV 73!
Реклама
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: stm32f103 HAL: зранение данных во внутреннем флеше

Сообщение Z_h_e »

KT315B писал(а):Почему-то виснет при попытках стирать страницы с номером, ближе к использованным.
Наверное затираете какие-то данные.
KT315B писал(а):Еще обнаружил один момент, если страницу стереть, потом записать данные, потом еще раз попытаться записать данные - все намертво виснет.
Так я не пробовал, после записи сразу же лочу запись во флеш.
KT315B писал(а):Лучше всего - затолкать данные для сохранения в структуру, и потом эту структуру записывать через указатель одной операцией записи.
Ну лично я, как раз так и сделал.
KT315B писал(а):Теперь буду думать над чтением
Я объявил переменную в области флеш и делал вот так просто.

Код: Выделить всё

#define VAR_FL   __attribute__((section(".var_area"))) //область для хранения во флеш переменных
...
extern volatile DEVICE_t DEVICE;
volatile DEVICE_t DEVICE_FLASH VAR_FL;	
...
DEVICE=DEVICE_FLASH;	//считываем из флеша 
Местоположение секции .var_area определена мной в файле линковщика. Но можно структуру того же типа объявить как указатель и присвоить ему фиксированный адрес. Но в первом варианте как раз гарантируется, что данные не налезут друг на друга.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Аватара пользователя
KT315B
Сверлит текстолит когтями
Сообщения: 1269
Зарегистрирован: Пт июл 21, 2006 15:05:19
Откуда: плод воображения
Контактная информация:

Re: stm32f103 HAL: зранение данных во внутреннем флеше

Сообщение KT315B »

Наверное затираете какие-то данные.
Дык не должен - тут же вычитываю HEX, и пустота.
Я объявил переменную в области флеш и делал вот так просто.
Хм, настолько глубоко я еще пока не залезал. А какой компилятор используете? Или там все равно? У меня SW4STM32. Хотя есть еще и Keil, просто проект делался в SW4STM32.
R2AIV 73!
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: stm32f103 HAL: зранение данных во внутреннем флеше

Сообщение Z_h_e »

Компилятор GCC
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
KT315B
Сверлит текстолит когтями
Сообщения: 1269
Зарегистрирован: Пт июл 21, 2006 15:05:19
Откуда: плод воображения
Контактная информация:

Re: stm32f103 HAL: зранение данных во внутреннем флеше

Сообщение KT315B »

Это тот, что arm-none-eabi? Тогда у меня тоже самое )
R2AIV 73!
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: stm32f103 HAL: зранение данных во внутреннем флеше

Сообщение Z_h_e »

Да, он.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
KT315B
Сверлит текстолит когтями
Сообщения: 1269
Зарегистрирован: Пт июл 21, 2006 15:05:19
Откуда: плод воображения
Контактная информация:

Re: stm32f103 HAL: зранение данных во внутреннем флеше

Сообщение KT315B »

В итоге все свелось к этому:

Код: Выделить всё

void *ReadFlash(unsigned int FlashAddr)
{
	return (void *)FlashAddr;
}
И вызов:

Код: Выделить всё

memcpy((void *)&FlashData,ReadFlash(FLASH_BASE+20*1024), sizeof(FlashData));
FlashData - вышеупомянутая структура. Все просто оказалось )
R2AIV 73!
Аватара пользователя
Алексей78
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Сб фев 09, 2008 23:15:43

Re: stm32f103 HAL: зранение данных во внутреннем флеше

Сообщение Алексей78 »

Всем привет!
Подниму тему. Перехожу на HAL, нужно писать данные во FLASH. МК STM32F103C8T6, пишу данные в конец флэша - на 63 страницу, в качестве данных значение переменной isTimeWorkL - время работы одного из двигателей. Делаю это следующим образом:

Код: Выделить всё

                HAL_FLASH_Unlock();                     // Разблокируем флеш память
		FLASH_WaitForLastOperation(500);  // Ожидаем окончания операции
		FLASH_PageErase(0x0800F7C2);     // Очищаем страницу 63 флеш памяти
		FLASH_WaitForLastOperation(500);  // Ожидаем окончания операции
		HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, 0x0800F7C2, isTimeWorkL );   // Записываем значение переменной isTimeWorkL на 63 странице флеш памяти
		FLASH_WaitForLastOperation(500);  // Ожидаем окончания операции
		HAL_FLASH_Lock();                        // Блокируем флеш память
		FLASH_WaitForLastOperation(500);  // Ожидаем окончания операции


В итоге после записи во флеш значения переменной isTimeWorkL я наблюдаю на 63 странице 0xFFFFFFFF, т.е. такое ощущение, что флеш была стерта, но не записана. Что я делаю не так?
Аватара пользователя
KT315B
Сверлит текстолит когтями
Сообщения: 1269
Зарегистрирован: Пт июл 21, 2006 15:05:19
Откуда: плод воображения
Контактная информация:

Re: stm32f103 HAL: зранение данных во внутреннем флеше

Сообщение KT315B »

У меня вообще черех HAL не хотело писАться, в итоге пришлось добавить самопальные функции. Код, который прислал Z_h_e - рабочий, им можно пользоваться. Ну а данные лучше в структуру затолкать...
R2AIV 73!
Аватара пользователя
Алексей78
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Сб фев 09, 2008 23:15:43

Re: stm32f103 HAL: зранение данных во внутреннем флеше

Сообщение Алексей78 »

У меня вообще черех HAL не хотело писАться, в итоге пришлось добавить самопальные функции. Код, который прислал Z_h_e - рабочий, им можно пользоваться. Ну а данные лучше в структуру затолкать...
Я такой код использовал раньше и он тоже работал, НО хочется избавится от костылей и использовать чистый HAL.
Аватара пользователя
KT315B
Сверлит текстолит когтями
Сообщения: 1269
Зарегистрирован: Пт июл 21, 2006 15:05:19
Откуда: плод воображения
Контактная информация:

Re: stm32f103 HAL: зранение данных во внутреннем флеше

Сообщение KT315B »

[uquote="Алексей78",url="/forum/viewtopic.php?p=3151048#p3151048"].
Я такой код использовал раньше и он тоже работал, НО хочется избавится от костылей и использовать чистый HAL.[/uquote]

Я тоже хочу так )
R2AIV 73!
Аватара пользователя
Алексей78
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Сб фев 09, 2008 23:15:43

Re: stm32f103 HAL: зранение данных во внутреннем флеше

Сообщение Алексей78 »

Я тоже хочу так )
Ну раз хотите, получайте :) Заработало! Я решил попробовать использовать HAL_FLASHEx_Erase, в итоге получил следующее:

Код: Выделить всё

   
    FLASH_EraseInitTypeDef EraseInitStruct;
    uint32_t PAGEError = 0;
    EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;
    EraseInitStruct.PageAddress = 0x0800F800;
    EraseInitStruct.NbPages     = 1;
    HAL_FLASH_Unlock();   // Разблокируем флеш память
    HAL_FLASHEx_Erase(&EraseInitStruct,&PAGEError);	
    HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, 0x0800F800, sTimeWorkL );   // Записываем значение переменной isTimeWorkL на 63 странице флеш памяти
    HAL_FLASH_Lock();   // Блокируем флеш память
Все стирается и пишется без проблем.
Аватара пользователя
KT315B
Сверлит текстолит когтями
Сообщения: 1269
Зарегистрирован: Пт июл 21, 2006 15:05:19
Откуда: плод воображения
Контактная информация:

Re: stm32f103 HAL: зранение данных во внутреннем флеше

Сообщение KT315B »

Отлично! Буду пробовать!
R2AIV 73!
Koret
Родился
Сообщения: 6
Зарегистрирован: Пн окт 30, 2017 15:32:31

Re: stm32f103 HAL: зранение данных во внутреннем флеше

Сообщение Koret »

Ребята, а как результат преобразовать в симол?

HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address, 'A' ) .

Я передаю символ A, как его получить не в виде числа, а как символ?
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: stm32f103 HAL: зранение данных во внутреннем флеше

Сообщение Z_h_e »

Koret писал(а):Я передаю символ A,
Нет, Вы передаете число которое соответствует символу А кодовой таблицы.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Koret
Родился
Сообщения: 6
Зарегистрирован: Пн окт 30, 2017 15:32:31

Re: stm32f103 HAL: зранение данных во внутреннем флеше

Сообщение Koret »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3227477#p3227477"]
Koret писал(а):Я передаю символ A,
Нет, Вы передаете число которое соответствует символу А кодовой таблицы.[/uquote]Согласен, не верно выразился. К, сожалению, не нашел рабочего примера, чтобы и компилятор не ругался и преобразовывалось. Например, число 97 это буква "a", как данное число можно "малой кровью" отобразить как "a"?
Ответить

Вернуться в «ARM»