Обновление OTA - плата sodaq (совместимая с arduino M0)
Я пытаюсь выполнить обновление прошивки с SD-карты на плате Sodaq Sara AFF. Если я использую библиотеку SDU.h в своем скетче, она не проходит проверку платы. Смотрите эту ссылку.
Я отредактировал SDU.cpp сам принудительно выбираю ARDUINO_SAM_ZERO
. Теперь это :
__attribute__ ((section(".sketch_boot")))
unsigned char sduBoot[0x6000] = {
#include "boot/mzero.h"
};
Я увеличил размер до 6000, иначе он жаловался слишком много инициализаторов
.
Я также изменил SD_SS_PIN , чтобы он соответствовал pin на SDUboot.ino
в разделе дополнительно
. После этого я перекомпилировал его с build.sh
в той же папке.
Но я не могу выполнить обновление прошивки. После включения питания платы (исходный код: пример blink, целевое обновление: blink с более высокой скоростью) - оригинальная прошивка остается.
Я экспортировал прошивку с помощью arduino IDE -> export compiled bynary и протестировал обе версии с загрузчиком и без него.
Любая помощь будет оценена по достоинству.
@Sean, 👍1
Обсуждение1 ответ
РЕШЕНО!
Я собрал свой собственный SDUBoot.ino с фиксированным SDU_START 0x2000
и для SODAQ Sara (boot/sodaq_sara.h
). Мой скетч с #include "SDU.h"
успешно компилируется. Пакет платы также установлен в Arduino (http://downloads.sodaq.net/package_sodaq_samd_index.json). Вот мой код с изменениями (база SodaqCore-samd-1.8.6-sodaq от Github):
Библиотеки файлов/SDU/extras/SDUBoot/SDUBoot.ino
:
#include <SD.h>
#include <FlashStorage.h>
#define SDU_START 0x2000
#define SDU_SIZE 0x4000
#define SKETCH_START (uint32_t*)(SDU_START + SDU_SIZE)
#ifndef SDCARD_SS_PIN
#define SDCARD_SS_PIN 10
#endif
#define UPDATE_FILE "UPDATE.BIN"
FlashClass flash;
// Initialize C library
extern "C" void __libc_init_array(void);
int main() {
init();
__libc_init_array();
delay(1);
if (SD.begin(SDCARD_SS_PIN) && SD.exists(UPDATE_FILE)) {
File updateFile = SD.open(UPDATE_FILE);
uint32_t updateSize = updateFile.size();
bool updateFlashed = false;
if (updateSize > SDU_SIZE) {
// пропустить раздел SDU
updateFile.seek(SDU_SIZE);
updateSize -= SDU_SIZE;
uint32_t flashAddress = (uint32_t)SKETCH_START;
// стереть страницы
flash.erase((void*)flashAddress, updateSize);
uint8_t buffer[512];
// писать страницы
for (uint32_t i = 0; i < updateSize; i += sizeof(buffer)) {
updateFile.read(buffer, sizeof(buffer));
flash.write((void*)flashAddress, buffer, sizeof(buffer));
flashAddress += sizeof(buffer);
}
updateFlashed = true;
}
updateFile.close();
if (updateFlashed) {
SD.remove(UPDATE_FILE);
}
}
// переход к скетчу
__set_MSP(*SKETCH_START);
//Сброс адреса векторной таблицы
SCB->VTOR = ((uint32_t)(SKETCH_START) & SCB_VTOR_TBLOFF_Msk);
// адрес Reset_Handler записывается компоновщиком в начале раздела .text (см. сценарий компоновщика)
uint32_t resetHandlerAddress = (uint32_t) * (SKETCH_START + 1);
// перейти к сбросу обработчика
asm("bx %0"::"r"(resetHandlerAddress));
}
Файл libraries/SDU/extras/SDUBoot/build.sh
:
#!/bin/sh -x
ARDUINO=arduino
SKETCH_NAME="SDUBoot.ino"
SKETCH="$PWD/$SKETCH_NAME"
BUILD_PATH="$PWD/build"
OUTPUT_PATH="../../src/boot"
if [[ "$OSTYPE" == "darwin"* ]]; then
ARDUINO="/Applications/Arduino.app/Contents/MacOS/Arduino"
fi
buildSDUBootSketch() {
BOARD=$1
DESTINATION=$2
$ARDUINO --verify --board $BOARD --preserve-temp-files --pref build.path="$BUILD_PATH" $SKETCH
cat "$BUILD_PATH/$SKETCH_NAME.bin" | xxd -i > $DESTINATION
rm -rf "$BUILD_PATH"
}
mkdir -p "$OUTPUT_PATH"
buildSDUBootSketch "SODAQ:samd:sodaq_sara" "$OUTPUT_PATH/sodaq_sara.h"
Файл libraries/SDU/src/SDU.cpp
:
#include <Arduino.h>
#include "SDU.h"
__attribute__ ((section(".sketch_boot")))
unsigned char sduBoot[0x4000] = {
#include "boot/sodaq_sara.h"
};
Файл скетча sdu_test.ino
:
#include <Arduino.h>
#include "SDU.h"
#if defined(ARDUINO_SODAQ_SARA)
#define DEBUG_STREAM SerialUSB
#else
#error "Please select the SODAQ SARA as your board"
#endif
#define DEBUG_STREAM_BAUD 115200
String message;
void setup() {
// Start communication.
DEBUG_STREAM.begin(DEBUG_STREAM_BAUD);
while (!DEBUG_STREAM) {
// Wait for Serial Monitor to be opened.
}
message += "Sketch compile date and time: ";
message += __DATE__;
message += " ";
message += __TIME__;
// print out the sketch compile date and time on the serial port
DEBUG_STREAM.println(message);
}
void loop() {
// add you own code here
}
Файл arduino/50/.arduino15/packages/SODAQ/hardware/samd/1.8.6/variants/sodaq_sara/linker_scripts/gcc/flash_with_bootloader.ld
добавьте следующие строки:
KEEP(*(.sketch_boot))
. = ALIGN(0x2000);
здесь:
...
SECTIONS
{
PROVIDE(__sodaq_firmware_state = ORIGIN(FLASH) - 0x100);
.text :
{
__text_start__ = .;
KEEP(*(.sketch_boot))
. = ALIGN(0x2000);
KEEP(*(.isr_vector))
...
На SD - карте (отформатированной как FAT32) Я сохранил переименованный файл UPDATE.bin
без загрузчика скомпилированного файла скетча. Вывод D10 подключается и используется в качестве чипа select CS.
Сборка загрузочных шестнадцатеричных файлов:
$ cd libraries/SDU/extras/SDUBoot
$ ./build.sh
Версия 1.8.6-sodaq имеет эти недостающие строки в варианте arduino_zero, но не в варианте sodaq_sara.
Привет, меня не было в связи с тем, что во времена Корорны все изменилось, но теперь я вернулся. Это не работает. Он компилируется, но я не могу загрузить новую прошивку без загрузчика., @Sean
- Почему OTA не работает с платой ESP32-CAM Ai-Thinker?
- Достаточно ли 1 МБ флэш-памяти для загрузки OTA в ESP-01?
- ОТА-программа SPIFFS на ESP8266
- OTA через MQTT для ESP32
- OTA-обновление ESP8266 с разными настройками размера флэш-памяти?
- Esp32: совместим ли OTA с FREERTOS
- Как безопасно переключиться с ArduinoOTA на ESPhome?
- Обновление ESP32 OTA через MQTT с помощью "update.h"
какой загрузчик имеет плату? разница между MKR/Zero и M0 заключается в том, что для SDU размер загрузчика составляет 2 Кб для MKR и Zero и 4 кБ для M0. ваш скетч больше половины прошивки?, @Juraj
@Juraj на плате установлен ATSAMD21J18, 32-разрядный ARM Cortex M0+. Итак, я предполагаю размер загрузчика 4 кБ. Имеет ли это значение, если скетч больше половины Flash?, @phlegx
Ноль и M0 являются SAMD21, но имеют разные загрузчики. двоичный файл скетча не должен быть меньше половины флэш-памяти, если он загружен с SD-карты, @Juraj
https://github.com/arduino/ArduinoCore-samd/pull/344/commits, @Juraj
И что это значит, наконец? Какова правильная настройка, чтобы заставить его работать?, @phlegx
@phlegx, правильный способ-создать .h для библиотеки SDU, соответствующей выводам платы и этому скетчу, закодированному в.h должен знать правильный размер загрузчика. это пакет плат не Arduino SAMD, а какой-то третьей стороны, он должен быть изменен в качестве PR в моем предыдущем комментарии, @Juraj