|
STM32, backup registers, как бы поудобнее реализовать с ними работу |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Jun 7 2010, 20:38
|
Частый гость
 
Группа: Участник
Сообщений: 92
Регистрация: 23-12-08
Из: Кишинёв
Пользователь №: 42 680

|
Из RM0008: Backup data register x (BKP_DRx) (x = 1 ..42) Address offset: 0x04 to 0x28, 0x40 to 0xBC Первые 10 слов лежат подряд, остальные через интервал. Можно рассматривать как два массива с адресами (BKP_BASE + 0x0004) и (BKP_BASE + 0x0040) соответственно. Думаю около того: Код volatile uint32_t* BKPPartOne = (volatile uint32_t*)(BKP_BASE + 0x0004); BKPPartOne[0] = 0x1234; BKPPartOne[1] = 0x2345; ... BKPPartOne[9] = 0xXXXX; Не проверял, но по идее должно работать  . Если нужно одним массивом, то можно завернуть это дело в класс с оператором [].
|
|
|
|
|
Jun 9 2010, 12:34
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Спасибо за советы. Реализация в виде дефайнов слишком простая и неудобная - всё надо делать ручками. А вот обёртка в виде класса способна дать некое удобство и автоматизацию, но накладные расходы памяти будут совсем не кстати. Да и если с переопределением dword, word и byte проблем не вижу, то как реализовать в классе работу со структурами я не знаю  Наверное создам пока обычную структуру в памяти, и буду её время от времени записывать/считывать из энергонезависимого озу. Насчёт компиляторов не в курсе. Работаю в RealView, а он совсем не отличается широкой поддержкой всяких хитрых фич, в отличие от IAR
|
|
|
|
|
Jun 9 2010, 18:43
|
Частый гость
 
Группа: Участник
Сообщений: 92
Регистрация: 23-12-08
Из: Кишинёв
Пользователь №: 42 680

|
Цитата(sonycman @ Jun 9 2010, 15:34)  А вот обёртка в виде класса способна дать некое удобство и автоматизацию, но накладные расходы памяти будут совсем не кстати. Накладных расходов памяти не будет, только кода(и времени доступа). Сделать класс со статическими Set и Get для каждого члена "структуры", всё описать в хидере и после оптимизатора там будет очень компакный код. Собственно объект класса даже создавать не нужно, т.к. все методы будут статическими. Хотя никто не мешает так же завернуть это дело в static inline си-функции. Вопрос чисто эстетический  . Цитата(sonycman @ Jun 9 2010, 15:34)  Наверное создам пока обычную структуру в памяти, и буду её время от времени записывать/считывать из энергонезависимого озу. По моему нормальный подход. Всё равно там этой backup-памяти кот наплакал(в мелких девайсах и вовсе 10 слов). Можно сделать универсальные: Save(const void* inptr, size_t bytes) и Load(void* outptr, size_t bytes) и грузить туда любые конструкции.
Сообщение отредактировал baralgin - Jun 9 2010, 18:48
|
|
|
|
|
Jun 10 2010, 10:39
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Нет, в моём понимании "прозрачность" - это когда работа со специфическими данными осуществляется точно так же, как и с обычными. Пример: Код dword a = 100; NON_VOLATILE b = 50; if (b < a) b = a; и т.д. А ещё лучше было бы: Код NON_VOLATILE dword b;
NON_VOLATILE struct { dword a; word b; byte c[5]; } timer; Тут мы одновременно задаём тип данных и его размер. Но это уже даже не Си, наверное... Я не знаю, как этого добиться на Си или Си++
|
|
|
|
|
Jun 11 2010, 05:19
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Добился-таки "прозрачности", но на lpc1768.
Проверял так:
BYTE *bat;
bat = (BYTE *)0x30000000; // несуществующая память bat[0]=0x5A;
С позиций ядра bat[0]=num есть
STR rc, [ro]
rc - хранит число num, ro - хранит адрес назначения bat+0
Запись по несуществующему адресу вызывает исключение. В обработчике исключения подменяю ro на нужную ячейку памяти и выхожу (регистры R0-R3, R12 "проблемного участка" доступны через стек, остальные - напрямую). Команда STR выполняется еще раз, но уже с новым адресом.
У данного подхода есть ряд минусов: - нужен контроллер с MPU. на STM32 не смог получить исключение в месте, где произвожу запись. - поскольку rc и ro заранее не известны (впрочем команда тоже может быть не STR), то нужно анализировать инструкцию, которая привела к сбою. - после выполнения инструкции параметры портятся, поэтому инструкцию лучше эмулировать.
|
|
|
|
|
Dec 14 2010, 04:21
|
Участник

Группа: Участник
Сообщений: 42
Регистрация: 4-12-05
Из: Екатеринбург
Пользователь №: 11 773

|
Цитата(Serj78 @ Dec 14 2010, 08:23)  А у кого- нибудь получилось записать в эти регистры- хоть что- нибудь? Я так и делаю BKP->DRx = data; data = BKP->DRx; Все работает! Скорее всего вы не разрешили запись в BKP. Что-то типа этого... CODE RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP | RCC_APB1Periph_PWR,ENABLE); // вкл тактирование нужной периферии PWR_BackupAccessCmd(ENABLE);// разрешаем доступ к BKP
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|