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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Работа с backup SRAM stm32f407, Как это??
mantech
сообщение Sep 25 2013, 13:35
Сообщение #1


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Приветствую всех, кто осиливает тяжкий труд по освоению чего-то от ST wacko.gif

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

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

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

Сообщение отредактировал mantech - Sep 25 2013, 13:38
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Sep 25 2013, 14:24
Сообщение #2


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Оно?

PWR_BackupAccessCmd(ENABLE);

ну и включить тактирование перед этим.
Go to the top of the page
 
+Quote Post
mantech
сообщение Sep 25 2013, 14:46
Сообщение #3


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(kolobok0 @ Sep 25 2013, 17:24) *
Оно?

PWR_BackupAccessCmd(ENABLE);

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


Это понятно, а по каким адресам расположена эта память?? т.е. как туда писать и читать rolleyes.gif
Go to the top of the page
 
+Quote Post
SSerge
сообщение Sep 25 2013, 15:23
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



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

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

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


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
mantech
сообщение Sep 25 2013, 15:27
Сообщение #5


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(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");
}
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 25 2013, 17:38
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(SSerge @ Sep 25 2013, 19:23) *
В Memory map пишут, что от 0x4002 4000 до 0x4002 4FFF, не проверял sm.gif

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

Так и есть. Проверено.
Go to the top of the page
 
+Quote Post
mantech
сообщение Sep 25 2013, 18:14
Сообщение #7


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(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 до ...?
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 25 2013, 18:52
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(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")));
Go to the top of the page
 
+Quote Post
mantech
сообщение Sep 25 2013, 19:46
Сообщение #9


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



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


У долбанутого ИАра там
#pragma location = адрес
Правда для переменных прокатывает, а вот с юнионом никак не хочет...
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 25 2013, 20:30
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



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

Думаю, этого мало. Вам зачем батареечная память нужна? Хранить данные, которые не уничтожаются после сброса?
Тогда нужно еще как-то сказать линкеру, чтоб не инициализировал эти данные.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Sep 26 2013, 11:39
Сообщение #11


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

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



В файле stm32f4xx.h должна быть строка (в Keil есть)
#define BKPSRAM_BASE ((uint32_t)0x40024000) /*!< Backup SRAM(4 KB) base address in the alias region */
А обращаться можно по указателю, аналогично, как ко всем периферийным устройствам.
Go to the top of the page
 
+Quote Post
mantech
сообщение Sep 26 2013, 16:10
Сообщение #12


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(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?
Go to the top of the page
 
+Quote Post
Warlockwolf
сообщение Sep 26 2013, 16:47
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 17-06-08
Пользователь №: 38 358



Код
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


может так
Go to the top of the page
 
+Quote Post
mantech
сообщение Sep 26 2013, 16:52
Сообщение #14


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(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

Сообщение отредактировал mantech - Sep 26 2013, 17:36
Go to the top of the page
 
+Quote Post
ViKo
сообщение Sep 27 2013, 18:16
Сообщение #15


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

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



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

А как же часы работали?
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 22:37
Рейтинг@Mail.ru


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