stm32f103 HAL: зранение данных во внутреннем флеше
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: stm32f103 HAL: зранение данных во внутреннем флеше
Где Вы хотите ее отобразить?
- Реклама
Re: stm32f103 HAL: зранение данных во внутреннем флеше
[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: зранение данных во внутреннем флеше
1) кол-во циклов стирания ограничено (то ли 100, то ли 300, то ли 1000 - во всяком случае меньше чем в еепромках и намного)
2) запись идет не байтами, а словами по 16 бит.
если надо много писать во флэш - советую посмотреть на stm'овский аппноут по реализации eeprom'а (да, надо откусить под это 2 страницы флэша, но оно того стоит думаю).
2) запись идет не байтами, а словами по 16 бит.
если надо много писать во флэш - советую посмотреть на stm'овский аппноут по реализации eeprom'а (да, надо откусить под это 2 страницы флэша, но оно того стоит думаю).
Re: stm32f103 HAL: зранение данных во внутреннем флеше
[uquote="NiTr0",url="/forum/viewtopic.php?p=3231906#p3231906"]если надо много писать во флэш - советую посмотреть на stm'овский аппноут по реализации eeprom'а (да, надо откусить под это 2 страницы флэша, но оно того стоит думаю).[/uquote]Подскажите, а в чём преимущества эмулятора перед прямой записью в память через HAL? Эмулятор вроде использует тот же HAL_FLASH.
Если память не изменяет, вроде Flash 10'000 циклов, а EEPROM 100'000.1) кол-во циклов стирания ограничено (то ли 100, то ли 300, то ли 1000 - во всяком случае меньше чем в еепромках и намного)
- bezzabotna
- Встал на лапы
- Сообщения: 134
- Зарегистрирован: Пн ноя 07, 2016 12:14:14
Re: stm32f103 HAL: зранение данных во внутреннем флеше
Здравствуйте!
Кто нибудь работает сейчас с библиотекой SPL? Имеет ли смысл ее изучать и учиться по ней, ведь 90% уроков именно с ней. Сейчас возникла необходимость сохранить настройки (массив данных на 256 ячеек) во flash. Так чтобы можно было потом написать другую программу и просто обратиться к этому массиву. И у меня есть пара вопросов.
Когда я заливаю прошивку, этот массив уже записывается куда-то во флеш, верно? Мне необходимо зафиксировать его так, чтобы он не пересекался с прошивкой. Как это сделать? Записать его на последнюю страницу? Как сделать так, чтобы сразу записать его куда надо, а не перезаписать уже существующий массив? Имеет ли смысл использовать SPL или проще будет работать с регистрами напрямую?
Кто нибудь работает сейчас с библиотекой SPL? Имеет ли смысл ее изучать и учиться по ней, ведь 90% уроков именно с ней. Сейчас возникла необходимость сохранить настройки (массив данных на 256 ячеек) во flash. Так чтобы можно было потом написать другую программу и просто обратиться к этому массиву. И у меня есть пара вопросов.
Когда я заливаю прошивку, этот массив уже записывается куда-то во флеш, верно? Мне необходимо зафиксировать его так, чтобы он не пересекался с прошивкой. Как это сделать? Записать его на последнюю страницу? Как сделать так, чтобы сразу записать его куда надо, а не перезаписать уже существующий массив? Имеет ли смысл использовать SPL или проще будет работать с регистрами напрямую?
Я конечно все понимаю, но этого я не понимаю.
- Реклама
Re: stm32f103 HAL: зранение данных во внутреннем флеше
Сам пользуюсь ею, довольно удобно и быстро в разработке. Но бывают моменты, когда она начинает мешать быстродействию или размеру кода. Например, при отправке через SPI быстрее будет пихать данные напрямую в регистр, чем пользоваться функцией SPL. Для работы с флэш я предпочел написать свои процедуры.bezzabotna писал(а):Кто нибудь работает сейчас с библиотекой SPL? Имеет ли смысл ее изучать и учиться по ней, ведь 90% уроков именно с ней.
Смотря как Вы его объявили. Если как константы с инициализацией, то да. Если как указатель, то нет.bezzabotna писал(а):Когда я заливаю прошивку, этот массив уже записывается куда-то во флеш, верно?
Честно говоря, суть вопроса не совсем ясна. Вам нужно один раз залить во флэш какой-то массив определенных значений, чтобы при последующих прошивках основной программы он оставался на своем месте нетронутый? И чтобы программы получали к нему доступ для чтения? Или программы могут перезаписывать эти значения?bezzabotna писал(а):Мне необходимо зафиксировать его так, чтобы он не пересекался с прошивкой. Как это сделать? Записать его на последнюю страницу? Как сделать так, чтобы сразу записать его куда надо, а не перезаписать уже существующий массив?
У себя, например, я сделал хранение настроек так:
1. Оставил две последние страницы флэш под хранение настроек, линкеру указал размер флэша за вычетом этих двух страниц. То есть программа ни при каких обстоятельствах на них уже не залезет - линкер ругнется на недостаточную память.
2. В программе объявил структуру с переменными настроек в оперативке. При старте программа считывает настройки из последних страниц в эту структуру. В процедуру чтения передаю указатель на эту структуру и внутри этой процедуры этот указатель используется просто как адрес буфера, в который нужно считать из флэш количество байт, равное размеру структуры настроек.
3. В программе предусмотрен сброс настроек, при котором всем переменным структуры в оперативке присваиваются значения по умолчанию. После этого указатель на структуру передается в процедуру записи, которая, аналогично чтению, использует указатель как адрес буфера, из которого нужно записать в последние страницы флэш количество байт, равное размеру структуры.
Две страницы - это для повышения ресурса перезаписи. Настройки пишутся поочередно то в первую, то во вторую страницы. Если перезапись настроек не нужна или будет происходить редко, то можно использовать только одну страницу без возни с чередованием страниц.
Если нет жестких требований к скорости исполнения и не упираетесь в ограничение размера прошивки, то SPL, конечно, удобнее. Но работать напрямую с регистрами - более предсказуемо и гибко, на мой взглядbezzabotna писал(а):Имеет ли смысл использовать SPL или проще будет работать с регистрами напрямую?
Re: stm32f103 HAL: зранение данных во внутреннем флеше
[uquote="bezzabotna",url="/forum/viewtopic.php?p=3296381#p3296381"]Кто нибудь работает сейчас с библиотекой SPL? Имеет ли смысл ее изучать и учиться по ней[/uquote]
SPL для STM32 закапывается, у ST бзик по поводу HAL.
для STM8 в хидерах есть такой вот комментарий от самих ST:
я склонен понимать его буквально (вообще они там про юридическую сторону вопроса), и использую SPL в основном как то самое "guidance only" - источник для копипасты с последующим выпиливанием всего лишнего.
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.- bezzabotna
- Встал на лапы
- Сообщения: 134
- Зарегистрирован: Пн ноя 07, 2016 12:14:14
Re: stm32f103 HAL: зранение данных во внутреннем флеше
Спасибо за ответы! Нужно было записать массив с инициализацией как константу. Но теперь у меня проблема как с ним обращаться правильно то есть я объявляю массив и указатели глобально
Потом в функциях и теле программы мне надо к нему этими указателями обращаться, а он выдает ошибку в таких строках:
и говорит мол сущности *point0 нельзя присвоить значение по адресу &A[0] несовместимые типы данных.
если я напишу :
скомпилируется, но работать программа не будет.
Как мне правильно указывать на этот массив?
Код: Выделить всё
const uint16_t A[256] ={0,1,2,3,...}
uint16_t *point0;
uint16_t *point1;
....
Код: Выделить всё
point0=&A[0];
если я напишу :
Код: Выделить всё
*point0=A[0];
Как мне правильно указывать на этот массив?
Я конечно все понимаю, но этого я не понимаю.
Re: stm32f103 HAL: зранение данных во внутреннем флеше
Имя массива и есть указатель на его первый элемент.
К примеру передача указателя в качестве аргумента.
Прототип
Вызов
К примеру передача указателя в качестве аргумента.
Прототип
Код: Выделить всё
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: зранение данных во внутреннем флеше
Код: Выделить всё
point0=&A[0];Код: Выделить всё
const uint32_t *point0;можно ли сделать так?
Код: Выделить всё
point0=read_flash(&A[0]);Я конечно все понимаю, но этого я не понимаю.
Re: stm32f103 HAL: зранение данных во внутреннем флеше
Вы лучше фрагмент кода приводите . Снова что ли калокубом страдаете?
Вот только что набросал на скорую рку и проверил .


Вот только что набросал на скорую рку и проверил .
Код: Выделить всё
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);




