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

верно.
чет я не узнаю тебя, давно бы попробовал…

Да что пробовать то? На ПК данные отправлять? Оно работает, я уже пробовал. ))
Не работает БЕЗ ПК…

пипец…
хорошо другой подход, читаем ID и пишем его в еепром (у тя эмуляция флеш) без подключения к компу
потом цепляем программатор и смотрим, что там записалось.
это я на L0 ща могу проверить

это бред!
если на уарт подцепить RX TX и землю, это есть подключение к ПК?

Бред - не бред, я не знаю.
Но факт есть факт - на дисплее я вижу НОЛЬ.
Регистр описывается в разделе Debug, debug без подключения к ПК не возможен (на сколько я понимаю).

Регистр находится во внешней области памяти:

По-моему всё логично. Разве нет?

что логично?

вообщем проверил, все работает на L0
код

	uint32_t ID = HAL_GetDEVID();

	// пишем в  DATA_EEPROM_BASE  0x08080000UL;
	writeEEPROMBuf(0, &ID, 4);

	while(1);

прошиваем, цепляемся программатором и обнуляем еепром

снимаем питание с чипа (программатор подцеплен тока CLK DI Земля)
отключаем программатор, подаем питание на чип, снимаем питание с чипа, обратно цепляем программатор, даем питание и читаем еепром

еще проще, прочитай ID и если он не нулевой зажги светодиод на плате, иначе потуши))

Морзе!

1 лайк

чтобы опять не потерли спросим так…

@ua6em пожалуйста объясни, что ты имел ввиду под словосочетанием
“создать тип данных - ID” ?
опираясь на это

твои слова, опять не относятся к теме обсуждения и являются оффтопом.

с чевойта, да это не куб, это arduino IDE

uint32_t uid_32bit[3];

void setup() {
  Serial.begin(115200);
  delay(3000);

  Serial.println("STM32F103C8T6 Unique ID:");

  // Чтение Unique ID из системной памяти
  uint32_t *uid_ptr = (uint32_t *)0x1FFFF7E8;

  Serial.print("UID: ");
  for (int i = 0; i < 3; i++) {
    Serial.print(uid_ptr[i], HEX);
    uid_32bit[i] = uid_ptr[i];
     if (i < 2) Serial.print("-");
  }
  Serial.println();
}

void loop() {
  delay(5000);
   Serial.print("UID: ");
  for (int i = 0; i < 3; i++) {
  Serial.print(uid_32bit[i], HEX);
  if (i < 2) Serial.print("-");
  }
   Serial.println();
}




Ну и вывод в порт

14:47:37.135 -> STM32F103C8T6 Unique ID:
14:47:37.136 -> UID: 1A5A5BB5-0-1EF3698
14:47:42.142 -> UID: 1A5A5BB5-0-1EF3698
14:47:47.131 -> UID: 1A5A5BB5-0-1EF3698
14:47:52.125 -> UID: 1A5A5BB5-0-1EF3698
14:47:57.146 -> UID: 1A5A5BB5-0-1EF3698
14:48:02.150 -> UID: 1A5A5BB5-0-1EF3698
14:48:07.142 -> UID: 1A5A5BB5-0-1EF3698
14:48:12.1

Это к Петровичу, он объяснял тут уже, я умею

тавойта
вот скажи мне ты …
притворяешься?

UID от DeviceID не можешь отличить?

ну и кто после этого оффтопщик и на кого надо кляузы админам кидать?
вообщем опять “блеснул”.

а какая разница что из регистров вытаскивать, что сохранять, я показал принцип - дал удочку, если в даташите кто-то не видит адрес регистра, ну лови, как сохранять смотри выше:

void setup() {
  Serial.begin(115200);
  delay(3000);
  
  // Чтение Device ID
  uint16_t deviceID = *(volatile uint16_t*)0xE0042000;
  
  // Чтение Flash Size
  uint16_t flashSize = *(volatile uint16_t*)0x1FFFF7E0;
  
  // Чтение Unique ID
  uint32_t uniqueID1 = *(volatile uint32_t*)0x1FFFF7E8;
  uint32_t uniqueID2 = *(volatile uint32_t*)0x1FFFF7EC;
  uint32_t uniqueID3 = *(volatile uint32_t*)0x1FFFF7F0;
  
  Serial.println("=== STM32F103C8T6 Information ===");
  Serial.print("Device ID: 0x");
  Serial.println(deviceID, HEX);
  
  Serial.print("Flash Size: ");
  Serial.print(flashSize);
  Serial.println(" KB (отображается)");
  
  Serial.print("Actual Flash: 128 KB"); // Физический размер
  Serial.println();
  
  Serial.print("Unique ID: ");
  Serial.print(uniqueID1, HEX);
  Serial.print("-");
  Serial.print(uniqueID2, HEX);
  Serial.print("-");
  Serial.println(uniqueID3, HEX);
  
  if (deviceID == 0x410) {
    Serial.println("✓ Устройство подтверждено: STM32F103C8T6");
  }
}

void loop() {
  delay(1000);
}

Код 100500 рабочий, это жеж АРДУИНО IDE:

15:52:16.197 -> === STM32F103C8T6 Information ===
15:52:16.197 -> Device ID: 0x410
15:52:16.197 -> Flash Size: 128 KB (отображается)
15:52:16.197 -> Actual Flash: 128 KB
15:52:16.197 -> Unique ID: 1A5A5BB5-0-1EF3698
15:52:16.197 -> ✓ Устройство подтверждено: STM32F103C8T6

