單片機調試技巧--修改bin文件實現斷點

?????????

fromelf --text -a -c --output=all.dis F103_Moduel\F103_Moduel.axf
fromelf --bin --output=test.bin F103_Moduel\F103_Moduel.axf

在啟動文件中,修改UsageFault_Handler

UsageFault_Handler\PROC; get current contextTST 	lr, #0x04				; if(!EXC_RETURN[2])ITE 	EQMRSEQ	r0, msp 				; [2]=0 ==> Z=1, get fault context from handler.MRSNE	r0, psp 				; [2]=1 ==> Z=0, get fault context from thread.STMFD	r0!, {r4 - r11} 		; push r4 - r11 registerSTMFD	r0!, {lr}				; push exec_return registerTST 	lr, #0x04				; if(!EXC_RETURN[2])ITE 	EQMSREQ	msp, r0 				; [2]=0 ==> Z=1, update stack pointer to MSP.MSRNE	psp, r0 				; [2]=1 ==> Z=0, update stack pointer to PSP.PUSH	{lr}BL		rt_hw_hard_fault_exceptionPOP 	{lr}ORR 	lr, lr, #0x04BX		lrENDP

實現rt_hw_hard_fault_exception函數

#define rt_uint32_t unsigned int
struct exception_info
{rt_uint32_t exc_return;rt_uint32_t r4;rt_uint32_t r5;rt_uint32_t r6;rt_uint32_t r7;rt_uint32_t r8;rt_uint32_t r9;rt_uint32_t r10;rt_uint32_t r11;rt_uint32_t r0;rt_uint32_t r1;rt_uint32_t r2;rt_uint32_t r3;rt_uint32_t r12;rt_uint32_t lr;rt_uint32_t pc;rt_uint32_t psr;
};/** fault exception handler*/
void rt_hw_hard_fault_exception(struct exception_info * exception_info)
{unsigned int *app_sp;int i;app_sp = (unsigned int *)(exception_info + 1);  /* context + 16*4 */printf("psr: 0x%08x\r\n", exception_info->psr);printf("r00: 0x%08x\r\n", exception_info->r0);printf("r01: 0x%08x\r\n", exception_info->r1);printf("r02: 0x%08x\r\n", exception_info->r2);printf("r03: 0x%08x\r\n", exception_info->r3);printf("r04: 0x%08x\r\n", exception_info->r4);printf("r05: 0x%08x\r\n", exception_info->r5);printf("r06: 0x%08x\r\n", exception_info->r6);printf("r07: 0x%08x\r\n", exception_info->r7);printf("r08: 0x%08x\r\n", exception_info->r8);printf("r09: 0x%08x\r\n", exception_info->r9);printf("r10: 0x%08x\r\n", exception_info->r10);printf("r11: 0x%08x\r\n", exception_info->r11);printf("r12: 0x%08x\r\n", exception_info->r12);printf(" lr: 0x%08x\r\n", exception_info->lr);printf(" pc: 0x%08x\r\n", exception_info->pc);printf("stacks: \r\n");i = 0;for (i = 0; i < 1024; ){printf("%08x ", *app_sp);app_sp++;i++;if (i % 16 == 0)printf("\r\n");}printf("\r\n");while (1);
}

The SHCSR enables the system handlers,這個函數作用就是使能UsageFault?

void UsageFaultInit(void)
{SCB->SHCSR |= (SCB_SHCSR_USGFAULTENA_Msk);
}

main.c中

