Влияние загрузчиков

Вообще-м, использую arduino 2.2.1, если скетч загружать через stlink, код работает корректно, передача по onewire.h идет, но если загружать скетч через bootloader(maple dfu bootloader 2.0) передача не идет, скетч точно загрузился в компорте появл “start” см.скетч, что это может быть? Очень хочется иметь для отладки компорт.

#include <OneWire.h>
#define pin PA12
OneWire ds(pin); // пин протокола

byte addr1[8] = {0x22, 0xFF, 0x5E, 0x10, 0x00, 0x00, 0x80, 0x5A}; // адрес слейва
byte addr2[8] = {0x22, 0xFF, 0x5E, 0x10, 0x00, 0x00, 0x80, 0x3A};
byte slave[8]; // сравниваем адреса из эфира
bool flag_send1 = false;
bool flag_send2 = false;
uint32_t numberToSend1 = 121314; 
uint32_t numberToSend2 = 909090; 

void setup() {
  Serial.begin(9600);
  Serial.println("Start");
  ds.reset_search();
}

void sendNumber(byte addr[8], uint32_t number) {
  ds.select(addr); // выбираем адрес слейва
  
  byte bytesToSend[4]; // сдвигаем побайтово число
  bytesToSend[0] = number & 0xFF;        
  bytesToSend[1] = (number >> 8) & 0xFF;
  bytesToSend[2] = (number >> 16) & 0xFF;
  bytesToSend[3] = (number >> 24) & 0xFF; 

  for (int i = 0; i < sizeof(bytesToSend); i++) {
    ds.write(bytesToSend[i]); // отправляем каждый байт числа
  }
  delay(300);
}

void loop() {
  Serial.println("Start");
  if (!ds.search(slave)) { // ищем в эфире адрес и записываем в массив для сравнивания адресов, если нет в эфире возвр - false
    ds.reset_search(); // ресетим поиск и начинаем поиск с 1 устройства
    delay(250);
    return; // возвращаемся к началу
  }
  
  ds.reset(); // ресетим шину протокола, чтобы багов не было, фиг знает зачем в доки написано =)

  if (memcmp(addr1, slave, 8) == 0) { // сравниваем два байтовых массива адресов, если адрес совпал отправляем значение
    sendNumber(addr1, numberToSend1);
  //  flag_send1 = true;
  // } else if (memcmp(addr2, slave, 8) == 0) {
  //   sendNumber(addr2, numberToSend2);
  //   flag_send2 = true;
   }
}

Вывод Serial не привёл.
Там один раз «Start» или два?

Как проявляется неисправность?

Там бесконечное множество, в лупе он тоже есть, сейчас исправлю и скажу сколько пишется в сетапе

Осциллографом смотрел? Точно «ногодрыга» нет?
Давай схему. Может ты на одни и теже лапы подключил…

Если программировать через Стлинк то передача на слейв идёт, слейв видит его сообщения. Если программировать через бутлоадер передачи нет, но он точно сует туда код…

у меня твой скетч работает, может у тебя клон STM32?


start_setup не написал при загрузки с бутлоадера, пишет сразу луп

#include <OneWire.h>
#define pin PA12
OneWire ds(pin); // пин протокола

byte addr1[8] = {0x22, 0xFF, 0x5E, 0x10, 0x00, 0x00, 0x80, 0x5A}; // адрес слейва
byte addr2[8] = {0x22, 0xFF, 0x5E, 0x10, 0x00, 0x00, 0x80, 0x3A};
byte slave[8]; // сравниваем адреса из эфира
bool flag_send1 = false;
bool flag_send2 = false;
uint32_t numberToSend1 = 121314; 
uint32_t numberToSend2 = 909090; 

void setup() {
  Serial.begin(9600);
  Serial.println("Start_SETUP");
  ds.reset_search();
}

void sendNumber(byte addr[8], uint32_t number) {
  ds.select(addr); // выбираем адрес слейва
  
  byte bytesToSend[4]; // сдвигаем побайтово число
  bytesToSend[0] = number & 0xFF;        
  bytesToSend[1] = (number >> 8) & 0xFF;
  bytesToSend[2] = (number >> 16) & 0xFF;
  bytesToSend[3] = (number >> 24) & 0xFF; 

  for (int i = 0; i < sizeof(bytesToSend); i++) {
    ds.write(bytesToSend[i]); // отправляем каждый байт числа
  }
  delay(300);
}

void loop() {
  Serial.println("Start_LOOP");
  if (!ds.search(slave)) { // ищем в эфире адрес и записываем в массив для сравнивания адресов, если нет в эфире возвр - false
    ds.reset_search(); // ресетим поиск и начинаем поиск с 1 устройства
    delay(250);
    return; // возвращаемся к началу
  }
  
  ds.reset(); // ресетим шину протокола, чтобы багов не было, фиг знает зачем в доки написано =)

  if (memcmp(addr1, slave, 8) == 0) { // сравниваем два байтовых массива адресов, если адрес совпал отправляем значение
    sendNumber(addr1, numberToSend1);
  //  flag_send1 = true;
  // } else if (memcmp(addr2, slave, 8) == 0) {
  //   sendNumber(addr2, numberToSend2);
  //   flag_send2 = true;
   }
}

на чипе stm32f103c8t6, в реальности хз клон или нет, но плата точно не ориг

не парься, поставь delay(5000) в начале setup открой монитор порта и нажми reset

сейчас попробую с другими клонами стм, может реально в ней дело

Если у тебя синяя таблетка и такое в коде:

#define pin PA12
OneWire ds(pin); // пин протокола

То они просто конфликтуют.
На сколько я понял, на PA12 подключен USB как раз (попробуй пин сменить):


Хотя я в stm32 не очень. Только игрался…

еще раз, да и строку в сетапе поменяй, чтобы отличать

10 минут и отправлю результат, стмчку сменю попробую

да синяя таблетка, попробую!

Да сетап пишет, стмку поменял, но передачи нет

Пин поменял на PB6, не идет

Странно…
Но ты же в коде пин сменил и в схеме коммутацию сделал?

сейчас схему нарисую минутку

Перекинь пин на PA4 (он «нейтральный», вроде бы)…