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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> ADSP BF532, Сброс процессора
__inline__
сообщение Sep 19 2017, 00:15
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 92
Регистрация: 5-09-17
Пользователь №: 99 126



Здравствуйте!

Конфигурация: ADSP Blackfin BF532, код выполняется из SDRAM, кеширование включено.
Первичная загрузка - из SPI флешки 8-битной (микросхема AT45DB....), затем переход кода в SDRAM.

Нужно сбросить процессор, чтобы снова подгрузилась программа из SPI-флешки. (причем именно чтобы снова повторился цикл загрузки с SPI-флешки, ттак как старый образ программы в L1 может быть уже разрушен - стеком, буферами DMA)

Вот так - НЕ работает:
Код
while(1) __asm__ ("raise 1;");


Спецы, подскажите плиз как сбросить программно?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 19 2017, 05:17
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 689
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(__inline__ @ Sep 19 2017, 07:15) *
Спецы, подскажите плиз как сбросить программно?

Перейти на начало загрузчика в ROM?
Go to the top of the page
 
+Quote Post
__inline__
сообщение Sep 19 2017, 05:52
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 92
Регистрация: 5-09-17
Пользователь №: 99 126



Цитата(jcxz @ Sep 19 2017, 05:17) *
Перейти на начало загрузчика в ROM?

Да. Штатный загрузчик, который по двум ногам определяет, что надо скопировать код с spi-флешки AT45DB... и передать на него управление
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 19 2017, 07:01
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 689
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(__inline__ @ Sep 19 2017, 12:52) *
Да. Штатный загрузчик, который по двум ногам определяет, что надо скопировать код с spi-флешки AT45DB... и передать на него управление

Вот я и говорю: если нет возможности установить состояние этих ног и сделать POR-сброс, то попробуйте найти его начало в ROM и явно передать туда управление.
Ещё в некоторых МК есть возможность задать тип загрузки при программном сбросе через спец. регистры (например в Infineon). Может у Вас так.
А эти ваши 2 ноги - они скорее всего считываются только при POR-сбросе и внешнем RESET. При программном сбросе - скорее всего нет. Хотя можно попробовать ещё сброс через WDT.
Go to the top of the page
 
+Quote Post
__inline__
сообщение Sep 19 2017, 07:45
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 92
Регистрация: 5-09-17
Пользователь №: 99 126



Да, хотелось бы так как при сбросе нажатием кнопки.
Пара ног, которые определяют с какого носителя грузиться всегда в одном состоянии и не меняются.

С какого адреса у BF532 начинается загрузчик?
Попробую сделать прямой переход туда.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 19 2017, 08:13
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 689
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(__inline__ @ Sep 19 2017, 14:45) *
Да, хотелось бы так как при сбросе нажатием кнопки.
Пара ног, которые определяют с какого носителя грузиться всегда в одном состоянии и не меняются.

Скорей всего, ваш МК переходит на соответствующий загрузчик когда эти ноги в соответствующем состоянии И тип сброса == POR или внешний сигнал RESET.
Это должно быть описано в соответствующем разделе мануала на проц (типа: "Загрузка и сброс").
Go to the top of the page
 
+Quote Post
__inline__
сообщение Sep 19 2017, 08:45
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 92
Регистрация: 5-09-17
Пользователь №: 99 126



Если программно ресет не сделать, то прийдётся выводить на экран сообщение, чтоб пользователь нажал кнопку RESET.
А хочется автоматически чтоб.... rolleyes.gif
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 19 2017, 08:53
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 3 689
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(__inline__ @ Sep 19 2017, 15:45) *
Если программно ресет не сделать, то прийдётся выводить на экран сообщение, чтоб пользователь нажал кнопку RESET.
А хочется автоматически чтоб.... rolleyes.gif

Ну если так припёрло, то можно кинуть одну GPIO-ножку МК на RESET, которую по дефолту держать в состоянии "ввод". Хотя лучше её кинуть на вход MR внешнего сторожевика+супервизора.
Go to the top of the page
 
+Quote Post
_pv
сообщение Sep 19 2017, 09:27
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 223
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



Цитата(__inline__ @ Sep 19 2017, 13:45) *
С какого адреса у BF532 начинается загрузчик?
Попробую сделать прямой переход туда.

а если всё-таки почитать описание регистров SWRST и SYSCR? там вроде что-то было про сброс и вход в загрузчик.
ну и вочдог ещё есть.
Go to the top of the page
 
