MementoMori 4 11 декабря, 2020 Опубликовано 11 декабря, 2020 · Жалоба 1 minute ago, aaarrr said: Потому что вы предоставили неверную информацию об идентичном поведении F746 и H743. Что же остается думать? Погодите... Симптомы были идентичны. Под вскрывшейся неидентичностью вы что понимаете? То что F746 отреагировал на пропаивание, а H743 нет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 11 декабря, 2020 Опубликовано 11 декабря, 2020 · Жалоба Just now, MementoMori said: Симптомы были идентичны. И выводы о вине "перегрева". 1 minute ago, MementoMori said: Под вскрывшейся неидентичностью вы что понимаете? То что F746 отреагировал на пропаивание, а H743 нет? Да. F746 и H743 настолько разные, что предположить одинаковое поведение после неспецифичного воздействия в виде перегрева просто невозможно. Остается плата и память, отсюда и первоначальные выводы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 11 декабря, 2020 Опубликовано 11 декабря, 2020 · Жалоба 15 minutes ago, aaarrr said: F746 и H743 настолько разные, что предположить одинаковое поведение после неспецифичного воздействия в виде перегрева просто невозможно. Остается плата и память, отсюда и первоначальные выводы. Всё же я перемонтирую H743 на оставшийся экземпляр платы, предварительно помыв ему ноги. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 11 декабря, 2020 Опубликовано 11 декабря, 2020 · Жалоба Замеры сделайте все же, до и после снятия. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 89 11 декабря, 2020 Опубликовано 11 декабря, 2020 · Жалоба 2 часа назад, MementoMori сказал: P.S. Как думаете, тот факт, что контроллер испытывает емкостное влияние от прикосновения пальца к пластику чипа, означает, что непропай где-то в области питания, блокировочных конденсаторов? Линии sdram пропаяны, это точно - принудительно поданный на них меандр снимается осциллографом с пинов SDRAM/ Я бы проконтролировал осциллографом напряжения питания на выводах контроллера, в моменты сбоев или при касания чипа пальцем, на предмет увеличения звона или снижения напряжения. Если это плата куда упало +12, то по-хорошему стоит заменить конденсаторы, и танталы и керамику. Так-то некорректная работа чипа при касании пальцем допустима, многие чипы например начинают сбоить при засветке мощным светодиодом - просвечиваются ик-излучением. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 11 декабря, 2020 Опубликовано 11 декабря, 2020 · Жалоба 4 hours ago, HardEgor said: Так-то некорректная работа чипа при касании пальцем допустима, многие чипы например начинают сбоить при засветке мощным светодиодом - просвечиваются ик-излучением. Шапочку из фольги надо смастерить))) А вот вам еще загадка. Не хочу отдельную тему создавать. Вот код __STATIC_INLINE void DWT_Delay_us(volatile uint32_t microseconds) { uint32_t clk_cycle_start = DWT->CYCCNT; /* Go to number of cycles for system */ microseconds *= (HAL_RCC_GetHCLKFreq() / 1000000); /* Delay till end */ while ((DWT->CYCCNT - clk_cycle_start) < microseconds); } Если залить отладчиком прошивку и запустить - все работает. Если передернуть питание (то есть отправить в самостоятельное, не контролируемое отладчиком, плавание) - виснет. Опытным путем установлено, что виснет на цикле while. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 89 11 декабря, 2020 Опубликовано 11 декабря, 2020 · Жалоба 1 час назад, MementoMori сказал: Если залить отладчиком прошивку и запустить - все работает. Если передернуть питание (то есть отправить в самостоятельное, не контролируемое отладчиком, плавание) - виснет. Опытным путем установлено, что виснет на цикле while. Отладчик наверное настраивает и запускает счетчик, чтобы отлаживать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 11 декабря, 2020 Опубликовано 11 декабря, 2020 · Жалоба 1 minute ago, HardEgor said: Отладчик наверное настраивает и запускает счетчик, чтобы отлаживать. Там ещё была функция инициализации счётчика, её я тоже вызываю. Хм... Ч о интересно, при запуске через отладчик эта функция сразу же работает, даже если предварительно не инициализиоовать счётчик... Значит проблема в коде инициализации. Спасибо, теперь ясно, где ковыряться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 89 11 декабря, 2020 Опубликовано 11 декабря, 2020 · Жалоба 10 минут назад, MementoMori сказал: Там ещё была функция инициализации счётчика, её я тоже вызываю. Хм... Ч о интересно, при запуске через отладчик эта функция сразу же работает, даже если предварительно не инициализиоовать счётчик... Значит проблема в коде инициализации. Спасибо, теперь ясно, где ковыряться. Так а чего ковырятся - сравнить регистры под отладчиком и с холодного старта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 11 декабря, 2020 Опубликовано 11 декабря, 2020 · Жалоба 18 minutes ago, HardEgor said: Так а чего ковырятся - сравнить регистры под отладчиком и с холодного старта. И понять, почему DWT_Init() не пишет в них нужные значения при холодном старте? Я это и имел в виду Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 12 декабря, 2020 Опубликовано 12 декабря, 2020 · Жалоба 11.12.2020 в 21:42, MementoMori сказал: Хм... Ч о интересно, при запуске через отладчик эта функция сразу же работает, даже если предварительно не инициализиоовать счётчик... Само собой - отладчик включает. Буквально на днях создавал тему про этот счётчик: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 12 декабря, 2020 Опубликовано 12 декабря, 2020 · Жалоба 10 minutes ago, jcxz said: Само собой - отладчик включает. Буквально на днях создавал тему про этот счётчик: Почитал. Вроде как поднятая вами проблема у меня не стоит. Вот функция uint32_t DWT_Delay_Init(void) { /* Disable TRC */ CoreDebug->DEMCR &= ~CoreDebug_DEMCR_TRCENA_Msk; // ~0x01000000; /* Enable TRC */ CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; // 0x01000000; /* Disable clock cycle counter */ DWT->CTRL &= ~DWT_CTRL_CYCCNTENA_Msk; //~0x00000001; /* Enable clock cycle counter */ DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; //0x00000001; /* Reset the clock cycle counter value */ DWT->CYCCNT = 0; /* 3 NO OPERATION instructions */ __ASM volatile ("NOP"); __ASM volatile ("NOP"); __ASM volatile ("NOP"); /* Check if clock cycle counter has started */ if(DWT->CYCCNT) { return 0; /*clock cycle counter started*/ } else { return 1; /*clock cycle counter not started*/ } } В ней упомянутый вами бит перезапускается.... Что не так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 13 декабря, 2020 Опубликовано 13 декабря, 2020 · Жалоба 2 часа назад, MementoMori сказал: Почитал. Вроде как поднятая вами проблема у меня не стоит. Вот функция В ней упомянутый вами бит перезапускается.... У вас при отключении отладчика бит TRCENA не сбрасывается в 0? Какой у вас отладчик/среда_отладки? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 13 декабря, 2020 Опубликовано 13 декабря, 2020 · Жалоба 3 hours ago, jcxz said: У вас при отключении отладчика бит TRCENA не сбрасывается в 0? Какой у вас отладчик/среда_отладки? С отладчиком: Регистр CoreDebug->DEMCR = 0x01000000, регистр DWT->CTRL = 0x40000001 Без отладчика CoreDebug->DEMCR до функции DWT_Delay_Init равен 0x00000000, после 0x01000000 DWT->CTRL до функции DWT_Delay_Init равен 0x00000000, после 0x40000001 У меня китайский ST-Link, среда - Keil. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 13 декабря, 2020 Опубликовано 13 декабря, 2020 · Жалоба В F746 все немного по-другому. Вот как оказывается надо было: DWT->LAR = 0xC5ACCE55; // ВОТ ЭТОГО НЕ ХВАТАЛО /* Disable clock cycle counter */ DWT->CTRL &= ~DWT_CTRL_CYCCNTENA_Msk; //~0x00000001; /* Enable clock cycle counter */ DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; //0x00000001; /* Reset the clock cycle counter value */ DWT->CYCCNT = 0; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться