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

 
 
> Как отличить Сброс МК от включения?, Микроконтроллер STM32F100C
_Алекс
сообщение Apr 30 2013, 18:09
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 14-09-06
Пользователь №: 20 377



Есть сторожевой таймер, который при зависании МК сбрасывает его (ресетит). Можно ли отличить сброс МК от сторожевого таймера, от просто включения – подачи питания на схему?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 7)
gte
сообщение Apr 30 2013, 18:33
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 318
Регистрация: 13-02-05
Из: Липецкая область
Пользователь №: 2 613



Цитата(_Алекс @ Apr 30 2013, 21:09) *
Есть сторожевой таймер, который при зависании МК сбрасывает его (ресетит). Можно ли отличить сброс МК от сторожевого таймера, от просто включения – подачи питания на схему?

Посадите на один вход RC цепочку с диодом на питание. При старте анализируйте состояние этого входа.
Go to the top of the page
 
+Quote Post
ARV
сообщение Apr 30 2013, 18:39
Сообщение #3


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

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



большинство современных МК позволяют узнать источник сброса путем чтения специального регистра. например, для AVR эта информация хранится в регистре MCUSR - есть отдельные биты для сброса при включении питания, для сброса от WDT и т.п.

читайте документацию


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Apr 30 2013, 18:43
Сообщение #4


Гуру
******

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



Цитата(_Алекс @ Apr 30 2013, 21:09) *
Есть сторожевой таймер, который при зависании МК сбрасывает его (ресетит). Можно ли отличить сброс МК от сторожевого таймера, от просто включения – подачи питания на схему?

Читайте соответствующий регистр статуса.
Для STM32101 это был регистр RCC_CSR с флагами PINRSTF, PORRSTF и т.п.
Go to the top of the page
 
+Quote Post
iosifk
сообщение Apr 30 2013, 18:45
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(_Алекс @ Apr 30 2013, 22:09) *
Есть сторожевой таймер, который при зависании МК сбрасывает его (ресетит). Можно ли отличить сброс МК от сторожевого таймера, от просто включения – подачи питания на схему?

Самый тупой вариант: При вклдючении в памяти записаны либо нули, либо хаос. По включению пройдет "холодный сброс", эта память читается и если там хаос, то туда, в определенную область памяти пишется контрольная информация..


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
toweroff
сообщение May 1 2013, 06:08
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(iosifk @ Apr 30 2013, 22:45) *
Самый тупой вариант: При вклдючении в памяти записаны либо нули, либо хаос. По включению пройдет "холодный сброс", эта память читается и если там хаос, то туда, в определенную область памяти пишется контрольная информация..

хмм... сомнение берет.
После включения - да, согласен. Но, если это просто дернулм Reset, программно область не инициализируется, SRAM же останется в том же состоянии
Go to the top of the page
 
+Quote Post
_Алекс
сообщение May 1 2013, 12:08
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 14-09-06
Пользователь №: 20 377



Сделал так:
CODE
//******************Определяем причину сброса МК начало**********************
/*
RCC_FLAG_PINRST: Произошел внешний сброс.
RCC_FLAG_PORRST: Произошёл сброс от POR/PDR.
RCC_FLAG_SFTRST: Произошёл программный сброс.
RCC_FLAG_IWDGRST: Сброс от независимого сторожевого таймера.
RCC_FLAG_WWDGRST: Сброс от оконного сторожевого таймера.
RCC_FLAG_LPWRRST: Сброс при пониженном питании.
*/

if (RCC_GetFlagStatus(RCC_FLAG_SFTRST)){
strncpy (buferRCCresetStatus, "Software reset", 18);
}
else
if (RCC_GetFlagStatus(RCC_FLAG_PORRST)){
strncpy (buferRCCresetStatus, "Power ON/OFF reset", 18);
}
else
if (RCC_GetFlagStatus(RCC_FLAG_PINRST)){
strncpy (buferRCCresetStatus, "Pin reset", 18);
}
else
if (RCC_GetFlagStatus(RCC_FLAG_IWDGRST)){
strncpy (buferRCCresetStatus, "IndWatchdog reset", 18);
}
else
if (RCC_GetFlagStatus(RCC_FLAG_WWDGRST)){
strncpy (buferRCCresetStatus, "WinWatchdog reset", 18);
}
else
if (RCC_GetFlagStatus(RCC_FLAG_LPWRRST)){
strncpy (buferRCCresetStatus, "LowPower reset", 18);
}
else strncpy (buferRCCresetStatus, "?reset", 18);

RCC_ClearFlag();
//******************Определяем причину сброса МК конец**********************
Go to the top of the page
 
+Quote Post
_Артём_
сообщение May 1 2013, 12:30
Сообщение #8


Гуру
******

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



Цитата(_Алекс @ May 1 2013, 15:08) *
Сделал так:
CODE
//******************Определяем причину сброса МК начало**********************
/*
RCC_FLAG_PINRST: Произошел внешний сброс.
RCC_FLAG_PORRST: Произошёл сброс от POR/PDR.
RCC_FLAG_SFTRST: Произошёл программный сброс.
RCC_FLAG_IWDGRST: Сброс от независимого сторожевого таймера.
RCC_FLAG_WWDGRST: Сброс от оконного сторожевого таймера.
RCC_FLAG_LPWRRST: Сброс при пониженном питании.
*/

if (RCC_GetFlagStatus(RCC_FLAG_SFTRST)){
strncpy (buferRCCresetStatus, "Software reset", 18);
}
else
i

RCC_ClearFlag();
//******************Определяем причину сброса МК конец**********************

Нормально в общем. Только не учитывается случай, если установленно несколько флагов сброса одновременно.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 06:13
Рейтинг@Mail.ru


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