Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Работа с backup SRAM stm32f407
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
mantech
Приветствую всех, кто осиливает тяжкий труд по освоению чего-то от ST wacko.gif

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

ЗЫ. может нужно использовать специфические команды компилятора, пользуюсь ИАРом...

И еще одна "фишка" - подключил батарейку, убрав перемычку на дискавери, и включил часы, так вот ток потребления по этому пину, при выкл. питании - 15 мкА, хотя в доке - макс 4, в чем может быть дело?
kolobok0
Оно?

PWR_BackupAccessCmd(ENABLE);

ну и включить тактирование перед этим.
mantech
Цитата(kolobok0 @ Sep 25 2013, 17:24) *
Оно?

PWR_BackupAccessCmd(ENABLE);

ну и включить тактирование перед этим.


Это понятно, а по каким адресам расположена эта память?? т.е. как туда писать и читать rolleyes.gif
SSerge
Цитата(mantech @ Sep 25 2013, 21:46) *
Это понятно, а по каким адресам расположена эта память?? т.е. как туда писать и читать rolleyes.gif

В Memory map пишут, что от 0x4002 4000 до 0x4002 4FFF, не проверял sm.gif

Память она и есть память, можно по указателю обращаться.
Можно описать как отдельную секцию, разместить в этой секции переменные и работать с ними.
mantech
Цитата(SSerge @ Sep 25 2013, 18:23) *
В Memory map пишут, что от 0x4002 4000 до 0x4002 4FFF, не проверял sm.gif


Отковырял какой-то исходник, там есть параметр - BKPSRAM_BASE. Поищу, где он задается...


/* Backup SRAM ***************************************************************/
/* Enable BKPRAM Clock */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_BKPSRAM, ENABLE);

/* Write to Backup SRAM with 32-Bit Data */
for (uwIndex = 0x0; uwIndex < 0x1000; uwIndex += 4)
{
*(__IO uint32_t *) (BKPSRAM_BASE + uwIndex) = uwIndex;
}
/* Check the written Data */
for (uwIndex = 0x0; uwIndex < 0x1000; uwIndex += 4)
{
if ((*(__IO uint32_t *) (BKPSRAM_BASE + uwIndex)) != uwIndex)
{
uwErrorIndex++;
}
}

if(uwErrorIndex)
{
LCD_ErrLog ("BKP SRAM Number of errors = %d\n", uwErrorIndex);
}
else
{
LCD_UsrLog ("BKP SRAM write OK \n");
}
adnega
Цитата(SSerge @ Sep 25 2013, 19:23) *
В Memory map пишут, что от 0x4002 4000 до 0x4002 4FFF, не проверял sm.gif

Память она и есть память, можно по указателю обращаться.
Можно описать как отдельную секцию, разместить в этой секции переменные и работать с ними.

Так и есть. Проверено.
mantech
Цитата(adnega @ Sep 25 2013, 20:38) *
Так и есть. Проверено.


Вопрос еще один, как "сказать" ИАРу, что вот это -

union {Uint16 GlobalVar_w[VarCount];unsigned char GlobalVar_b[VarCount*2];} s_var;
#define GlobalVar s_var.GlobalVar_w
#define GlobalVarb s_var.GlobalVar_b

должно находиться c адреса 0x40024000 до ...?
adnega
Цитата(mantech @ Sep 25 2013, 22:14) *
Вопрос еще один, как "сказать" ИАРу, что вот это -

union {Uint16 GlobalVar_w[VarCount];unsigned char GlobalVar_b[VarCount*2];} s_var;
#define GlobalVar s_var.GlobalVar_w
#define GlobalVarb s_var.GlobalVar_b

должно находиться c адреса 0x40024000 до ...?

