|
сохранение данных во flash stm32f105/107 |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 24)
|
May 27 2013, 02:16
|
Местный
  
Группа: Участник
Сообщений: 222
Регистрация: 14-12-12
Из: новосибирск
Пользователь №: 74 845

|
ну так как мне ограничить область используемой ияром памяти для программы? примеров где не ограничивают итак полно. вот файл ицфник тут что то исправить надо наверное.. CODE /*###ICF### Section handled by ICF editor, don't touch! ****/ /*-Editor annotation file-*/ /* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ /*-Specials-*/ define symbol __ICFEDIT_intvec_start__ = 0x08000000; /*-Memory Regions-*/ define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; define symbol __ICFEDIT_region_ROM_end__ = 0x080FFFFF; define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; define symbol __ICFEDIT_region_RAM_end__ = 0x20017FFF; /*-Sizes-*/ define symbol __ICFEDIT_size_cstack__ = 0x400; define symbol __ICFEDIT_size_heap__ = 0x200; /**** End of ICF editor section. ###ICF###*/
define memory mem with size = 4G; define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
initialize by copy { readwrite }; do not initialize { section .noinit };
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
place in ROM_region { readonly }; place in RAM_region { readwrite, block CSTACK, block HEAP };
Сообщение отредактировал super_puper - May 27 2013, 02:28
|
|
|
|
|
May 27 2013, 10:32
|
Местный
  
Группа: Участник
Сообщений: 222
Регистрация: 14-12-12
Из: новосибирск
Пользователь №: 74 845

|
да это понятно что в этих строчках я просто вместо 0х08.... искал программу в 0х8... регионах памяти и не мог найти) непонятно почему такой диапазон установлен большой ведь флеш всего 256к мне кажется надо поменять на __ICFEDIT_region_ROM_end__ = 0x0803FFFF;//(256k) а далее по даташиту идет резервед
Сообщение отредактировал super_puper - May 27 2013, 10:36
Эскизы прикрепленных изображений
|
|
|
|
|
Jun 3 2013, 02:34
|
Местный
  
Группа: Участник
Сообщений: 222
Регистрация: 14-12-12
Из: новосибирск
Пользователь №: 74 845

|
AHTOXA, спасибо но я по ссылке ничего не понял( непривычный там си.. я попробовал вот такой пример как везде предлагают: CODE define FLASH_KEY1 ((uint32_t)0x45670123) // ключи для снятия защиты памяти #define FLASH_KEY2 ((uint32_t)0xCDEF89AB) #define FLASH_PAGE_SIZE ((uint16_t)0x400) // размер страницы 1 кб #define WRITE_START_ADDR ((uint32_t)0x08003800) // запись с 15го килобайта
//-----------------------стирание
void Erase_flash (u16 adr) { u16 dst = WRITE_START_ADDR + adr; // вычисление места записи FLASH->KEYR = FLASH_KEY1; FLASH->KEYR = FLASH_KEY2; FLASH->CR |= FLASH_CR_PER; /* Page erase */ FLASH->AR = dst; FLASH->CR|= FLASH_CR_STRT; /* Start erase */ while ((FLASH->SR & FLASH_SR_BSY) != 0 ); /* Wait end of eraze */ FLASH->CR &= ~FLASH_CR_PER; /* Page erase end */ FLASH->CR |= FLASH_CR_LOCK; /* Lock the flash back */ }
//-----------------------запись
void Write_flash (u16 Data, u16 adr) { u16 dst = WRITE_START_ADDR + adr; FLASH->KEYR = FLASH_KEY1; FLASH->KEYR = FLASH_KEY2; FLASH->CR |= FLASH_CR_PG; while ((FLASH->SR & FLASH_SR_BSY) != 0 ); *(__IO uint16_t*)dst = (uint16_t)Data; while ((FLASH->SR & FLASH_SR_BSY) != 0 ); FLASH->CR &= ~FLASH_CR_PG; FLASH->CR |= FLASH_CR_LOCK; /* Lock the flash back */ } у меня вылетает в бесконечное прерывание проц( void HardFault_Handler(void) { /* Go to infinite loop when Hard Fault exception occurs */ while (1) { } } частота 72 мегагерца от HSE кварца 25мег флэш с двумя пропусками настроенна: /* Flash 2 wait state */ FLASH_SetLatency(FLASH_Latency_2); вот так в майне запись делаю: Erase_flash (1); Write_flash (3030, 1); вот так ограничил память программ define symbol __ICFEDIT_region_ROM_end__ = 0x08003000;//было 0x080FFFFF но виснет! что делать?(
Сообщение отредактировал super_puper - Jun 3 2013, 02:35
|
|
|
|
|
Jun 5 2013, 05:14
|
Частый гость
 
Группа: Участник
Сообщений: 99
Регистрация: 23-06-04
Из: Kiev
Пользователь №: 146

|
QUOTE (super_puper @ Jun 5 2013, 05:35)  где взять файлы eeprom.h и eeprom.c которые описываются в AN2594 Application note EEPROM emulation in STM32F10x microcontrollers странно что дока есть а файлов нет на сайте ст( Это? http://www.st.com/web/en/catalog/tools/PF257846
|
|
|
|
|
Jun 5 2013, 16:12
|
Местный
  
Группа: Участник
Сообщений: 244
Регистрация: 29-02-08
Пользователь №: 35 503

|
Цитата(scifi @ Jun 5 2013, 12:25)  Ничего. Разница была бы между STM32F1xx и STM32F2xx. А внутри одного семейства флэш устроена одинаково. Экзампл ихний сперва обескураживает.. Поначалу неясно зачем там VirtAdrTab, и как сохранить более чем 3 переменных. От VirtAdrTab следует отказаться, а в качестве виртуальных адресов использовать VarIdx (требуется минимальная правка eeprom.c) . А в качестве NB_OF_VAR задефайнить sizeof() сохраняемой структуры переменных.
|
|
|
|
|
Jun 7 2013, 12:36
|
Местный
  
Группа: Участник
Сообщений: 244
Регистрация: 29-02-08
Пользователь №: 35 503

|
Цитата(super_puper @ Jun 7 2013, 09:20)  я не понял как вы переделали я изменил количество переменных до 256 а было 3 #define NumbOfVar ((uint8_t)0xFF)// резервирую 256 переменных в виртуал еепром
и в майне создаю массив виртуальных 256 адресов for (u8 mm=0;mm<255;mm++){VirtAddVarTab[mm]=mm;} А чем виртуальные адреса принципиально отличаются от их индекса (mm - у Вас. более того они равны: VirtAddVarTab[mm]=mm ). В примере были адреса из четырех одинаковых цифр, чисто для удобства наблюдения в ихних иллюстрациях, либо под отладчиком. Уберите лишнее промежуточное звено - используйте в качестве адреса сам индекс (mm) - они ведь тоже уникальны: 0..255. Оно, конечно, и так будет работать, только к чему лишние навороты, ровно ничего не дающие..
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|