STM32进入死循环HardFault_Handle()或Error_Handler()解决方案

1, void Error_Handler(void) 死循环。

现象:跳转不到 main() 函数
原因:一般是因为没有用微库进入半主机模式

在这里插入图片描述在这里插入图片描述

解决方案:MDK中Options => Target => Use MicroLIB 打钩

在这里插入图片描述

2, void HardFault_Handler(void) 死循环。

现象:跑着跑着进入了 HardFault_Handler() 死循环。
原因:
1、内存溢出或者访问越界。
2、堆栈溢出,程序指针指飞。
3、硬件电路错误!(现象:没有自己的程序,官方或STM32CubeMX程序也会死在这里)

在这里插入图片描述
硬件问题现象

内存堆栈问题 解决方案11、函数内部变量占用空间较大时,定义为全局变量或者静态变量,减少堆栈的占用。
2、多使用指针解决数据的复制,同时减少内存的占用。
内存堆栈问题 解决方案2:修改堆栈大小

在这里插入图片描述
STM32CubeMX 修改堆栈大小 Stack。(通常说的堆栈指的是 栈)
在这里插入图片描述

硬件问题 解决方案:检查硬件修改正确!
1,电源
2,复位电路
3,时钟电路
4,启动电路 BOOT0、BOOT1
5、芯片上都有个VCAP脚。他需要外接一个电容到地,目的是为了保证内部主调压器的电压稳定,选择不当可能会引起程序无法下载或者运行不稳定的情况。

  • 19
    点赞
  • 93
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
函数 HAL_UART_MspInit() 是针对 STM32 系列芯片的 HAL 库中 UART 模块的初始化函数,用于初始化 UART 外设的 GPIO 引脚、时钟以及中断等相关配置。 以下是一个使用 HAL_UART_MspInit() 函数的示例代码: ```c void MX_USART1_UART_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); } HAL_UART_MspInit(&huart1); } void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(uartHandle->Instance==USART1) { /* UART1 clock enable */ __HAL_RCC_USART1_CLK_ENABLE(); /* UART1 GPIO Configuration PA9 ------> USART1_TX PA10 ------> USART1_RX */ __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF7_USART1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } } ``` 在该示例代码中,首先调用了 HAL_UART_Init() 函数初始化了 UART 外设,然后调用了 HAL_UART_MspInit() 函数进行 GPIO 引脚、时钟等初始化操作。该函数中的代码针对的是 USART1 的初始化,根据芯片手册的引脚定义,将 PA9 和 PA10 配置为复用推挽输出模式,并使能 GPIO 时钟。最后调用了 HAL_GPIO_Init() 函数进行 GPIO 初始化配置。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值