62#ifdef SERIAL_TRACE_ENABLE 
   64  #if defined(RTT_TRACE_ENABLE) 
   65    #undef SWO_TRACE_ENABLE 
   66    #include "SEGGER_RTT.h" 
   67    #define my_printf(...)        SEGGER_RTT_printf(0, __VA_ARGS__) 
   68  #elif defined(SWO_TRACE_ENABLE) 
   69    #undef RTT_TRACE_ENABLE 
   70    #define my_printf(...)        printf(__VA_ARGS__) 
   72    #define my_printf(...)   
   73    #warning No trace is selected. Serial debug wont work. 
   77  #define my_printf(...)    
   78  #undef RTT_TRACE_ENABLE 
   79  #undef SWO_TRACE_ENABLE 
   90log_printf(TAG, fmt, ...)   
   92    #define log_printf(TAG, fmt, ...)  \ 
   93my_printf("\n[%lu] [%s] " fmt, \ 
   94(unsigned long)uwTick, TAG, ##__VA_ARGS__) 
 
   96    #define log_printf(TAG, fmt, ...)  \ 
   97my_printf("\n[%lu] [%s] (%s:%d) " fmt, \ 
   98(unsigned long)uwTick, TAG, __FILE__, __LINE__, ##__VA_ARGS__) 
  133#ifndef GPIO_TRACE_ENABLE 
  134  #define TRACE_GPIO_SET(_gpio_,_pin_) 
  135  #define TRACE_GPIO_RESET(_gpio_,_pin_) 
  137  #define TRACE_GPIO_SET(_gpio_,_pin_)          (_gpio_)->BSRR = (((_pin_))) 
  138  #define TRACE_GPIO_RESET(_gpio_,_pin_)        (_gpio_)->BSRR = ((_pin_)<<16) 
  148#if defined(HAL_MODULE_ENABLED) && defined(RTT_TRACE_ENABLE) 
  182  __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGSERR | FLASH_FLAG_WRPERR | FLASH_FLAG_OPERR);
 
  183  while (__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY)) { 
 
 
  204  if (tag == 0xFFFFFFFF)
 
  207  SEGGER_RTT_BUFFER_UP *up = &_SEGGER_RTT.aUp[0];
 
  208  unsigned buf_size = up->SizeOfBuffer;
 
  209  unsigned wr = up->WrOff;
 
  212  unsigned n = (tail_size > buf_size) ? buf_size : tail_size;
 
  218  uint32_t base_tag = tag & 0xFFFFFF00;
 
  219  uint32_t next_tag = (tag & 0xFF) == 0 ? tag + 1 : tag;
 
  226    if (flash_hdr->
tag == 0xFFFFFFFF)
 
  230    if((flash_hdr->
tag & 0xFFFFFF00) == base_tag) 
 
  232      if ((tag & 0xFF) == 0) 
 
  233        next_tag = flash_hdr->
tag + 1;  
 
  235        if(flash_hdr->
tag == tag) 
 
  240    if(next_tag - tag > 0xFF)
 
  251  unsigned valid_count = 0;
 
  253  for (
unsigned i = 0; i < n; i++)
 
  255    unsigned idx = (wr + buf_size - n + i) % buf_size;
 
  256    char c = up->pBuffer[idx];
 
  258      temp[valid_count++] = c;
 
  265  flash_data.
tag  = next_tag;
 
  266  flash_data.
size = valid_count;
 
  267  memcpy(flash_data.
data, temp, valid_count);
 
  270  const uint32_t *p = (
const uint32_t *)&flash_data;
 
  273    if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr + i * 4, p[i]) != HAL_OK)
 
  282  return (
int)(next_tag&0xFF);
 
 
  299__STATIC_FORCEINLINE 
int RTT_ReadFromFlash(uint32_t tag, 
char *Buffer, uint32_t tail_size, uint32_t *read_size)
 
  301  if (!Buffer || tail_size == 0)
 
  304  if (tag == 0xFFFFFFFF)
 
  310  uint32_t base_tag = tag & 0xFFFFFF00;
 
  317    if (flash_hdr->
tag == 0xFFFFFFFF)
 
  321    if((flash_hdr->
tag & 0xFFFFFF00) == base_tag) 
 
  323      if ((tag & 0xFF) == 0) 
 
  324        target_hdr = flash_hdr;  
 
  326        if(flash_hdr->
tag == tag) 
 
  328          target_hdr = flash_hdr;
 
  336  if (!target_hdr) 
return -1; 
 
  343  uint32_t n = (tail_size > target_hdr->
size) ? target_hdr->
size : tail_size;
 
  345  uint32_t start = target_hdr->
