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

 
 
> Программный рестарт MSP430F5438A, не работает, зараза. А на F2618 "прокатывало"
k155la3
сообщение Dec 29 2016, 07:45
Сообщение #1


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

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Как правильно сделать программный рестарт в MSP430F5438A ?
(IAR, MODEL == LARGE)

То, что работало на F2618, не прокатывает:
Код
void SystemReStart()
{
        __disable_interrupt();
    asm ("push &0xfffe");
    asm ("ret");        
};

Код этой функции размещен в "за-64К" области.

Насколько удается посмотреть на отладчике, после этой процедуры идет влет в пустую область памяти 0xFF.

Изменил на asm для 20-битного адреса (pushx.a, reta) - "рояль не заиграл".

Ресет успешно выполняется способами
- старта WDT
- "подсовывания" перехода на команду, находящуюся не в программной памяти а в области адресов регистров (fetch)

(?) что может быть не так с "прямым" вызовом push+ret ?

Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
MrYuran
сообщение Dec 30 2016, 10:52
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



jmp reset не катит?


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
k155la3
сообщение Dec 30 2016, 12:14
Сообщение #3


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

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(MrYuran @ Dec 30 2016, 13:52) *
jmp reset не катит?


Шас проверил еще раз (только на отладчике)

(controller_m30)
Код
или совсем напрямую
mov &0xfffe,PC

а тк код сишный
Код
   __no_operation();            << BP
   asm("mov &0xfffe,PC");

Прошагал отладчиком по asm - все ресетится.
Проверю еще на Release.

Go to the top of the page
 
+Quote Post
k155la3
сообщение Dec 30 2016, 13:29
Сообщение #4


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

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(k155la3 @ Dec 30 2016, 15:14) *
Шас проверил еще раз (только на отладчике)

(controller_m30)
Код
или совсем напрямую
mov &0xfffe,PC

а тк код сишный
Код
   __no_operation();            << BP
   asm("mov &0xfffe,PC");

Прошагал отладчиком по asm - все ресетится.
Проверю еще на Release.


======

Исследования показали, что переход по ресету проходит (на адрес, куда указывает ресетный вектор)
и далее в начало main().

По непонятной для меня причине при таком "ресете" происходит зацикл в ф-ии инициализации UCS (тактовой системы).
При ресете через WDT, fetch или аппаратном - этот блок не циклит.

Код
  . . . .
      do
    {
              UCSCTL7 &= ~( XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);    // Clear XT2,XT1,DCO fault flags
              __no_operation();
              SFRIFG1 &= ~OFIFG;                      // Clear fault flags
        } while ( SFRIFG1 & OFIFG );                  // Test oscillator fault flag
  . . . .

(функция XT2 выводов отключена, генератор XT2 не исползуется и физически кварца нет)
Упорно устанавливается (при программном ресете по JMP) флаг XT2OFFG в UCSCTL7 и соотв-но общий флаг (SFRIFG1 & OFIFG).

Делаю для себя вывод, что для такого "рестарта" требуется начальная подготовка процессора, чтобы все прошло корректно.
(установка UCS и возможно, PMM в определенное состояние)

Итак. Ресетится проще всего:
(1) - через WDT
(2) - через peripheral/config area fetch
Шас использую (2), потом переделаю на (1)
(сугобо IMHO)


Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 00:59
Рейтинг@Mail.ru


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