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

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

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

Сообщение Z_h_e »

Где Вы хотите ее отобразить?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Koret
Родился
Сообщения: 6
Зарегистрирован: Пн окт 30, 2017 15:32:31

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

Сообщение Koret »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3227508#p3227508"]Где Вы хотите ее отобразить?[/uquote]На дисплее WH1602.
Реклама
Аватара пользователя
NiTr0
Друг Кота
Сообщения: 3051
Зарегистрирован: Пт авг 10, 2007 12:49:55
Откуда: kr.ua
Контактная информация:

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

Сообщение NiTr0 »

1) кол-во циклов стирания ограничено (то ли 100, то ли 300, то ли 1000 - во всяком случае меньше чем в еепромках и намного)
2) запись идет не байтами, а словами по 16 бит.

если надо много писать во флэш - советую посмотреть на stm'овский аппноут по реализации eeprom'а (да, надо откусить под это 2 страницы флэша, но оно того стоит думаю).
Koret
Родился
Сообщения: 6
Зарегистрирован: Пн окт 30, 2017 15:32:31

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

Сообщение Koret »

[uquote="NiTr0",url="/forum/viewtopic.php?p=3231906#p3231906"]если надо много писать во флэш - советую посмотреть на stm'овский аппноут по реализации eeprom'а (да, надо откусить под это 2 страницы флэша, но оно того стоит думаю).[/uquote]Подскажите, а в чём преимущества эмулятора перед прямой записью в память через HAL? Эмулятор вроде использует тот же HAL_FLASH.
1) кол-во циклов стирания ограничено (то ли 100, то ли 300, то ли 1000 - во всяком случае меньше чем в еепромках и намного)
Если память не изменяет, вроде Flash 10'000 циклов, а EEPROM 100'000.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
bezzabotna
Встал на лапы
Сообщения: 134
Зарегистрирован: Пн ноя 07, 2016 12:14:14

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

Сообщение bezzabotna »

Здравствуйте!
Кто нибудь работает сейчас с библиотекой SPL? Имеет ли смысл ее изучать и учиться по ней, ведь 90% уроков именно с ней. Сейчас возникла необходимость сохранить настройки (массив данных на 256 ячеек) во flash. Так чтобы можно было потом написать другую программу и просто обратиться к этому массиву. И у меня есть пара вопросов.
Когда я заливаю прошивку, этот массив уже записывается куда-то во флеш, верно? Мне необходимо зафиксировать его так, чтобы он не пересекался с прошивкой. Как это сделать? Записать его на последнюю страницу? Как сделать так, чтобы сразу записать его куда надо, а не перезаписать уже существующий массив? Имеет ли смысл использовать SPL или проще будет работать с регистрами напрямую?
Я конечно все понимаю, но этого я не понимаю.
Реклама
Аватара пользователя
AndyBig
Грызет канифоль
Сообщения: 250
Зарегистрирован: Ср янв 17, 2018 13:09:14

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

Сообщение AndyBig »

