реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
super_puper
сообщение May 24 2013, 07:45
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 222
Регистрация: 14-12-12
Из: новосибирск
Пользователь №: 74 845



хочу сохранять данные, вроде и нашел примеры как записывать и считывать каму не жалко выкидывайте свои.. но вот как определить какая область не будет использоваться? для памяти программ или как-то искуственно её ограничить в IARe

Сообщение отредактировал super_puper - May 24 2013, 07:45
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение May 24 2013, 08:14
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



последние.

Все компиляторы и среды позволяют ограничить объем используемой флэш. Обычно в конце отводят сектор другой, и туда все пишут. Удобно тем что сохраненное не теряется даже при перепрошивке основной программы.

хотя учитывая объем флэш памяти современных АРМов, а также уровень вашего вопроса, вы можете писать в последний адрес флэш вообще ничего не делая, ваша программа туда просто не попадет. Вы столько не напишите покаsm.gif...
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 24 2013, 08:25
Сообщение #3


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Golikov A. @ May 24 2013, 11:14) *
...вы можете писать в последний адрес флэш вообще ничего не делая, ваша программа туда просто не попадет. Вы столько не напишете покаsm.gif...

А когда напишет, то уже не влезет sm.gif Так что... "пишите", пока не "написали"... sm.gif
Go to the top of the page
 
+Quote Post
uriy
сообщение May 24 2013, 09:52
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606



у stm есть пример на оффсайте. Название что-то типа eeprom emulator.
Go to the top of the page
 
+Quote Post
super_puper
сообщение May 27 2013, 02:16
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение May 27 2013, 05:40
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



перевидите на русский вот этот кусочек, пожалуйста

/*-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;
Go to the top of the page
 
+Quote Post
super_puper
сообщение May 27 2013, 10:32
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 222
Регистрация: 14-12-12
Из: новосибирск
Пользователь №: 74 845



да это понятно что в этих строчках я просто вместо 0х08.... искал программу в 0х8... регионах памяти и не мог найти)
непонятно почему такой диапазон установлен большой ведь флеш всего 256к мне кажется надо поменять на __ICFEDIT_region_ROM_end__ = 0x0803FFFF;//(256k) а далее по даташиту идет резервед


Сообщение отредактировал super_puper - May 27 2013, 10:36
Эскизы прикрепленных изображений
 Р В Р’ Р в‚¬Р В РЎВ˜Р В Р’µР Р…ьшено Р Т‘Р С• 70%
Прикрепленное изображение
563 x 820 (78.53 килобайт)
 
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение May 27 2013, 11:01
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



ну процов то много разных, у этого 256, а есть и с 64 и с 16. В будущем 512 и мегабайт появятся... потому так универсально с запасиком и сделали.

Вам надо еще уменьшить не 256, а (256 - область настроек), и еще жетагу или тому через что вы заливаете прогу тоже надо сказать, чтобы не стирало всю флэш, а последние пару секторов оставляло, чтобы настройки не терялись.
Go to the top of the page
 
+Quote Post
super_puper
сообщение May 29 2013, 08:58
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 222
Регистрация: 14-12-12
Из: новосибирск
Пользователь №: 74 845



кинте кто нибудь пример записи во флэш?( что то не получается...
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение May 29 2013, 13:55
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



не забудьте стереть сначала страницу-сектор в которую пишите.
А потом учитывайте что некоторые процессоры пишут только блоками, не меньше не больше...
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение May 29 2013, 16:02
Сообщение #11


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(super_puper @ May 29 2013, 14:58) *
кинте кто нибудь пример записи во флэш?( что то не получается...

Вот тут кидал.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
super_puper
сообщение Jun 3 2013, 02:34
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jun 3 2013, 11:29
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



есть вариант прочитать в мануале что вызывает это прерывание и проверить... или это не вариант?
Go to the top of the page
 
+Quote Post
super_puper
сообщение Jun 4 2013, 02:19
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 222
Регистрация: 14-12-12
Из: новосибирск
Пользователь №: 74 845



в каком мануале это описано не подскажите? да и так вроде понятно это прерывание всегда когда ошибка какая то в ходе выполнения программы.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jun 4 2013, 05:32
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



именно потому что и так понятно, отсюда и вопросы.


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

Как минимум можно правильно обработать прерывание и выйти из него...

думаю в референц мануале должно быть полюбому (хотя бы кратко), ну и в специализированном по прерываниям уже детально...
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd June 2025 - 03:45
Рейтинг@Mail.ru


Страница сгенерированна за 0.01497 секунд с 7
ELECTRONIX ©2004-2016