mbed: HardFault Ошибка при доступе к SD-карте после создания сетевого подключения
Я хочу совместить HTTP-клиент и SD-Card-Reader. Моя цель - загрузить файл с сервера и сохранить этот файл на SD-карте. К сожалению, я застрял на пути из-за Hard Fault 0x80FF013D.
Я не разбил код и в итоге узнал:
- сетевая связь (GET-команда) отлично работает соло
- Доступ к SD-карте (чтение и запись) работает в одиночку
- Доступ к SD-карте работает нормально перед созданием сетевого подключения
- Сбой происходит, когда я получаю доступ к SD-карте после создания сетевого подключения
Core-Информация:
- ОС: MBED OS5
- IDE: MBED CLI v1.8.2
- MC: NUCLEO-F746ZG
- Устройство чтения SD-карт: CATALEX MicroSD-адаптер для карт памяти с Transcend 2 ГБ microSD (в формате FAT)
Библиотеки:
- mbed-os https://github.com/ARMmbed/mbed-os/
- sd-драйвер https://github.com/ARMmbed/sd-driver/
Последовательный выход с HardFault:
[NWKH] Подключение к сети...
[NWKH] подключен к сети
[NWKH] IP-адрес: 192.168.188.29
Тестовая SD-карта++ MbedOS Fault Handler ++
Тип ошибки: HardFault
Контекст:
R0: 20000400
R1: BFF39B82
R2: 08025B6A
R3: 00000003
R4: 00000000
R5: 2000FA34
R6: 84551677
R7: 7FFFFC00
R8: 00000003
R9: 08025B6A
R10: 2000FA34
R11: 00000000
R12: 08013E6D
SP: 2000F9F8
LR: 0801A8E7
ПК: A0000000
xPSR: 210B0000
PSP: 2000F990
MSP: 2004FFC0
CPUID: 410FC271
HFSR: 40000000
MMFSR: 00000001
BFSR: 00000000
UFSR: 00000000
DFSR: 0000000B
AFSR: 00000000
Режим: Тема
Priv: Привилегированный
Стек: PSP- MbedOS Fault Handler -
++ Информация об ошибке MbedOS ++
Состояние ошибки: 0x80FF013D Код: 317 Модуль: 255
Сообщение об ошибке: исключение ошибки
Расположение: 0x8012A7B
Значение ошибки: 0xA0000000
Текущая тема: Id: 0x2000DA34 Запись: 0x8012BEB Размер стека: 0x2000 StackMem: 0x2000DA78 SP: 0x2004FF58
Для получения дополнительной информации посетите: https://armmbed.github.io/mbedos-error/?error=0x80FF013D
- Информация об ошибке MbedOS -
Я начал с http-примера из mbed https://os.mbed.com/teams/sandbox/code/http-example/file/2efadc4d8784/source/main-http-socket-reuse.cpp/shortlog/
и добавил некоторые вещи из примера файловой системы SD-карты https://os.mbed.com/cookbook/SD-Card-File-System
Основной-http.cpp
#include "select-demo.h"
#if DEMO == DEMO_HTTP
#include "mbed.h"
#include "http_request.h"
#include "network-helper.h"
#include "mbed_mem_trace.h"
#include "SDBlockDevice.h"
#include "FATFileSystem.h"
#include "DebouncedIn.h"
#define SD_MOUNT_PATH "sd"
#define FULL_UPDATE_FILE_PATH "/" SD_MOUNT_PATH "/" MBED_CONF_APP_UPDATE_FILE
SDBlockDevice sd(MBED_CONF_APP_SD_CARD_MOSI, MBED_CONF_APP_SD_CARD_MISO,
MBED_CONF_APP_SD_CARD_SCK, MBED_CONF_APP_SD_CARD_CS);
FATFileSystem fs(SD_MOUNT_PATH);
NetworkInterface* network;
DebouncedIn btn(USER_BUTTON);
FILE* file;
int main()
{
/*------Init SD-Card-----------*/
int r;
//Init
if ((r = sd.init()) != 0) {
printf("Could not initialize SD driver (%d)\n", r);
return 1;
}
//Mount
if ((r = fs.mount(&sd)) != 0) {
printf("Could not mount filesystem, is the SD card formatted as FAT? (%d)\n", r);
return 1;
}
/*------Init Network-----------*/
network = connect_to_default_network_interface();
if (!network)
{
printf("Cannot connect to the network, see serial output\n");
return 1;
}
//Write
printf("Test SD-Card\n");
char testbuffer2[] = { 'a' , 'b' , 'c' };
file = fopen("/sd/test.bin", "wb");
fwrite("abc",1,3,file);
//fwrite(testbuffer2,1,sizeof(testbuffer2),file);
fclose(file);
//Hauptschleife
while(1)
{
//Buttondruck
if (btn.rising())
{
printf("Update wird gesucht, bitte warten\n");
}
}
}
#endif
mbed_app.json
{
"config": {
"main-stack-size": {
"value": 8192
},
"update_file": {
"help": "Path to the application update binary on the SD card",
"value": "\"update.bin\""
},
"sd_card_mosi": {
"help": "MCU pin connected to the SD card's SPI MOSI pin",
"value": "D11"
},
"sd_card_miso": {
"help": "MCU pin connected to the SD card's SPI MISO pin",
"value": "D12"
},
"sd_card_sck": {
"help": "MCU pin connected to the SD card's SPI SCK pin",
"value": "D13"
},
"sd_card_cs": {
"help": "MCU pin connected to the SD card's SPI CS pin",
"value": "D10"
}
},
"macros": [
"MBEDTLS_MPI_MAX_SIZE=1024",
"MBEDTLS_MPI_WINDOW_SIZE=1",
"MBEDTLS_USER_CONFIG_FILE=\"mbedtls_entropy_config.h\"",
"MBEDTLS_TEST_NULL_ENTROPY",
"MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES",
"MBED_HEAP_STATS_ENABLED=1"
],
"target_overrides": {
"*": {
"platform.stdio-baud-rate": 115200,
"platform.stdio-convert-newlines": true,
"mbed-mesh-api.6lowpan-nd-channel-page": 0,
"mbed-mesh-api.6lowpan-nd-channel": 12,
"mbed-trace.enable": 1,
"platform.error-hist-enabled": 1,
"mbed-http.http-buffer-size": 2048,
"nsapi.default-wifi-security": "WPA_WPA2",
"nsapi.default-wifi-ssid": "\"SSID\"",
"nsapi.default-wifi-password": "\"Password\""
}
}
}
Я уже прочитал Учебное пособие по "Анализу аварийного дампа Mbed OS" -> https://os.mbed.com/docs/v5.8/tutorials/analyzing-mbed-os-crash-dump.html,
но я до сих пор понятия не имею, что я могу сделать, чтобы найти причину для Hard Fault.
- Состояние ошибки: "0x80FF013D" означает "исключение жесткого сбоя"
- HFSR: 40000000 означает "Принудительное повреждение"
- MMFSR: 00000001 означает "Процессор попытался получить инструкцию из местоположения, которое не разрешает выполнение".
- UFSR: 00000000 означает "все хорошо"
- BFSR: 00000000 означает "все хорошо"
Буду признателен за помощь. Заранее спасибо.
0 ответов
Эта плата имеет конфликтный контакт D11. Он используется Ethernet и как ваш SPI. Вам нужно использовать другие контакты SPI или следовать инструкциям на сайте mbed для исправления платы:
Если вы используете как SPI, так и Ethernet, вы должны соединить плату NUCLEO с обратной стороны:
- удалить SB121 и закрыть паяные перемычки SB122. Это соединит PB_5 с D11 вместо PA_7.
- Перезапишите конфигурацию d11_configuration с помощью файла mbed_app.json и используйте PB_5 (вместо значения по умолчанию PA_7).