bezzabotna писал(а):Кто нибудь работает сейчас с библиотекой SPL? Имеет ли смысл ее изучать и учиться по ней, ведь 90% уроков именно с ней.
Сам пользуюсь ею, довольно удобно и быстро в разработке. Но бывают моменты, когда она начинает мешать быстродействию или размеру кода. Например, при отправке через SPI быстрее будет пихать данные напрямую в регистр, чем пользоваться функцией SPL. Для работы с флэш я предпочел написать свои процедуры.
bezzabotna писал(а):Когда я заливаю прошивку, этот массив уже записывается куда-то во флеш, верно?
Смотря как Вы его объявили. Если как константы с инициализацией, то да. Если как указатель, то нет.
bezzabotna писал(а):Мне необходимо зафиксировать его так, чтобы он не пересекался с прошивкой. Как это сделать? Записать его на последнюю страницу? Как сделать так, чтобы сразу записать его куда надо, а не перезаписать уже существующий массив?
Честно говоря, суть вопроса не совсем ясна. Вам нужно один раз залить во флэш какой-то массив определенных значений, чтобы при последующих прошивках основной программы он оставался на своем месте нетронутый? И чтобы программы получали к нему доступ для чтения? Или программы могут перезаписывать эти значения?
У себя, например, я сделал хранение настроек так:
1. Оставил две последние страницы флэш под хранение настроек, линкеру указал размер флэша за вычетом этих двух страниц. То есть программа ни при каких обстоятельствах на них уже не залезет - линкер ругнется на недостаточную память.
2. В программе объявил структуру с переменными настроек в оперативке. При старте программа считывает настройки из последних страниц в эту структуру. В процедуру чтения передаю указатель на эту структуру и внутри этой процедуры этот указатель используется просто как адрес буфера, в который нужно считать из флэш количество байт, равное размеру структуры настроек.
3. В программе предусмотрен сброс настроек, при котором всем переменным структуры в оперативке присваиваются значения по умолчанию. После этого указатель на структуру передается в процедуру записи, которая, аналогично чтению, использует указатель как адрес буфера, из которого нужно записать в последние страницы флэш количество байт, равное размеру структуры.
Две страницы - это для повышения ресурса перезаписи. Настройки пишутся поочередно то в первую, то во вторую страницы. Если перезапись настроек не нужна или будет происходить редко, то можно использовать только одну страницу без возни с чередованием страниц.
bezzabotna писал(а):Имеет ли смысл использовать SPL или проще будет работать с регистрами напрямую?
Если нет жестких требований к скорости исполнения и не упираетесь в ограничение размера прошивки, то SPL, конечно, удобнее. Но работать напрямую с регистрами - более предсказуемо и гибко, на мой взгляд :)
Реклама
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

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

Сообщение arkhnchul »

[uquote="bezzabotna",url="/forum/viewtopic.php?p=3296381#p3296381"]Кто нибудь работает сейчас с библиотекой SPL? Имеет ли смысл ее изучать и учиться по ней[/uquote]
SPL для STM32 закапывается, у ST бзик по поводу HAL.
для STM8 в хидерах есть такой вот комментарий от самих ST:

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

  * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
  * TIME.
я склонен понимать его буквально (вообще они там про юридическую сторону вопроса), и использую SPL в основном как то самое "guidance only" - источник для копипасты с последующим выпиливанием всего лишнего.
Аватара пользователя
bezzabotna
Встал на лапы
Сообщения: 134
Зарегистрирован: Пн ноя 07, 2016 12:14:14

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

Сообщение bezzabotna »

Спасибо за ответы! Нужно было записать массив с инициализацией как константу. Но теперь у меня проблема как с ним обращаться правильно то есть я объявляю массив и указатели глобально

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

const uint16_t A[256] ={0,1,2,3,...}

uint16_t *point0;
uint16_t *point1;
....

Потом в функциях и теле программы мне надо к нему этими указателями обращаться, а он выдает ошибку в таких строках:

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

point0=&A[0];
и говорит мол сущности *point0 нельзя присвоить значение по адресу &A[0] несовместимые типы данных.

если я напишу :

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

*point0=A[0];
скомпилируется, но работать программа не будет.

Как мне правильно указывать на этот массив?
Я конечно все понимаю, но этого я не понимаю.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

Имя массива и есть указатель на его первый элемент.
К примеру передача указателя в качестве аргумента.
Прототип

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

my_function( const uint16_t *);
Вызов

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

my_function(A);

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

const  uint16_t *point0;
point0=A;
Или эквивалент 
point0=&A[0];
Аватара пользователя
bezzabotna
Встал на лапы
Сообщения: 134
Зарегистрирован: Пн ноя 07, 2016 12:14:14

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

Сообщение bezzabotna »

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

point0=&A[0];
компилируется только при условии что point0 объявить как

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

const uint32_t *point0;
А он точно с флеша значения считывает а не с оперативки?
можно ли сделать так?

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

point0=read_flash(&A[0]);
Я конечно все понимаю, но этого я не понимаю.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

Вы лучше фрагмент кода приводите . Снова что ли калокубом страдаете?

Вот только что набросал на скорую рку и проверил .

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

const uint16_t  sine_wave[256*3] = {
0x180, 0x2CC, 0x33, 
0x189, 0x2C7, 0x2F, 

--cut---
uint16_t mem_buf[30];


void read_table(const uint16_t *src,uint16_t *dist)
{
	const uint16_t *pnt0;
	uint16_t *pnt1;
	pnt0=src;
	pnt1=dist;
	*pnt1=*pnt0;
}

--cut--

read_table(sine_wave,mem_buf);


Изображение
Изображение
Ответить

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