Отладка HardFault при реализации ЖК-дисплея HD44780 на STM32F411 Discovery - PullRequest
0 голосов
/ 04 октября 2018

У меня проблема при программировании LCD HD44780 на STM32F411 Discovery с использованием этой библиотеки: https://stm32f4 -discovery.net / 2015/07 / hal-library-15-hd44780-for-stm32fxxx / Проблема заключается вчто после реализации библиотеки и запуска кода я обычно застреваю в функции HardFault_Handler.Я прочитал несколько статей в интернете об устранении серьезных неисправностей и реализовал функцию HardFault_HandlerC с этого сайта: https://community.nxp.com/thread/389002 Программа теперь застревает в этой функции, которая дает мне представление о том, что находится в регистрах,но теперь я понятия не имею, что мне делать дальше, потому что эти значения абсолютно ничего мне не говорят.

Это значения упомянутых регистров:

stacked_r0  volatile unsigned long  0   
stacked_r1  volatile unsigned long  0   
stacked_r2  volatile unsigned long  0   
stacked_r3  volatile unsigned long  1   
stacked_r12 volatile unsigned long  45000000    
stacked_lr  volatile unsigned long  11018266    
stacked_pc  volatile unsigned long  553682714   
stacked_psr volatile unsigned long  8192    
_CFSR   volatile unsigned long  256 
_HFSR   volatile unsigned long  1073741824  
_DFSR   volatile unsigned long  11  
_AFSR   volatile unsigned long  0   
_BFAR   volatile unsigned long  3758157112  
_MMAR   volatile unsigned long  3758157108  

Может кто-нибудь сказать, что мнеЧто мне делать дальше для дальнейшей проверки проблемы?

Кроме того, моя программа на случайных запусках также застревает в этом блоке кода (вместо HardFault):

/* Wait till LSE is ready */
      while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET)
      {
        if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE)
        {
          return HAL_TIMEOUT;
        }
      }

Что, похоже, связанона унифицированную LSE, но я думаю, что сначала я должен сосредоточиться на устранении неполадок.

1 Ответ

0 голосов
/ 04 октября 2018

Отладка серьезных неисправностей общеизвестно сложна.Скорее всего, вы ввели обработчик жесткого сбоя, потому что произошло исключение, для которого обработчик недоступен, хотя это может быть связано с тем, что обработчик сам сгенерировал исключение.

Как сказал Лундин в комментарии, если у вас есть достойный отладчик, вы можете поместить точку останова в обработчик жестких ошибок, и отладчик покажет вам полный стек вызовов.Но если нет, вам придется сделать это трудным путем.

Когда ЦП входит в режим обработчика для обслуживания исключения, различные регистры помещаются в активный стек аппаратным обеспечением и обработчиком, с которым вы работаете.реализовано извлекает их из стека для проверки.Первое, на что нужно обратить внимание - это содержимое счетчика с накоплением программ (ПК).Попробуйте получить его значение в шестнадцатеричном формате;После этого вы сможете связать это с адресом инструкции, которая вызвала ошибку, с помощью отладчика.

Если адрес компьютера в стеке не соответствует разумному адресу кода, то возможно, что другойСтрока кода попыталась перейти на этот бессмысленный адрес, и это вызвало ошибку.В этом случае вы можете получить некоторую информацию, посмотрев на адрес регистра стековых ссылок (LR) - он должен содержать значение счетчика программы с того момента, когда ЦПУ столкнулся с инструкцией вызова.Это может не точно соответствовать линии, которая сгенерировала мошенническую ветвь, но она должна подвести вас достаточно близко, чтобы разместить другую точку останова и проходить до тех пор, пока не произойдет исключение.

Я с удовольствием отредактирую этот ответ с дополнительными предложениями, еслиэто не поможет вам найти виновного - просто оставьте комментарий, и я вернусь к вам.

...