STM32 编译下载后不能运行 您所在的位置:网站首页 程序没有错误但无法正常运行 STM32 编译下载后不能运行

STM32 编译下载后不能运行

2023-12-19 19:45| 来源: 网络整理| 查看: 265

STM32 编译后不能运行 项目场景:问题描述:原因分析:解决方案:不能运行的其他几个原因:

项目场景:

Keil MDK中创建STM32F103项目,可以编译下载,但程序不能正常运行。

问题描述:

仿真调试下,偶尔可以单步运行,全速下不能执行

原因分析:

程序中使用的printf函数,重定向到Uart1。需要勾选“Use MicroLIB”。 1.microlib 是缺省 C 库的备选库。 它用于必须在极少量内存环境下运行的深层嵌入式应用程序。 这些应用程序不在操作系统中运行。microlib 不会尝试成为符合标准的 ISO C 库。 microlib 进行了高度优化以使代码变得很小。 它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性。某些库函数的运行速度也比较慢,例如,memcpy()。 2.microlib 与缺省 C 库之间的主要差异是: microlib 不符合 ISO C 库标准。 不支持某些 ISO 特性,并且其他特性具有的功能也较少。 microlib 不符合 IEEE 754 二进制浮点算法标准。 microlib 进行了高度优化以使代码变得很小。 无法对区域设置进行配置。 缺省 C 区域设置是唯一可用的区域设置。 不能将 main() 声明为使用参数,并且不能返回内容。 不支持 stdio,但未缓冲的 stdin、stdout 和 stderr 除外。 microlib 对 C99 函数提供有限的支持。 microlib 不支持操作系统函数。 microlib 不支持与位置无关的代码。 microlib 不提供互斥锁来防止非线程安全的代码。 microlib 不支持宽字符或多字节字符串。 与 stdlib 不同,microlib 不支持可选择的单或双区内存模型。 microlib 只提供双区内存模型,即单独的堆栈和堆区。 可以合理地将 microlib 与 --fpmode=std 或 --fpmode=fast 配合使用。 microlib 中的函数负责: 创建一个可在其中执行 C 程序的环境。 这包括: 创建一个堆栈 创建一个堆(如果需要) 初始化程序所用的库的部分组成内容。 调用 main() 以开始执行程序。 要使用 microlib 构建程序,必须使用命令行选项 ??library_type=microlib。 根据需要,编译器、汇编程序或链接器可使用此选项处理不同的文件。 将此选项与链接器配合使用时,将覆盖所有其他选项。

解决方案:

1.更改工程设置 Option->Target->Code Generation->Use MicroLIB 复选框打钩。 一般来说,针对一运行就停止的情况,将Use MicroLIB勾选之后,重新编译,运行就可以了 2.加入以下代码,支持printf函数,而不需要选择use MicroLIB

#if 1 #pragma import(__use_no_semihosting) //标准库需要的支持函数 struct __FILE { int handle; }; FILE __stdout; //定义_sys_exit()以避免使用半主机模式 _sys_exit(int x) { x = x; } //重定义fputc函数 int fputc(int ch, FILE *f) { //USART_SendData(USART1, (u8) ch); USART1->DR = (u8) ch; /* Loop until the end of transmission */ while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET) { } return ch; } #endif 不能运行的其他几个原因:

1.调试时,程序总是停止在LDR R0, =SystemInit 语句,可能原因:堆栈空间默认的太小 默认startup_stm32f10x_hd.s中 Stack_Size EQU 0x00000400,如果改大之后,可能调试就可以正常运行。

2.调试时,程序停止在HardFault_Handler的问题(引用网上的总结) 原因有两个,堆栈溢出和数组越界。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有