stm32l051 не реагирует на ресет.

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
AlanDrakes
Прорезались зубы
Сообщения: 236
Зарегистрирован: Пн июл 04, 2016 16:51:22
Откуда: Россия, Омск

Re: stm32l051 не реагирует на ресет.

Сообщение AlanDrakes »

[uquote="Kost286",url="/forum/viewtopic.php?p=4741789#p4741789"]Добавлено after 2 minutes 22 seconds:
AlanDrakes, напряжение при передаче падает до 3,5 вольт всего. Даже без батарейки одних кондёров хватает на 2 передачи[/uquote]
Тогда BOD отпадает. Жаль. Это был хороший вариант. На батарейном питании при низком напряжении (около 2В) (вместо батарей был ЛБП) поведение становилось довольно занятным.

jcxz правильно предложил - уменьшить паузы засыпания и сделать эдакий стресс-тест.
Желательно так же выводить данные в какой-нибудь логгер перед переходом в сон и после пробуждения.

Собирать... ну... пусть будет текущий адрес стэка (ну мало ли!) - он должен совпадать от запуска к запуску; Напряжение батареи прямо перед выключением (мало ли, вдруг просадка всё же случается?), флаги периферии. Что бы ещё?.. Флаги состояния FLASH->SR ?

Подключить к отладчику вряд ли получится - он будет терять соединение при каждом уходе в StandBy, ибо ядро обесточивается. Сам пробовал - довольно неудобно. Отладка превращается в "покури мануал, подумай, что мог сделать неправильно. Исправь, прошей, запусти, читай лог".
К сожалению отладка глубже чем в глубоком сне уже невозможна.


А... Развивая идею логгирования. Есть у меня одна мысль. После очередного включения, когда звёзды сошлись очень неудачно, у чипа может быть недоступна память. Попробуйте в этом случае всё же подключить отладчик БЕЗ броса питания. Если чип появится - смотрите регистры ядра и SCB. В частности - PC, SP, SCB->VTOR и переопределите "Фатальные" ошибки (хотя вылавливать их будет то ещё удовольствие)
Спойлер

Код: Выделить всё

char char_to_hex(char value) {
	if (value > 9)
		return '7' + value;
	return '0' + value;
}
void DumpText(char *text) {
	while(*text) {
		USART3->TDR = *text;
		text++;
		while (!(USART3->ISR & USART_ISR_TC)) {};
	}
}
void DumpHexDWord(uint32_t Data) {
	char txt[9];
	txt[0] = char_to_hex((Data >> 28) & 0x0F);
	txt[1] = char_to_hex((Data >> 24) & 0x0F);
	txt[2] = char_to_hex((Data >> 20) & 0x0F);
	txt[3] = char_to_hex((Data >> 16) & 0x0F);
	txt[4] = char_to_hex((Data >> 12) & 0x0F);
	txt[5] = char_to_hex((Data >> 8) & 0x0F);
	txt[6] = char_to_hex((Data >> 4) & 0x0F);
	txt[7] = char_to_hex((Data) & 0x0F);
	txt[8] = 0;
	DumpText(txt);
}
void BusFault_Handler_c(unsigned int * hardfault_args) {
	unsigned int stacked_r0;
	unsigned int stacked_r1;
	unsigned int stacked_r2;
	unsigned int stacked_r3;
	unsigned int stacked_r12;
	unsigned int stacked_lr;
	unsigned int stacked_pc;
	unsigned int stacked_psr;

	stacked_r0 = ((unsigned long) hardfault_args[0]);
	stacked_r1 = ((unsigned long) hardfault_args[1]);
	stacked_r2 = ((unsigned long) hardfault_args[2]);
	stacked_r3 = ((unsigned long) hardfault_args[3]);

	stacked_r12 = ((unsigned long) hardfault_args[4]);
	stacked_lr = ((unsigned long) hardfault_args[5]);
	stacked_pc = ((unsigned long) hardfault_args[6]);
	stacked_psr = ((unsigned long) hardfault_args[7]);

	DumpText ("\r\n[Bus fault handler - all numbers in hex]\r\n");
	DumpText ("R0 = ");
	DumpHexDWord(stacked_r0);
	DumpText ("\r\nR1 = ");
	DumpHexDWord(stacked_r1);
	DumpText ("\r\nR2 = ");
	DumpHexDWord(stacked_r2);
	DumpText ("\r\nR3 = ");
	DumpHexDWord(stacked_r3);
	DumpText ("\r\nR12 = ");
	DumpHexDWord(stacked_r12);
	DumpText ("\r\nLR [R14] (subroutine call return address) = ");
	DumpHexDWord(stacked_lr);
	DumpText ("\r\nPC [R15] (program counter) = ");
	DumpHexDWord(stacked_pc);
	DumpText ("\r\nPSR = ");
	DumpHexDWord(stacked_psr);
//	DumpText ("\r\nBFAR = ");
//	DumpHexDWord((*((volatile unsigned long *)(0xE000ED38))));
//	DumpText ("\r\nCFSR = ");
//	DumpHexDWord((*((volatile unsigned long *)(0xE000ED28))));
//	DumpText ("\r\nHFSR = ");
//	DumpHexDWord((*((volatile unsigned long *)(0xE000ED2C))));
//	DumpText ("\r\nDFSR = ");
//	DumpHexDWord((*((volatile unsigned long *)(0xE000ED30))));
//	DumpText ("\r\nAFSR = ");
//	DumpHexDWord((*((volatile unsigned long *)(0xE000ED3C))));
	DumpText ("\r\nSCB_SHCSR = ");
	DumpHexDWord(SCB->SHCSR);
	DumpText("\r\n");
	while (1) { };
}