Как сказать ИАРу не знаю, но GCC я говорю так:
Код
volatile sSTR_LINE    sstr __attribute__((section(".bkpsram")));
mantech
Цитата(adnega @ Sep 25 2013, 21:52) *
Как сказать ИАРу не знаю, но GCC я говорю так:
Код
volatile sSTR_LINE    sstr __attribute__((section(".bkpsram")));


У долбанутого ИАра там
#pragma location = адрес
Правда для переменных прокатывает, а вот с юнионом никак не хочет...
adnega
Цитата(mantech @ Sep 25 2013, 23:46) *
У долбанутого ИАра там
#pragma location = адрес
Правда для переменных прокатывает, а вот с юнионом никак не хочет...

Думаю, этого мало. Вам зачем батареечная память нужна? Хранить данные, которые не уничтожаются после сброса?
Тогда нужно еще как-то сказать линкеру, чтоб не инициализировал эти данные.
ViKo
В файле stm32f4xx.h должна быть строка (в Keil есть)
#define BKPSRAM_BASE ((uint32_t)0x40024000) /*!< Backup SRAM(4 KB) base address in the alias region */
А обращаться можно по указателю, аналогично, как ко всем периферийным устройствам.
mantech
Цитата(adnega @ Sep 25 2013, 23:30) *
Думаю, этого мало. Вам зачем батареечная память нужна? Хранить данные, которые не уничтожаются после сброса?
Тогда нужно еще как-то сказать линкеру, чтоб не инициализировал эти данные.


Как раз и нужна, чтоб при откл питания данные сохранялись.
"Тогда нужно еще как-то сказать линкеру, чтоб не инициализировал эти данные." - за это я как раз меньше всего волнуюсь - там есть защита от записи, которая не дает писать туда до тех пор, пока ее специально не отключишь...

Цитата(ViKo @ Sep 26 2013, 14:39) *
В файле stm32f4xx.h должна быть строка (в Keil есть)
#define BKPSRAM_BASE ((uint32_t)0x40024000) /*!< Backup SRAM(4 KB) base address in the alias region */
А обращаться можно по указателю, аналогично, как ко всем периферийным устройствам.


Это я понял, только очень желательно разместить там эти массивы, которые я написал, а то придется больше 150 обращений к массиву править как через указатель, а это не айс sad.gif

ЗЫ. А можно сделать так, что массив int разместить с адреса BKPSRAM_BASE и с того-же адреса массив char?
Это не будет эквивалентно union?
Warlockwolf
Код
typedef union {u16 GlobalVar_w[128]; u8 GlobalVar_b[128*2];} s_var;
#pragma location = 0x40024000
s_var ss_var;

#define GlobalVar ss_var.GlobalVar_w
#define GlobalVarb ss_var.GlobalVar_b


может так
mantech
Цитата(Warlockwolf @ Sep 26 2013, 19:47) *
Код
typedef union {u16 GlobalVar_w[128]; u8 GlobalVar_b[128*2];} s_var;
#pragma location = 0x40024000
s_var ss_var;

#define GlobalVar ss_var.GlobalVar_w
#define GlobalVarb ss_var.GlobalVar_b


может так


Надо попробовать cool.gif
Проверил - вроде работает, единственное, пришлось поставить __no_init без которого проц вешался намертво, видать компилер и правда что-то пытался туда вдуть....

Вопрос - когда записываю в эту память, туда все пишется и читается, но при выкл. питания информация искажается. Там что-то еще нужно "включать" или что? сразу скажу - параллельно работают часы, которые не сбиваются, и батарейка хорошая 3в...

Все разобрался, там надо еще регулятор питания подключить было. Все работает, всем спасибо! a14.gif
ViKo
Цитата(mantech @ Sep 26 2013, 19:52) *
Все разобрался, там надо еще регулятор питания подключить было. Все работает, всем спасибо! a14.gif

А как же часы работали?
mantech
Цитата(ViKo @ Sep 27 2013, 21:16) *
А как же часы работали?

А им он не нужен. Это только для памяти.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.