/* USER CODE BEGIN Header */
/********************************************************************************* @file           : main.c* @brief          : Main program body******************************************************************************* @attention** <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.* All rights reserved.</center></h2>** This software component is licensed by ST under BSD 3-Clause license,* the "License"; You may not use this file except in compliance with the* License. You may obtain a copy of the License at:*                        opensource.org/licenses/BSD-3-Clause********************************************************************************/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "cmsis_os.h"
#include "usart.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "driver_usart.h"
#include "driver_key.h"
#include <stdio.h>
/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
void MX_FREERTOS_Init(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */ring_buffer test_buffer;static void A(void);
static void B(char *buf);
static int C(int b);static void A(void)
{volatile int val = 1;//volatile int val2 = 1;char buf[16];B(buf);C(val);
}static void B(char *buf)
{strcpy(buf, "192.168.100.106 ");
}static int C(int b)
{return 100/b;
}static void D(void)
{	printf("Enter D()\r\n");C(1);printf("Exit D()\r\n");
}void UsageFaultInit(void)
{SCB->SHCSR |= (SCB_SHCSR_USGFAULTENA_Msk);
}void TestDebug(void)
{/* 100ask add *//* 使能除0錯誤* CCR(0xE000ED14)的bit4(DIV_0_TRP)設置為1*/volatile int *CCR = (volatile int *)0xE000ED14;*CCR |= (1<<4);UsageFaultInit();A();
}/* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();MX_USART3_UART_Init();/* USER CODE BEGIN 2 */KEY_GPIO_ReInit();ring_buffer_init(&test_buffer);EnableDebugIRQ();printf("Hello World!\r\n");TestDebug();/* USER CODE END 2 *//* Init scheduler */osKernelInitialize();  /* Call init function for freertos objects (in freertos.c) */MX_FREERTOS_Init();/* Start scheduler */osKernelStart();/* We should never get here as control is now taken by the scheduler *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK){Error_Handler();}
}/* USER CODE BEGIN 4 *//* USER CODE END 4 *//*** @brief  Period elapsed callback in non blocking mode* @note   This function is called  when TIM8 interrupt took place, inside* HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment* a global variable "uwTick" used as application time base.* @param  htim : TIM handle* @retval None*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{/* USER CODE BEGIN Callback 0 *//* USER CODE END Callback 0 */if (htim->Instance == TIM8) {HAL_IncTick();}/* USER CODE BEGIN Callback 1 *//* USER CODE END Callback 1 */
}/*** @brief  This function is executed in case of error occurrence.* @retval None*/
void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */__disable_irq();while (1){}/* USER CODE END Error_Handler_Debug */
}#ifdef  USE_FULL_ASSERT
/*** @brief  Reports the name of the source file and the source line number*         where the assert_param error has occurred.* @param  file: pointer to the source file name* @param  line: assert_param error line source number* @retval None*/
void assert_failed(uint8_t *file, uint32_t line)
{/* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/162799.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/162799.shtml
英文地址,請注明出處:http://en.pswp.cn/news/162799.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2014年08月25日 Go生態洞察:深入理解Go中的常量

&#x1f337;&#x1f341; 博主貓頭虎&#xff08;&#x1f405;&#x1f43e;&#xff09;帶您 Go to New World?&#x1f341; &#x1f984; 博客首頁——&#x1f405;&#x1f43e;貓頭虎的博客&#x1f390; &#x1f433; 《面試題大全專欄》 &#x1f995; 文章圖文…

高通OTA升級非常規分區方法

高通OTA升級非常規分區方法 1. 高通LE OTA背景2. 高通LE OTA升級方案2.1 SDX12 OTA方案2.2 OTA升級TZ/RPM/Aboot OTA是一個通用述語&#xff0c;常見的解釋為over the air。通過這一解釋&#xff0c;OTA最開始的概念&#xff0c;是空中升級。后來&#xff0c;又衍生出了FOTA&am…

中國智能汽車這一年,主打一個“卷”

文丨劉俊宏 “這才剛過去半年多&#xff0c;汽車行業又更新了一輪。”一位車評人在廣州車展感嘆道。 作為每年最后一個A級車展&#xff0c;廣州車展向來被視為中國車市的“風向標”。相比上海車展“擁抱汽車行業新時代”、成都車展“馭見未來”的主題&#xff0c;廣州車展“新…

數據結構(超詳細講解!!)第二十四節 二叉樹(上)

1.定義 二叉樹&#xff08;Binary Tree&#xff09;是另一種樹型結構。 二叉樹的特點&#xff1a; 1&#xff09;每個結點至多只有兩棵子樹&#xff08;即二叉樹中不存在度大于2的結點&#xff09;&#xff1b; 2&#xff09;二叉樹的子樹有左右之分&#xff0c;其次序…

python爬蟲教程:selenium常用API用法和瀏覽器控制

文章目錄 selenium apiwebdriver常用APIwebelement常用API 控制瀏覽器 selenium api selenium新版本(4.8.2)很多函數&#xff0c;包括元素定位、很多API方法均發生變化&#xff0c;本文記錄以selenium4.8.2為準。 webdriver常用API 方法描述get(String url)訪問目標url地址&…

分布式鎖之傳統鎖回顧(一)

1. 傳統鎖回顧 1.1. 從減庫存聊起 多線程并發安全問題最典型的代表就是超賣現象 庫存在并發量較大情況下很容易發生超賣現象&#xff0c;一旦發生超賣現象&#xff0c;就會出現多成交了訂單而發不了貨的情況。 場景&#xff1a; 商品S庫存余量為5時&#xff0c;用戶A和B同…

python:可迭代的數據類型、可變的數據類型、不可變的數據類型

python&#xff1a;可迭代的數據類型、可變的數據類型、不可變的數據類型 文章目錄 python&#xff1a;可迭代的數據類型、可變的數據類型、不可變的數據類型可迭代的數據類型可變的數據類型不可變的數據類型 可迭代的數據類型 序列&#xff1a;str、bytes、tuple、list非序列…

PC8223(CC/CV控制)高耐壓輸入5V/3.4A同步降壓電路內建補償帶恒流恒壓輸出

概述 PC8233&#xff08;替代CX8853&#xff09;是一款同步降壓調節器,輸出電流高達3.4A,操作范圍從8V到32V的寬電源電壓。內部補償要求最低數量現成的標準外部組件。PC8233在CC&#xff08;恒定輸出電流&#xff09;模式或CV&#xff08;恒定輸出電壓&#xff09;模式&#x…

莫托曼機器人測溫程序

1機器程序 2.1 主程序 MAIN&#xff1a; NOP CALL JOB:ORG *1 JUMP *5 IF IN#(41)OFF CALL JOB:遠程 IF IN#(25)ON CALL JOB:本地 IF IN#(26)ON CALL JOB:測距判斷 CALL JOB:最后一支 *5 CALL JOB:PZ IF IN#(35)ON CALL JOB:PZ IF IN#(65)ON JUMP *1 END 1.2 本地程序 1、本地…

代碼隨想錄算法訓練營Day 60 || 84.柱狀圖中最大的矩形

84.柱狀圖中最大的矩形 力扣題目鏈接(opens new window) 給定 n 個非負整數&#xff0c;用來表示柱狀圖中各個柱子的高度。每個柱子彼此相鄰&#xff0c;且寬度為 1 。 求在該柱狀圖中&#xff0c;能夠勾勒出來的矩形的最大面積。 1 < heights.length <10^50 < hei…

CVE-2022-0543(Redis 沙盒逃逸漏洞)

簡介 CVE-2022-0543是一個與Redis相關的安全漏洞。在Redis中&#xff0c;用戶連接后可以通過eval命令執行Lua腳本&#xff0c;但在沙箱環境中腳本無法執行命令或讀取文件。然而&#xff0c;攻擊者可以利用Lua沙箱中遺留的變量package的loadlib函數來加載動態鏈接庫liblua5.1.s…

VirtualBox下win主機如何訪問linux虛擬機文件夾

目錄 ?編輯 方法1&#xff1a;通過VirtualBox自帶的共享文件夾&#xff08;Win->linux&#xff09; 方法2&#xff1a;通過Samba方法本地網絡訪問(Linux->win) 我使用的VirtualBox版本為7.0.4,主機是Window系統&#xff0c;虛擬機是Linux系統 方法1&#xff1a;通過Vir…

【SpringBoot篇】Spring_Task定時任務框架

文章目錄 &#x1f339;概述&#x1f33a;應用場景&#x1f384;cron表達式&#x1f6f8;入門案例&#x1f38d;實際應用 &#x1f339;概述 Spring Task 是 Spring 框架提供的一種任務調度和異步處理的解決方案。可以按照約定的時間自動執行某個代碼邏輯它可以幫助開發者在 S…

PTA-快速冪

要求實現一個遞歸函數&#xff0c;高效求ab(1≤a,b≤62,ab<263)。 函數接口定義&#xff1a; long long int pow(int a, int b); 其中a 、b 是用戶傳入的參數。 裁判測試程序樣例&#xff1a; #include<iostream> using namespace std; long long int pow(int a,…

數據結構 棧與隊列

棧 棧是一種 后進先出&#xff08; LIFO&#xff09; 的數據結構&#xff0c;它是一種線性的、有序的數據結構。棧的基本操作有兩個&#xff0c;即入棧和出棧。入棧指將元素放入棧頂&#xff0c;出棧指將棧頂元素取出。棧的本質是一個容器&#xff0c;它可以存儲任何類型的數…

String轉Date,Date轉String

源碼&#xff1a; Date currentTime new Date();System.out.println("currentTime:"currentTime);SimpleDateFormat formatter new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String dateString formatter.format(currentTime);System.out.println(&quo…

【深度學習】學習率及多種選擇策略

學習率是最影響性能的超參數之一&#xff0c;如果我們只能調整一個超參數&#xff0c;那么最好的選擇就是它。相比于其它超參數學習率以一種更加復雜的方式控制著模型的有效容量&#xff0c;當學習率最優時&#xff0c;模型的有效容量最大。本文從手動選擇學習率到使用預熱機制…

qt msvc2010 qdatetime.h:122: error: C2589: “(”:“::”右邊的非法標記

報錯內容&#xff1a; C:\Qt\Qt5.4.0\5.4.0\msvc2010_opengl\include\QtCore\qdatetime.h:114: error: C2589: “(”:“::”右邊的非法標記 C:\Qt\Qt5.4.0\5.4.0\msvc2010_opengl\include\QtCore\qdatetime.h:114: error: C2059: 語法錯誤:“::” 解決方法&#xff1a; 打開qd…

2023小紅書Android面試之旅

一面 自我介紹 看你寫了很多文章&#xff0c;拿你理解最深刻的一篇出來講一講 講了Binder相關內容 Binder大概分了幾層 哪些方法調用會涉及到Binder通信 大概講一下startActivity的流程&#xff0c;包括與AMS的交互 全頁面停留時長埋點是怎么做的 我在項目中做過的內容&am…

RocketMQ-NameServer詳解

前言 ? RocketMQ架構上主要分為四部分, Broker、Producer、Consumer、NameServer&#xff0c;其他三個都會與NameServer進行通信。 Producer: ? **消息發布的角色&#xff0c;可集群部署。**通過NameServer集群獲得Topic的路由信息&#xff0c;包括Topic下面有哪些Queue&a…