STM32CubeIDE (вопросы и ответы)

нет, надо соединится с МК, дальше даже можно просто отсоединится.
и до передергивания питания МК правильно отдает заветный код.

ой

или я не понял, или ты чего то не то написал.

по какому интерфейсу/протоколу? Как бы для дебага USB вообще не обязателен

по SWD

так я вроде просто повторил то, что пишет @BOOM

так, вроде, он про

и не говорил.

Да вы тут кучу всего написали.
Вот про то, что достаточно компорт открыть, чтобы ID_CODE начал читаться:

а продолжение еще круче

Вообще на мой недолгий взгляд ситуация выглядит так, будто в дебаг моде соответствующая область памяти отображается на системные адреса, а в пользовательском ее отремапить забыли…

1 лайк

мой итог такой:
этот чип отдает правильный DEVICE_ID только после того как к ниму прицепились программатором, можно прошить, можно дебажить, можно просто сразу отцепится от чипа.
вот после это хоть ресет нажимай, хоть на голове стой, DEVICE_ID читается.
стоит передернуть питание чипа, все! DEVICE_ID = 0.
о чем собственно в еррате написано.

дальше пошли фантазии как МК перевести в режим отладки из прошивки , используя SWD/JTAG интерфейсы, ибо других способов я не знаю)

по научному :rofl: да, похоже так!

Это все не объясняет, почему дебаг при одних типах подключения активируется, а при других нет

дебаг режим активируется, если на пинах интерфейса 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)));

есть три закомментированные строки, если расскомментировать любую из них, или все → полностью ломается чтение сектора, причем где то / как то на аппаратном уровне.

вот так нормально читается:

Как объявление переменной в коде в принципе может ломать функционал?

выравнивание сбивается?
(исключительно в порядке бреда)

1 лайк

Так же исключительно в порядке бреда(знаний то нету) использовать не unsigned int , а конкретный тип uint16/32_t

1 лайк

Пробовал разные типы, ничего не меняется.

Про выравнивание была мысль :thinking:

А наверное же есть у компилятора общая настройка выравнивать все переменные?

а

++i

в циклах, это че за извращения?