void HardFault_Handler(void) {
	console_put("SHIT! - HardFault\r\n");
	while(1) {}
}
void MemManage_Handler(void) {
	console_put("SHIT! - MemManageFault\r\n");
	while(1) {}
}
void UsageFault_Handler(void) {
	console_put("SHIT! - UsageFault\r\n");
	while(1) {}
}

Последний раз редактировалось AlanDrakes Ср авг 27, 2025 09:43:55, всего редактировалось 1 раз.
Kost286
Родился
Сообщения: 10
Зарегистрирован: Пт окт 23, 2015 18:25:40

Re: stm32l051 не реагирует на ресет.

Сообщение Kost286 »

Nranddek, ну сбрасывается же в майне, я же писал.

Добавлено after 2 minutes 49 seconds:
AlanDrakes, Кстати, да. Kost286, а какой диапазон напряжения у прибора?

Если подключать батарейку с разряженными конденсаторами, то передачи сразу нет, из-за относительно медленной зарядки конденсаторов и в этот момент контроллер даёт прерывание PVR. Оттуда он засыпает снова, на большее время. И при этом РЕСЕТ как положено работает. Вообще есть мнение что возможно тактовый генератор LSI останавливается.
Nranddek
Вымогатель припоя
Сообщения: 598
Зарегистрирован: Сб авг 09, 2025 22:08:28

Re: stm32l051 не реагирует на ресет.

Сообщение Nranddek »

да, верно. Это я ступил.
Аватара пользователя
AlanDrakes
Прорезались зубы
Сообщения: 236
Зарегистрирован: Пн июл 04, 2016 16:51:22
Откуда: Россия, Омск

Re: stm32l051 не реагирует на ресет.

Сообщение AlanDrakes »

[uquote="Kost286",url="/forum/viewtopic.php?p=4741797#p4741797"]Добавлено after 2 minutes 49 seconds:
AlanDrakes, Кстати, да. Kost286, а какой диапазон напряжения у прибора?[/uquote]
В моём случае запросили сделать "мигалку", имитирующую наличие записывающей камеры - банально вспыхивать каждые N секунд на M секунд (от 0.05с до 8с сделал... кажется).
Питается это от пары элементов размера C ( https://upload.wikimedia.org/wikipedia/ ... riaR14.jpg ) на 1.5В и разряжает их до почти 0.8В на элемент (сохраняет работоспособность до 1.6~1.7В).

И, предвосхищая вопрос, нет. На низковольтной NE555 сделать было раза в два дороже. И сложнее. А тут и индикация разряда (по нажатию кнопки "проверка") и изменение настроек (при нажатии кнопки "Применить!"). До этого контрллер включается, измеряет положение движков потенциометров, запоминает его, настраивает таймеры и уходит в глубокий сон, время от времени моргая... за счёт аппаратного таймера.
Если батарея садится - включает "бустер" на ICL7660, поднимая напряжение для светодиода.
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: stm32l051 не реагирует на ресет.

Сообщение jcxz »

[uquote="Kost286",url="/forum/viewtopic.php?p=4741789#p4741789"]jcxz, приёчем здесь доублы и прочее? Вопрос же не в том как лучше в коде сделать, а почему из сна не выходит и можно ли узнать почему и можно ли исправить.[/uquote]К тому что весь код написан очень грязно. И нет того, что делается при корректном входе/выходе в сон: запрета всех ненужных прерываний, отключение неиспользуемой во сне периферии, установки пинов в состояние "для сна", контроля и установки регистров тактирования и питания для состояния сна и т.п. От вашего кода можно ожидать чего угодно. Что и происходит.

Добавлено after 1 minute 41 second:
[uquote="Kost286",url="/forum/viewtopic.php?p=4741797#p4741797"]Вообще есть мнение что возможно тактовый генератор LSI останавливается.[/uquote]Вы всё время ищете проблему не у себя, а где-то на стороне. Так результата не будет.
Kost286
Родился
Сообщения: 10
Зарегистрирован: Пт окт 23, 2015 18:25:40

Re: stm32l051 не реагирует на ресет.

Сообщение Kost286 »

jcxz, понятно, везде попадаются такие советчики лишь бы написать что-то негативное, но не по делу.
Nranddek
Вымогатель припоя
Сообщения: 598
Зарегистрирован: Сб авг 09, 2025 22:08:28

Re: stm32l051 не реагирует на ресет.

Сообщение Nranddek »

Странная реакция... То есть, критика, если она отрицательная, нахер ненужна, даже если может оказаться решением проблемы? :)
А если так: Ваш код идеален, проблема в микроконтроллере, аппаратная, нужно все их поменять.
Так лучше стало?
Kost286
Родился
Сообщения: 10
Зарегистрирован: Пт окт 23, 2015 18:25:40

Re: stm32l051 не реагирует на ресет.

Сообщение Kost286 »

спасибо AlanDrakes за конструктивную помощь, и Nranddek попытками вникнуть.
Ответить

Вернуться в «ARM»