size - n;
 
  347  memcpy(Buffer, &target_hdr->
data[start], n);
 
  349  if(read_size != NULL)
 
  357  return (
int)(target_hdr->
tag & 0xFF);
 
 
  365  FLASH_EraseInitTypeDef eraseInit;
 
  366  uint32_t pageError = 0;
 
  370  eraseInit.TypeErase   = FLASH_TYPEERASE_SECTORS;
 
  372  eraseInit.NbSectors   = 1;
 
  374  if (HAL_FLASHEx_Erase(&eraseInit, &pageError) != HAL_OK)
 
 
  387#define RTT_FlashPrepare(...) 
  388#define RTT_EraseFlash(...)    0 
  389#define RTT_SaveToFlash(...)   0 
  390#define RTT_ReadFromFlash(...) 0 
  431#if defined(HAL_MODULE_ENABLED) && defined(HARDFAULT_SERIAL_TRACE) 
  433#ifndef HF_RTT_TAIL_SIZE 
  434#define HF_RTT_TAIL_SIZE  RTT_FLASH_BUFFER_SIZE  
  467  uint32_t read_size = 0;
 
  471    my_printf(
"\n--- Recovered HardFault RTT buffer #%u ---\n", n_hardfault);
 
  472    for (
int i = 0; i < read_size; i++)
 
  475      if (c == 0 || c == (
char)0xFF) 
break;
 
  481    my_printf(
"\n--------- HardFault Dump End ---------\n");
 
 
  490static void *ret_adr[10] = {0};
 
  511        "MRSEQ %[ptr], MSP\n" 
  512        "MRSNE %[ptr], PSP\n" 
  513        : [ptr] 
"=r"(stack_frame)
 
  516    my_printf(
"\n===== HardFault occurred! =====\n");
 
  517    my_printf(
"R0  = 0x%08X\n", stack_frame->r0);
 
  518    my_printf(
"R1  = 0x%08X\n", stack_frame->r1);
 
  519    my_printf(
"R2  = 0x%08X\n", stack_frame->r2);
 
  520    my_printf(
"R3  = 0x%08X\n", stack_frame->r3);
 
  521    my_printf(
"R12 = 0x%08X\n", stack_frame->r12);
 
  522    my_printf(
"LR  = 0x%08X\n", stack_frame->lr);
 
  523    my_printf(
"PC  = 0x%08X\n", stack_frame->pc);
 
  524    my_printf(
"PSR = 0x%08X\n", stack_frame->psr);
 
  530    my_printf(
"MMFAR = 0x%08X\n", SCB->MMFAR);
 
  535    ret_adr[0] = __builtin_return_address(0);
 
  536    ret_adr[1] = __builtin_return_address(1);
 
  537    ret_adr[2] = __builtin_return_address(2);
 
  539    for (
int i = 0; i < 3; i++)  
 
  542        my_printf(
"  #%d: 0x%08lX\r\n", i, ret_adr[i]); 
 
 
  547#define HF_CheckRecovered(...) 0 
  548#define HF_HandleFault(...) 
#define RTT_FLASH_SECTOR
Сектор FLASH куда положится RTT буфер
 
#define RTT_FLASH_BUFFER_SIZE
Размер буфера RTT в Flash.
 
#define RTT_FLASH_SECTOR_START
Начало сектора RTT_FLASH_SECTOR.
 
#define HF_STACK_DUMP_WORDS
Сколько слов стека будет проанализировано во время Hardfault.
 
#define HF_RTT_TAG_BASE
базовый тег для HardFault
 
#define HF_RTT_TAIL_SIZE
Размер буфера RTT, который сохранится при Hardfault.
 
#define RTT_FLASH_SECTOR_END
Конец сектора RTT_FLASH_SECTOR.
 
__STATIC_FORCEINLINE int HF_CheckRecovered(int erase)
Проверка и вывод последнего HardFault-трейса из Flash.
 
__STATIC_FORCEINLINE void HF_HandleFault(void)
Обработчик HardFault.
 
__STATIC_FORCEINLINE void RTT_FlashPrepare(void)
Подготовка Flash к записи
 
__STATIC_FORCEINLINE int RTT_ReadFromFlash(uint32_t tag, char *Buffer, uint32_t tail_size, uint32_t *read_size)
Читает последние символы RTT-буфера из Flash по тегу
 
__STATIC_FORCEINLINE int RTT_SaveToFlash(uint32_t tag, uint32_t tail_size)
Сохраняет последние символы RTT-буфера в Flash по тегу
 
__STATIC_FORCEINLINE int RTT_EraseFlash(void)
Стирание сектора Flash с RTT-буфером
 
#define my_printf(...)
Универсальный макрос для вывода трассировки
 
Заголочный файл для дефайнов библиотеки MyLibsGeneral.
 
Контекст стек-фрейма процессора при HardFault.
 
uint32_t pc
Program Counter.
 
uint32_t lr
Link Register.
 
uint32_t psr
Program Status Register.