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

 
 
> Сброс 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
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 23)
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
Nixon
сообщение Apr 29 2012, 05:08
Сообщение #7


Гуру
******

Группа: Админы
Сообщений: 2 736
Регистрация: 17-06-04
Из: Киев
Пользователь №: 48



890 у вас в какой ревизии? Если B то не ожидайте от него всего, что написано в документации. Сырой до ужаса чип.

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

Ой, прошу прощения, я про GG890. У вас же просто Gecko.


--------------------
Вам помочь или не мешать?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение May 1 2012, 15:51
Сообщение #8


Гуру
******

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



Цитата(Nixon @ Apr 29 2012, 08:08) *
890 у вас в какой ревизии?

А как ревизию попроще узнать?
Go to the top of the page
 
+Quote Post
Nixon
сообщение May 1 2012, 17:24
Сообщение #9


Гуру
******

Группа: Админы
Сообщений: 2 736
Регистрация: 17-06-04
Из: Киев
Пользователь №: 48



п.7.3.4 мануала на гекко.


--------------------
Вам помочь или не мешать?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение May 1 2012, 17:52
Сообщение #10


Гуру
******

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




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

Получается Rev=0x02 - C.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение May 3 2012, 20:45
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #12


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

Группа: Свой
Сообщений: 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
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #14


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

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



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


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


Гуру
******

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



Цитата(AHTOXA @ May 4 2012, 17:40) *
Здесь как раз всё нормально. По умолчанию кортексы работают в привилегированном режиме.

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

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

Попробую предпринять и проверить как будет тогда работать (когда найду как оно переключается).
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение May 4 2012, 16:31
Сообщение #16


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

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



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

Да в принципе на M-ках оно не нужно. Это уже для больших осей, с пользовательскими задачами.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
kosyak©
сообщение May 4 2012, 17:04
Сообщение #17


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

Группа: Свой
Сообщений: 179
Регистрация: 1-10-07
Из: НЧ
Пользователь №: 30 966



Тоже в попадаю в HardFault. Причем раз на раз не приходится - могу попасть могу не попасть. Камень STM32F103RC, использую TNKernel.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение May 4 2012, 17:36
Сообщение #18


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

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



А попробуйте запретить прерывания перед сбросом.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
kosyak©
сообщение May 4 2012, 17:59
Сообщение #19


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

Группа: Свой
Сообщений: 179
Регистрация: 1-10-07
Из: НЧ
Пользователь №: 30 966



Пробовал - ничего не изменилось. sad.gif
Go to the top of the page
 
+Quote Post
_Артём_
сообщение May 4 2012, 18:09
Сообщение #20


Гуру
******

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



Цитата(kosyak© @ May 4 2012, 20:59) *
Пробовал - ничего не изменилось. sad.gif

Программу не покажете?
А то у меня попасть в fault не получается больше. А хотелось бы воспроизвести.
Go to the top of the page
 
+Quote Post
kosyak©
сообщение May 4 2012, 18:25
Сообщение #21


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

Группа: Свой
Сообщений: 179
Регистрация: 1-10-07
Из: НЧ
Пользователь №: 30 966



Боюсь что в коде там нет ничего необычного. И HardFault у меня тоже не постоянный - то есть то нет. Завтра попытаюсь как нибудь локализовать проблему.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение May 4 2012, 18:29
Сообщение #22


Гуру
******

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



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

Да это понятно что ничего необычного.
Просто у меня возникать перестал, и нет варианта когда он хоть иногда возникает - хотелось бы сравнить и понять разницу.
Go to the top of the page
 
+Quote Post
Cosmojam
сообщение May 4 2012, 18:40
Сообщение #23


Местный
***

Группа: Свой
Сообщений: 311
Регистрация: 12-01-11
Из: Калининград (Koenigsberg)
Пользователь №: 62 182



Программный сброс можно от вотчдога сделать и не мучиться так


--------------------
typedef enum { no, yes, maybe } bool; | блог тут
Go to the top of the page
 
+Quote Post
_Артём_
сообщение May 4 2012, 19:22
Сообщение #24


Гуру
******

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



Цитата(Cosmojam @ May 4 2012, 21:40) *
Программный сброс можно от вотчдога сделать и не мучиться так

Где ж тут мучения? Если ядро имеет такую функцию, то тогда вочдог использовать - это мучение.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st August 2025 - 13:17
Рейтинг@Mail.ru


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