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

 
 
> Сброс CM3 программно
_Артём_
сообщение Apr 28 2012, 17:26
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Здраствуйте.
Пытаюсь сделать сброс МК программно в соответствии с
Цитата
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.
Что я не правильно делаю?

Спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
GetSmart
сообщение Apr 28 2012, 17:54
Сообщение #2


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Проц какой? В LPC17xx юзер мануале написано "... не реализовано".


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Apr 28 2012, 19:24
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(GetSmart @ Apr 28 2012, 20:54) *
Проц какой?


EFMG890F128


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

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

Уточнение: программа попадает в HardFault_Handler.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Apr 28 2012, 19:32
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



В 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 */
}


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Apr 28 2012, 19:59
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



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

Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Apr 29 2012, 04:44
Сообщение #6


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
_Артём_
сообщение May 3 2012, 20:45
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



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

Разве что где-ещё смотреть надо.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение May 4 2012, 03:09
Сообщение #8


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(_Артём_ @ 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.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
_Артём_
сообщение May 4 2012, 14:31
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(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-а не происходит.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение May 4 2012, 14:40
Сообщение #10


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Здесь как раз всё нормально. По умолчанию кортексы работают в привилегированном режиме. Чтобы переключить их в user-mode, надо предпринять определённые действия.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- _Артём_   Сброс CM3 программно   Apr 28 2012, 17:26
|- - _Артём_   Цитата(AHTOXA @ May 4 2012, 17:40) Здесь ...   May 4 2012, 14:48
|- - AHTOXA   Цитата(_Артём_ @ May 4 2012, 20:48) Непри...   May 4 2012, 16:31
- - Nixon   890 у вас в какой ревизии? Если B то не ожидайте о...   Apr 29 2012, 05:08
|- - _Артём_   Цитата(Nixon @ Apr 29 2012, 08:08) 890 у ...   May 1 2012, 15:51
- - Nixon   п.7.3.4 мануала на гекко.   May 1 2012, 17:24
|- - _Артём_   *(uint32_t *)0xE00FFFE8 = 0x0F *(uint32_t *)0xE00F...   May 1 2012, 17:52
- - kosyak©   Тоже в попадаю в HardFault. Причем раз на раз не п...   May 4 2012, 17:04
|- - AHTOXA   А попробуйте запретить прерывания перед сбросом.   May 4 2012, 17:36
- - kosyak©   Пробовал - ничего не изменилось.   May 4 2012, 17:59
|- - _Артём_   Цитата(kosyak© @ May 4 2012, 20:59) Пробо...   May 4 2012, 18:09
- - kosyak©   Боюсь что в коде там нет ничего необычного. И Hard...   May 4 2012, 18:25
|- - _Артём_   Цитата(kosyak© @ May 4 2012, 21:25) Боюсь...   May 4 2012, 18:29
- - Cosmojam   Программный сброс можно от вотчдога сделать и не м...   May 4 2012, 18:40
- - _Артём_   Цитата(Cosmojam @ May 4 2012, 21:40) Прог...   May 4 2012, 19:22


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

 


RSS Текстовая версия Сейчас: 22nd August 2025 - 05:51
Рейтинг@Mail.ru


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