+Quote Post
uriy
сообщение Sep 19 2017, 11:23
Сообщение #10


Гуру
******

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



У меня программная перезагрузка работает на BF533.
Завтра смогу глянуть исходники и сказать точно что нужно делать.
Помнится надо было в SWRST что-то записать потом сделать ssync, csync и только потом raise
Go to the top of the page
 
+Quote Post
__inline__
сообщение Sep 19 2017, 14:37
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 92
Регистрация: 5-09-17
Пользователь №: 99 126



Сделал вот так:

Код
static __inline__ void BlackFin_SoftReset(void)
{
*pSWRST=0x0007;
ssync();
register u32 i=75;
while(i--);
__asm__ __volatile__ ("NOP;");
*pSWRST=0x0000;
ssync();
__asm__ __volatile__ ("RAISE 1;");
}


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

Каким образом можно сделать чтобы данный код был гарантированно в кеше инструкций? (код выполняется из SDRA со включенным write-back кешированием)
Go to the top of the page
 
+Quote Post
_pv
сообщение Sep 19 2017, 14:59
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 223
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



ну раз пример из мануала переписали, там же рядом чёрным по белому написано, что исполнять надо исключительно из L1.
объясните линкеру чтобы он эту конкретную функцию в внутреннюю память положил.

p.s. точку с запятой после while(i--) уберите, она там немного лишняя, а то компилятор может этот цикл выкинуть за ненадобностью.
Go to the top of the page
 
+Quote Post
__inline__
сообщение Sep 19 2017, 15:17
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 92
Регистрация: 5-09-17
Пользователь №: 99 126



В общем, найдёно изящное решение - сброс по сторожевому таймеру:

Код
static __inline__ void BlackFin_Reset(void)
{
*pWDOG_CNT=13200000; //таймаут 0.1 секунды (число тактов шины SCLK, у меня 132 МГц)
*pWDOG_CTL=0;        //выбираем RESET и включаем watchdog
while(1);                    //зацикливание
}


Работает надёжно и с любого адреса, ресет такой же как при нажатии на кнопку, загрузчик снова тянет из SPI-флеш самописанную программу-загрузчик-инициализатор в SDRAM.

До этого ещё пробовал как здесь:
http://electronix.ru/forum/index.php?showtopic=32272 - НЕ помогло.

Всё-же RAISE 1 и SWRST - это от лукавого (при выполнения кода из кешируемой области памяти) biggrin.gif
Go to the top of the page
 
+Quote Post
_pv
сообщение Sep 19 2017, 15:26
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 223
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



мануалы читать надо, там написано для чего и какая пауза должна быть между записями в SWRST.
Go to the top of the page
 
+Quote Post
__inline__
сообщение Sep 19 2017, 15:29
Сообщение #15


Частый гость
**

Группа: Участник
Сообщений: 92
Регистрация: 5-09-17
Пользователь №: 99 126



Цитата(_pv @ Sep 19 2017, 14:59) *
объясните линкеру чтобы он эту конкретную функцию в внутреннюю память положил.


А как он её положет, если сама программа исполняется в SDRAM с адреса 0x00000004 ? Образ программы в LDF-файле задается как ROM, но это для линковщика, на самом деле там всё RAM rolleyes.gif (ох уж эти линковщики sm.gif

Или речь идёт о том, что линкер сделает стартап, который сделает копию функции из SDRAM в L1 и сформирует вызовы именно из L1 ? (это фантастика =)

Цитата
p.s. точку с запятой после while(i--) уберите, она там немного лишняя, а то компилятор может этот цикл выкинуть за ненадобностью.


Ну я под этим подразумевал пустой цикл sm.gif А если запятую убрать, то получится 75 раз NOP-ов )) Ну а на счёт выкинет, есть же volatile)

Цитата(_pv @ Sep 19 2017, 15:26) *
мануалы читать надо, там написано для чего и какая пауза должна быть между записями в SWRST.

Если фрагмент кода сброса находится во внешней кешируемой памяти - не поможет.
Надо чтоб этот фрагмент гарантировано был закеширован, тогда отключение SDRAM не страшно. Иначе получается - программа рубит сук на котором сидит)

Сообщение отредактировал __inline__ - Sep 19 2017, 15:28
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st October 2017 - 16:04
Рейтинг@Mail.ru


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