Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- **
- * @brief This function handles Hard fault interrupt.
- */
- void HardFault_Handler(void)
- {
- /* USER CODE BEGIN HardFault_IRQn 0 */
- __asm volatile
- (
- " tst lr, #4 \n"
- " ite eq \n"
- " mrseq r0, msp \n"
- " mrsne r0, psp \n"
- " ldr r1, [r0, #24] \n"
- " ldr r2, =prvGetRegistersFromStack \n"
- " bx r2 \n"
- );
- /* USER CODE END HardFault_IRQn 0 */
- while (1)
- {
- /* USER CODE BEGIN W1_HardFault_IRQn 0 */
- __asm volatile("NOP\n");
- /* USER CODE END W1_HardFault_IRQn 0 */
- }
- }
- ...
- /* USER CODE BEGIN 1 */
- void prvGetRegistersFromStack( uint32_t *pulFaultStackAddress )
- {
- /* These are volatile to try and prevent the compiler/linker optimising them
- away as the variables never actually get used. If the debugger won't show the
- values of the variables, make them global my moving their declaration outside
- of this function. */
- volatile uint32_t r0 __unused;
- volatile uint32_t r1 __unused;
- volatile uint32_t r2 __unused;
- volatile uint32_t r3 __unused;
- volatile uint32_t r12 __unused;
- volatile uint32_t lr __unused; /* Link register. */
- volatile uint32_t pc __unused; /* Program counter. */
- volatile uint32_t psr __unused;/* Program status register. */
- r0 = pulFaultStackAddress[ 0 ];
- r1 = pulFaultStackAddress[ 1 ];
- r2 = pulFaultStackAddress[ 2 ];
- r3 = pulFaultStackAddress[ 3 ];
- r12 = pulFaultStackAddress[ 4 ];
- lr = pulFaultStackAddress[ 5 ];
- pc = pulFaultStackAddress[ 6 ];
- psr = pulFaultStackAddress[ 7 ];
- /* When the following line is hit, the variables contain the register values. */
- for( uint32_t i = 0; i < 1000; i++) {
- BSP_LedSetAll(GPIO_PIN_SET);
- BSP_DelayMicros(500000);
- BSP_LedSetAll(GPIO_PIN_RESET);
- BSP_DelayMicros(500000);
- }
- //TODO: Set reset reason;
- NVIC_SystemReset();
- }
- /* USER CODE END 1 */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement