mirror of
https://github.com/meshtastic/firmware.git
synced 2025-04-27 10:21:40 +00:00
Install a hardfault handler on NRF52
This commit is contained in:
parent
4147786b12
commit
f919eb6a64
@ -305,9 +305,15 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
// What platforms should use SEGGER?
|
// What platforms should use SEGGER?
|
||||||
#ifdef NRF52_SERIES
|
#ifdef NRF52_SERIES
|
||||||
|
|
||||||
|
// Always include the SEGGER code on NRF52 - because useful for debugging
|
||||||
|
#include "SEGGER_RTT.h"
|
||||||
|
|
||||||
|
// Debug printing to segger console
|
||||||
|
#define SEGGER_MSG(...) SEGGER_RTT_printf(0, __VA_ARGS__)
|
||||||
|
|
||||||
// nrf52 gets its settings via variant files
|
// nrf52 gets its settings via variant files
|
||||||
#ifndef PIN_SERIAL_RX
|
#ifndef PIN_SERIAL_RX
|
||||||
// No serial ports on this board - use segger in memory console
|
// No serial ports on this board - ONLY use segger in memory console
|
||||||
#define USE_SEGGER
|
#define USE_SEGGER
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -316,7 +322,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef USE_SEGGER
|
#ifdef USE_SEGGER
|
||||||
#include "SEGGER_RTT.h"
|
|
||||||
#define DEBUG_MSG(...) SEGGER_RTT_printf(0, __VA_ARGS__)
|
#define DEBUG_MSG(...) SEGGER_RTT_printf(0, __VA_ARGS__)
|
||||||
#else
|
#else
|
||||||
#ifdef DEBUG_PORT
|
#ifdef DEBUG_PORT
|
||||||
|
@ -217,57 +217,3 @@ void updateBatteryLevel(uint8_t level)
|
|||||||
{
|
{
|
||||||
blebas.write(level);
|
blebas.write(level);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
void loop()
|
|
||||||
{
|
|
||||||
digitalToggle(LED_RED);
|
|
||||||
|
|
||||||
if ( Bluefruit.connected() ) {
|
|
||||||
uint8_t hrmdata[2] = { 0b00000110, bps++ }; // Sensor connected, increment BPS value
|
|
||||||
|
|
||||||
// Note: We use .notify instead of .write!
|
|
||||||
// If it is connected but CCCD is not enabled
|
|
||||||
// The characteristic's value is still updated although notification is not sent
|
|
||||||
if ( hrmc.notify(hrmdata, sizeof(hrmdata)) ){
|
|
||||||
Serial.print("Heart Rate Measurement updated to: "); Serial.println(bps);
|
|
||||||
}else{
|
|
||||||
Serial.println("ERROR: Notify not set in the CCCD or not connected!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Only send update once per second
|
|
||||||
delay(1000);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
examples of advanced characteristics. use setReadAuthorizeCallback to prepare data for reads by others
|
|
||||||
|
|
||||||
err_t BLEDfu::begin(void)
|
|
||||||
{
|
|
||||||
// Invoke base class begin()
|
|
||||||
VERIFY_STATUS( BLEService::begin() );
|
|
||||||
|
|
||||||
// No need to keep packet & revision characteristics
|
|
||||||
BLECharacteristic chr_packet(UUID128_CHR_DFU_PACKET);
|
|
||||||
chr_packet.setTempMemory();
|
|
||||||
chr_packet.setProperties(CHR_PROPS_WRITE_WO_RESP);
|
|
||||||
chr_packet.setMaxLen(20);
|
|
||||||
VERIFY_STATUS( chr_packet.begin() );
|
|
||||||
|
|
||||||
_chr_control.setProperties(CHR_PROPS_WRITE | CHR_PROPS_NOTIFY);
|
|
||||||
_chr_control.setMaxLen(23);
|
|
||||||
_chr_control.setWriteAuthorizeCallback(bledfu_control_wr_authorize_cb);
|
|
||||||
VERIFY_STATUS( _chr_control.begin() );
|
|
||||||
|
|
||||||
BLECharacteristic chr_revision(UUID128_CHR_DFU_REVISON);
|
|
||||||
chr_revision.setTempMemory();
|
|
||||||
chr_revision.setProperties(CHR_PROPS_READ);
|
|
||||||
chr_revision.setFixedLen(2);
|
|
||||||
VERIFY_STATUS( chr_revision.begin());
|
|
||||||
chr_revision.write16(DFU_REV_APPMODE);
|
|
||||||
|
|
||||||
return ERROR_NONE;
|
|
||||||
}
|
|
||||||
*/
|
|
@ -5,47 +5,51 @@
|
|||||||
|
|
||||||
enum { r0, r1, r2, r3, r12, lr, pc, psr };
|
enum { r0, r1, r2, r3, r12, lr, pc, psr };
|
||||||
|
|
||||||
|
// we can't use the regular DEBUG_MSG for these crash dumps because it depends on threading still being running. Instead use the
|
||||||
|
// segger in memory tool
|
||||||
|
#define FAULT_MSG(...) SEGGER_MSG(__VA_ARGS__)
|
||||||
|
|
||||||
// Per http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0552a/Cihcfefj.html
|
// Per http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0552a/Cihcfefj.html
|
||||||
static void printUsageErrorMsg(uint32_t cfsr)
|
static void printUsageErrorMsg(uint32_t cfsr)
|
||||||
{
|
{
|
||||||
DEBUG_MSG("Usage fault: ");
|
FAULT_MSG("Usage fault: ");
|
||||||
cfsr >>= SCB_CFSR_USGFAULTSR_Pos; // right shift to lsb
|
cfsr >>= SCB_CFSR_USGFAULTSR_Pos; // right shift to lsb
|
||||||
if ((cfsr & (1 << 9)) != 0)
|
if ((cfsr & (1 << 9)) != 0)
|
||||||
DEBUG_MSG("Divide by zero\n");
|
FAULT_MSG("Divide by zero\n");
|
||||||
if ((cfsr & (1 << 8)) != 0)
|
if ((cfsr & (1 << 8)) != 0)
|
||||||
DEBUG_MSG("Unaligned\n");
|
FAULT_MSG("Unaligned\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void printBusErrorMsg(uint32_t cfsr)
|
static void printBusErrorMsg(uint32_t cfsr)
|
||||||
{
|
{
|
||||||
DEBUG_MSG("Usage fault: ");
|
FAULT_MSG("Bus fault: ");
|
||||||
cfsr >>= SCB_CFSR_BUSFAULTSR_Pos; // right shift to lsb
|
cfsr >>= SCB_CFSR_BUSFAULTSR_Pos; // right shift to lsb
|
||||||
if ((cfsr & (1 << 0)) != 0)
|
if ((cfsr & (1 << 0)) != 0)
|
||||||
DEBUG_MSG("Instruction bus error\n");
|
FAULT_MSG("Instruction bus error\n");
|
||||||
if ((cfsr & (1 << 1)) != 0)
|
if ((cfsr & (1 << 1)) != 0)
|
||||||
DEBUG_MSG("Precise data bus error\n");
|
FAULT_MSG("Precise data bus error\n");
|
||||||
if ((cfsr & (1 << 2)) != 0)
|
if ((cfsr & (1 << 2)) != 0)
|
||||||
DEBUG_MSG("Imprecise data bus error\n");
|
FAULT_MSG("Imprecise data bus error\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void printMemErrorMsg(uint32_t cfsr)
|
static void printMemErrorMsg(uint32_t cfsr)
|
||||||
{
|
{
|
||||||
DEBUG_MSG("Usage fault: ");
|
FAULT_MSG("Memory fault: ");
|
||||||
cfsr >>= SCB_CFSR_MEMFAULTSR_Pos; // right shift to lsb
|
cfsr >>= SCB_CFSR_MEMFAULTSR_Pos; // right shift to lsb
|
||||||
if ((cfsr & (1 << 0)) != 0)
|
if ((cfsr & (1 << 0)) != 0)
|
||||||
DEBUG_MSG("Instruction access violation\n");
|
FAULT_MSG("Instruction access violation\n");
|
||||||
if ((cfsr & (1 << 1)) != 0)
|
if ((cfsr & (1 << 1)) != 0)
|
||||||
DEBUG_MSG("Data access violation\n");
|
FAULT_MSG("Data access violation\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void HardFault_Impl(uint32_t stack[])
|
extern "C" void HardFault_Impl(uint32_t stack[])
|
||||||
{
|
{
|
||||||
DEBUG_MSG("In Hard Fault Handler\n");
|
FAULT_MSG("In Hard Fault Handler\n");
|
||||||
DEBUG_MSG("SCB->HFSR = 0x%08lx\n", SCB->HFSR);
|
FAULT_MSG("SCB->HFSR = 0x%08lx\n", SCB->HFSR);
|
||||||
|
|
||||||
if ((SCB->HFSR & SCB_HFSR_FORCED_Msk) != 0) {
|
if ((SCB->HFSR & SCB_HFSR_FORCED_Msk) != 0) {
|
||||||
DEBUG_MSG("Forced Hard Fault\n");
|
FAULT_MSG("Forced Hard Fault\n");
|
||||||
DEBUG_MSG("SCB->CFSR = 0x%08lx\n", SCB->CFSR);
|
FAULT_MSG("SCB->CFSR = 0x%08lx\n", SCB->CFSR);
|
||||||
|
|
||||||
if ((SCB->CFSR & SCB_CFSR_USGFAULTSR_Msk) != 0) {
|
if ((SCB->CFSR & SCB_CFSR_USGFAULTSR_Msk) != 0) {
|
||||||
printUsageErrorMsg(SCB->CFSR);
|
printUsageErrorMsg(SCB->CFSR);
|
||||||
@ -57,21 +61,21 @@ static void HardFault_Impl(uint32_t stack[])
|
|||||||
printMemErrorMsg(SCB->CFSR);
|
printMemErrorMsg(SCB->CFSR);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG_MSG("r0 = 0x%08lx\n", stack[r0]);
|
FAULT_MSG("r0 = 0x%08lx\n", stack[r0]);
|
||||||
DEBUG_MSG("r1 = 0x%08lx\n", stack[r1]);
|
FAULT_MSG("r1 = 0x%08lx\n", stack[r1]);
|
||||||
DEBUG_MSG("r2 = 0x%08lx\n", stack[r2]);
|
FAULT_MSG("r2 = 0x%08lx\n", stack[r2]);
|
||||||
DEBUG_MSG("r3 = 0x%08lx\n", stack[r3]);
|
FAULT_MSG("r3 = 0x%08lx\n", stack[r3]);
|
||||||
DEBUG_MSG("r12 = 0x%08lx\n", stack[r12]);
|
FAULT_MSG("r12 = 0x%08lx\n", stack[r12]);
|
||||||
DEBUG_MSG("lr = 0x%08lx\n", stack[lr]);
|
FAULT_MSG("lr = 0x%08lx\n", stack[lr]);
|
||||||
DEBUG_MSG("pc = 0x%08lx\n", stack[pc]);
|
FAULT_MSG("pc = 0x%08lx\n", stack[pc]);
|
||||||
DEBUG_MSG("psr = 0x%08lx\n", stack[psr]);
|
FAULT_MSG("psr = 0x%08lx\n", stack[psr]);
|
||||||
asm volatile("bkpt #01");
|
asm volatile("bkpt #01");
|
||||||
while (1)
|
while (1)
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void HardFault_Handler(void)
|
extern "C" void HardFault_Handler(void)
|
||||||
{
|
{
|
||||||
asm volatile(" mrs r0,msp\n"
|
asm volatile(" mrs r0,msp\n"
|
||||||
" b HardFault_Impl \n");
|
" b HardFault_Impl \n");
|
||||||
|
Loading…
Reference in New Issue
Block a user