STM32程序进不了main函数奇葩现象---你不知道的原因

本文描述了一种在STM32开发中遇到的程序无法进入main函数的奇葩现象,主要表现为bootloader运行正常,但APP层无法执行。通过分析排除了printf函数的常见问题,通过仿真调试发现是由于SystemInit后的systick中断导致HardFault_Handler。解决办法是在进入main函数前关闭systick中断。文章强调了仿真调试在定位问题中的重要作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.现象

   在基于STM32开发一个项目过程中,遇到一个比较奇葩的现象:经常会时不时出现修改上层的应用代码导致程序运行不起来,进不去main函数。这个STM32程序是分为bootloader层和APP层,出现这个奇葩现象的时候,bootloader层是可以正常运行的,但是跳转到APP层的时候,就发现进不了main函数。

2.分析

   一开始也是找不到原因何在,通过网上搜索发现也有类似出现STM32进不去main函数的,原因多数是因为printf函数的应用导致的。但通过代码检查发现我遇到的这个奇葩现象,并非printf函数运用导致。这里也借此了解一下printf函数在stm32中使用注意事项,避免出现这个错误。

printf函数:

  printf之类的函数,使用了半主机模式,所以要利用目标ARM器件的输入输出设备,首先要关掉半主机机制,然后再将输入输出重定向到ARM器件上,如printf和scanf,需重写fputc和fgetc.

具体代码实现可参考如下(重写fputc):

#if 1
#pragma import(__use_no_semihosting)  //确保没有从C库链接使用半主机的函数
//标准库需要支持的函数
struct __FILE
{
    int handle;
};

FILE __stdout;
//以避免使用半主机模式
void _sys_exit(int x)
{
    x = x;
}

//重定义fputc函数
int fputc(int ch, FILE *f)
{
    while(
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Psyduck_ing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值