PS @BOOM тут как-то заикался, что чипы оригинальные, как узнал не сказал, вот простейший код в ARDUINO IDE для проверки, а если нужно точно знать то перешивайте в ранее названное мной устройство в теме про PUYA:

void determineChipType() {
  uint16_t flashSize = *(volatile uint16_t*)0x1FFFF7E0;
  uint32_t stm32Id = *(volatile uint32_t*)0xE0042000;
  
  Serial.println("Результаты определения:");
  Serial.print("Flash Size: ");
  Serial.println(flashSize);
  Serial.print("STM32 ID Register: 0x");
  Serial.println(stm32Id, HEX);
  
  if (stm32Id == 0x20030410 || (stm32Id & 0xFFF) == 0x410) {
    Serial.println("✅ Настоящий STM32F103");
  } 
  else if (stm32Id == 0x0) {
    Serial.println("🔄 Вероятно CH32F103 или GD32F103 (клон)");
    Serial.println("Характеристики совместимы с STM32F103C8T6");
    Serial.println("Программы будут работать, но ID недоступен");
  }
  else {
    Serial.println("❓ Неизвестный тип чипа");
  }
}

void setup() {
  Serial.begin(115200);
  delay(2000);
  determineChipType();
}

void loop() {
  digitalWrite(PC13, !digitalRead(PC13));
  delay(300);
}

странно все это, не верю.

Постараюсь в ближайшие дни достать стенд, но только stm32f411 (f103 лень собирать), выведу ID на дисплей, без подключения к компу, только питание на МК.

ты же давно в теме, этого не может быть потому, что не может быть никогда

16:55:58.866 -> === STM32F401 Information ===
16:55:58.866 -> Device ID: 0x433
16:55:58.866 -> Revision: 0x1001
16:55:58.866 -> Flash Size: 512 KB
16:55:58.866 -> Unique ID: 2a0055-34385109-36323530
16:55:58.866 -> Is F401: No

достал из кладовки БЛЮПИЛЛ, воспроизвел проблему описанную @BOOM!

заливаешь, все читается, даже ресетишь все читается, но стоит передернуть питание и хана НУЛИ!

стоит опять программатором приконектится и отконектится, все опять показывает до передергивания питания.

так что я теперь верю!

1 лайк

нашел!!

особенности конструкции оказывается))

/**
  * @brief  Returns the device identifier.
  * Note: On devices STM32F10xx8 and STM32F10xxB,
  *                  STM32F101xC/D/E and STM32F103xC/D/E,
  *                  STM32F101xF/G and STM32F103xF/G
  *                  STM32F10xx4 and STM32F10xx6
  *       Debug registers DBGMCU_IDCODE and DBGMCU_CR are accessible only in
  *       debug mode (not accessible by the user software in normal mode).
  *       Refer to errata sheet of these devices for more details.
  * @retval Device identifier
  */
uint32_t HAL_GetDEVID(void)
{
  return ((DBGMCU->IDCODE) & IDCODE_DEVID_MASK);
}

1 лайк

Ну а как же тогда написать софт, чтоб в обычном режиме это все читалось :thinking:

И например отправлялось на сервер для идентификации устройства, займусь как нибудь провентилирую тему…

в смысле?
никак!

в еррате написано же, что это баг.

как ты всегда пишешь, напрямую, вроде на HAL ты забил?

19:08:25.540 -> Расширенный поиск Device ID 0x410...
19:08:25.540 -> ===================================
19:08:25.540 -> Адрес 0xE0042000: 32bit=0x20030410 16bit=0x410 <- НАЙДЕН 0x410!
19:08:25.540 -> Адрес 0x1FFFF7E8: 32bit=0x1A5A5BB5 16bit=0x5BB5
19:08:25.540 -> Адрес 0x1FFFF7E0: 32bit=0x80 16bit=0x80
19:08:25.540 -> Адрес 0x40015800: 32bit=0x0 16bit=0x0
19:08:25.540 -> Адрес 0xE00FF000: 32bit=0xFFF0F003 16bit=0xF003
19:08:25.540 -> Адрес 0x1FFFF000: 32bit=0xD0542803 16bit=0x2803
19:08:25.540 -> Адрес 0xE0042004: 32bit=0x107 16bit=0x107
19:08:25.540 -> Адрес 0xE0042008: 32bit=0x1800 16bit=0x1800
19:08:25.540 -> Адрес 0x1FFFF7F0: 32bit=0x1EF3698 16bit=0x3698
19:08:25.540 -> Адрес 0x1FFFF7F8: 32bit=0x0 16bit=0x0

Для идентификации устройства тебе нужен как раз UID, код как взять 96 бит выше

Я тут малышку прикупил, поиграться, типа STM32F103C8T6 (по маркировке, из UID видно что врут) платка 22 на 25 миллиметров, шить через UART который на борту:

19:34:53.075 -> Диагностика микроконтроллера
19:34:53.075 -> ===========================
19:34:53.075 -> Flash Size: 64 KB
19:34:53.075 -> Unique ID: 66CFF50-55578748-87233027
19:34:53.075 -> Поиск Device ID по разным адресам:
19:34:53.075 -> 0xE0042000: 0x0
19:34:53.116 -> 0x1FFFF7E0: 0xFFFF0040
19:34:53.180 -> 0x1FFFF7E8: 0x66CFF50

Подскажите пожалуйста что не правильно.