нет, надо соединится с МК, дальше даже можно просто отсоединится.
и до передергивания питания МК правильно отдает заветный код.
ой
или я не понял, или ты чего то не то написал.
нет, надо соединится с МК, дальше даже можно просто отсоединится.
и до передергивания питания МК правильно отдает заветный код.
ой
или я не понял, или ты чего то не то написал.
по какому интерфейсу/протоколу? Как бы для дебага USB вообще не обязателен
по SWD
так я вроде просто повторил то, что пишет @BOOM
так, вроде, он про
и не говорил.
Да вы тут кучу всего написали.
Вот про то, что достаточно компорт открыть, чтобы ID_CODE начал читаться:
а продолжение еще круче
Вообще на мой недолгий взгляд ситуация выглядит так, будто в дебаг моде соответствующая область памяти отображается на системные адреса, а в пользовательском ее отремапить забыли…
мой итог такой:
этот чип отдает правильный DEVICE_ID только после того как к ниму прицепились программатором, можно прошить, можно дебажить, можно просто сразу отцепится от чипа.
вот после это хоть ресет нажимай, хоть на голове стой, DEVICE_ID читается.
стоит передернуть питание чипа, все! DEVICE_ID = 0.
о чем собственно в еррате написано.
дальше пошли фантазии как МК перевести в режим отладки из прошивки , используя SWD/JTAG интерфейсы, ибо других способов я не знаю)
по научному
да, похоже так!
Это все не объясняет, почему дебаг при одних типах подключения активируется, а при других нет
дебаг режим активируется, если на пинах интерфейса SWD/JTAG есть шевеление, дальше обмен командами по протоколу.
какие еще другие типы подключения?
Судя по тому, что просто при выводе в VCP получить ID_CODE тоже возможно, то получается “шевеление” не только на SWD/JTAG, но и UART?
Ну не, uart’ов может быть много, и многие uart активизируются только при altarnate function > 0
И я ж выше давал цитаты из ДШ, debug mode именно и нужен, чтоб отладку делать исключительно через jtag swd. Если чип голый, никакую отладку через uart Ну никак не запустить и пошаговую отладку тоже.
Решил здесь вопрос разместить, туплю или че го то не понимаю.
Итак, есть STM32H743, STM32CubeIDE, пилю QuadSPI для флэш памяти W25Q64, кусок кода - тестирование записи и чтения сектора.
constexpr unsigned int testSector = qw25countAllSectors - 1863;
unsigned char tempBuf[qw25sectorSize];
for(unsigned int i = 0; i < qw25sectorSize; ++i) tempBuf[i] = i;
unsigned int * bD = (unsigned int *)&tempBuf[0];
printf("bD %08X\r\n", (unsigned int)(*(bD+687)));
w25QSPIwriteSector(testSector, (unsigned char *)&tempBuf[0]);
for(unsigned int i = 0; i < qw25sectorSize; ++i) tempBuf[i] = 0x00;
//unsigned int i = 5;//qw25sectorSize;
w25QSPIreadSector(testSector, (unsigned char *)&tempBuf[0]);
printf("In %08X\r\n", (unsigned int)(*bD));
printf("2n %08X\r\n", (unsigned int)(*(bD+1)));
printf("3n %08X\r\n", (unsigned int)(*(bD+687)));
printf("4n %08X\r\n", (unsigned int)(*(bD+3)));
//for(unsigned int i = 0; i < qw25sectorSize; ++i) tempBuf[i] = 0x00;
//unsigned int i = qw25sectorSize;
w25QSPIreadSector(testSector, (unsigned char *)&tempBuf[0]);
printf("In %08X\r\n", (unsigned int)(*bD));
printf("2n %08X\r\n", (unsigned int)(*(bD+1)));
printf("3n %08X\r\n", (unsigned int)(*(bD+687)));
printf("4n %08X\r\n", (unsigned int)(*(bD+3)));
есть три закомментированные строки, если расскомментировать любую из них, или все → полностью ломается чтение сектора, причем где то / как то на аппаратном уровне.
вот так нормально читается:
Как объявление переменной в коде в принципе может ломать функционал?
выравнивание сбивается?
(исключительно в порядке бреда)
Так же исключительно в порядке бреда(знаний то нету) использовать не unsigned int , а конкретный тип uint16/32_t
Пробовал разные типы, ничего не меняется.
Про выравнивание была мысль ![]()
А наверное же есть у компилятора общая настройка выравнивать все переменные?
а
++i
в циклах, это че за извращения?