Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Сброс CM3 программно
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
_Артём_
Здраствуйте.
Пытаюсь сделать сброс МК программно в соответствии с
Цитата
Software may initiate a reset (e.g. if it finds itself in a non-recoverable state). By asserting the
SYSRESETREQ in the Application Interrupt and Reset Control Register (write 0x05FA 0004), a reset is
issued.

Делаю так:
Код
AIRCR=0x05FA0004;


Но после этих действий программа вопреки моим ожиданиям оказывается не Reset_Handler, а в Default_Handler.
Что я не правильно делаю?

Спасибо.
GetSmart
Проц какой? В LPC17xx юзер мануале написано "... не реализовано".
_Артём_
Цитата(GetSmart @ Apr 28 2012, 20:54) *
Проц какой?


EFMG890F128


Цитата(GetSmart @ Apr 28 2012, 20:54) *
В LPC17xx юзер мануале написано "... не реализовано".

Я цитату из reference manual-а приводит. Из неё следует что запрос реализован (если я правильно понял).

Уточнение: программа попадает в HardFault_Handler.
AHTOXA
В CMSIS это делается вот так:

Код
#define NVIC_SYSRESETREQ            2         /*!< System Reset Request         */
#define NVIC_AIRCR_VECTKEY    (0x5FA << 16)   /*!< AIRCR Key for write access   */
...
static __INLINE void NVIC_SystemReset(void)
{
  SCB->AIRCR  = (NVIC_AIRCR_VECTKEY | (SCB->AIRCR & (0x700)) | (1<<NVIC_SYSRESETREQ)); /* Keep priority group unchanged */
  __DSB();                                                                             /* Ensure completion of memory access */
  while(1);                                                                            /* wait until reset */
}
_Артём_
Цитата(AHTOXA @ Apr 28 2012, 22:32) *
В CMSIS это делается вот так:


Заменил у себя:

Код
volatile unsigned char ResetRqFlag;
int main() {
if (ResetRqFlag) {
    ResetRqFlag=0;
    NVIC_SystemReset();
}


Результат тот же, программа оказывается тут:

Код
void HardFault_Handler(void)
{
for (;;)
    GPIO->P[2].DOUTTGL=1;
}

AHTOXA
Тогда остаётся только одно: в ваш чип забыли положить эту функцию! sm.gif
Пишите в суппорт.
-----------
Подумал ещё: а вы не перевели случайно процессор в user-mode? Может быть, из него нельзя писать в эти регистры?
(Для проверки попробуйте вызвать NVIC_SystemReset() из прерывания).
Nixon
890 у вас в какой ревизии? Если B то не ожидайте от него всего, что написано в документации. Сырой до ужаса чип.

Я даже отложил всю работу с ним до получения ревизии С.

Ой, прошу прощения, я про GG890. У вас же просто Gecko.
_Артём_
Цитата(Nixon @ Apr 29 2012, 08:08) *
890 у вас в какой ревизии?

А как ревизию попроще узнать?
Nixon
п.7.3.4 мануала на гекко.
_Артём_

*(uint32_t *)0xE00FFFE8 = 0x0F
*(uint32_t *)0xE00FFFEC = 0x20

Получается Rev=0x02 - C.
_Артём_
Цитата(AHTOXA @ Apr 29 2012, 07:44) *
Тогда остаётся только одно: в ваш чип забыли положить эту функцию! sm.gif

Нет, не забыли.
Всё работает: и мой первый вариант и ваш и просто вызов NVIC_SystemReset.
Почему сразу не заработал - загадка.

Цитата(AHTOXA @ Apr 29 2012, 07:44) *
Подумал ещё: а вы не перевели случайно процессор в user-mode?

Хм. Трудно сказать.
Reset задумывался сразу после входа в main (просто что бы проверить эту функцию).
Вряд ли там в Reset_Handler где-то переход был.
Да и не упоминалось в описании запроса на сброс о режиме процессора:
Цитата
Software may initiate a reset (e.g. if it finds itself in a non-recoverable state). By asserting the
SYSRESETREQ in the Application Interrupt and Reset Control Register (write 0x05FA 0004), a reset is
issued.

Разве что где-ещё смотреть надо.
AHTOXA
Цитата(_Артём_ @ May 4 2012, 02:45) *
Разве что где-ещё смотреть надо.

В первоисточнике (Cortex-M3 Technical Reference Manual):
Цитата
You can only fully access the NVIC from privileged mode, but you can pend interrupts
in user-mode if you enable the Configuration Control Register (see Configuration
Control Register on page8-25). Any other user-mode access causes a bus fault.
_Артём_
Цитата(AHTOXA @ May 4 2012, 06:09) *
В первоисточнике (Cortex-M3 Technical Reference Manual):


Что-то совсем непонятно.
Код
void OS::system_timer_user_hook() {// вызывается с частотой 1кГц
    DWT_CYCCNT=0;

    if (++Divider==1000) {// 1 секунда
        Divider=0;
        TimerEvent.signal_isr();
    }
    Timers[0]=DWT_Get();
}

template<>
OS_PROCESS void TProc1::exec() {
    uint16_t reset_delay_cnt=0;
    for (;;) {
        TimerEvent.wait();
        Timers[1]=DWT_Get();
        {// Сброс
            if (++reset_delay_cnt==20) {// сброс через 20 секунд
                ResetRqFlag=0;
                SCB->AIRCR=0x05FA0004;
                while (1);
            }
        }
    }
}


TProc1::exec делает сброс раз в 20 секунд. Никакого fault-а не происходит.
AHTOXA
Здесь как раз всё нормально. По умолчанию кортексы работают в привилегированном режиме. Чтобы переключить их в user-mode, надо предпринять определённые действия.
_Артём_
Цитата(AHTOXA @ May 4 2012, 17:40) *
Здесь как раз всё нормально. По умолчанию кортексы работают в привилегированном режиме.

Может быть. Пока с режимами и их переключениями не разбирался.
Непривычно после АВР. Режимы какие-то - зачем они? Пока не улеглось в голове.

Цитата(AHTOXA @ May 4 2012, 17:40) *
Чтобы переключить их в user-mode, надо предпринять определённые действия.

Попробую предпринять и проверить как будет тогда работать (когда найду как оно переключается).
AHTOXA
Цитата(_Артём_ @ May 4 2012, 20:48) *
Непривычно после АВР. Режимы какие-то - зачем они? Пока не улеглось в голове.

Да в принципе на M-ках оно не нужно. Это уже для больших осей, с пользовательскими задачами.
kosyak©
Тоже в попадаю в HardFault. Причем раз на раз не приходится - могу попасть могу не попасть. Камень STM32F103RC, использую TNKernel.
AHTOXA
А попробуйте запретить прерывания перед сбросом.
kosyak©
Пробовал - ничего не изменилось. sad.gif
_Артём_
Цитата(kosyak© @ May 4 2012, 20:59) *
Пробовал - ничего не изменилось. sad.gif

Программу не покажете?
А то у меня попасть в fault не получается больше. А хотелось бы воспроизвести.
kosyak©
Боюсь что в коде там нет ничего необычного. И HardFault у меня тоже не постоянный - то есть то нет. Завтра попытаюсь как нибудь локализовать проблему.
_Артём_
Цитата(kosyak© @ May 4 2012, 21:25) *
Боюсь что в коде там нет ничего необычного. И HardFault у меня тоже не постоянный - то есть то нет. Завтра попытаюсь как нибудь локализовать проблему.

Да это понятно что ничего необычного.
Просто у меня возникать перестал, и нет варианта когда он хоть иногда возникает - хотелось бы сравнить и понять разницу.
Cosmojam
Программный сброс можно от вотчдога сделать и не мучиться так
_Артём_
Цитата(Cosmojam @ May 4 2012, 21:40) *
Программный сброс можно от вотчдога сделать и не мучиться так

Где ж тут мучения? Если ядро имеет такую функцию, то тогда вочдог использовать - это мучение.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.