STM32 问题汇总

目前刚开始学 stm32,遇到的问题都会记录下来,由于我有自己的笔记库,所以 CSDN 上最新遇到的问题不会及时更新

其中有些解决方法有用,有些可能没用

当然,还有一些处理上的通识,这里不再列出

CH340 驱动相关

部分 stm32 连接电脑不识别

# 解决:
# usb 转串口 需要 CH340 驱动,下载 CH340 驱动即可

参考:Windows10 部分系统无法安装USB转串口驱动问题解决_win10装不了usb转串口驱动_SlowFeather的博客-CSDN博客

CH340串口驱动的官网下载链接地址(包含各大操作系统平台)_ch340串口驱动下载_零号萌新的博客-CSDN博客

添加依赖

参考:C:\Keil_v5\ARM\ARMCC\include\stdint.h contains an incorrect path. - DawnTraveler - 博客园

注册 ARM:Login – Arm Account

芯片匹配

Warning #440: Requested device 'STM32F401CC' is substituted with variant 'STM32F401CCUx' for target 'Target 1'

# 解决:
# 打开 Options for Target,找到 Device,选择其它芯片类型,然后再选回来,点击 OK 按钮

参考:STM32开发笔记39: Keil打开时提示”Warning #440“警告的解决方法_snmplink的博客

当打开一个文件,出现 device not found
不用管它,直接点击确定

# 解决:
# 说明程序是基于 STM32F103VE 这板子写的,只要是 F103 都可以运行

添加依赖

在 STM32F103 中,明明有 .h 头文件的包,但还是不能被程序识别

# 解决:
# 1.打开 Options For Target -> C/C++ -> Define 里添加 USE_STDPERIPH_DRIVER, STM32F10X_HD
# 2.将包目录(里面包含.h文件)添加到 Options For Target -> C/C++ -> Include Paths 里

参考:【MDK KEIL】keil添加文件夹目录结构(批量添加.c和.h文件到工程中)(keil添加头文件路径)_IT小生lkc的博客-CSDN博客

启动文件

No section matches selector - no section to be FIRST/LA
没有启动文件

# 解决:
# core 里添加一个 starup.xxx.s 的文件

参考:关于keil编译报sct(7): error: L6236E: No section matches selector - no section to be FIRST/LA处理方法_飞翔的卡布达的博客-CSDN博客

重复定义

.\\Objects\\1.axf: Error: L6200E: Symbol SysTick_Handler multiply defined (by stm32f10x_it.o and delay.o).
重复定义

# 解决:
# 一般都是删除 delay.c 里的 SysTick_Handler 的函数或变量

参考:Error: L6200E: Symbol SysTick_Handler multiply defined (by systick.o and stm32f4xx_it.o)_上官_栖凤的博客-CSDN博客

重复定义


配置 stm32F407 调试功能
DBGMCU_APB2_FZ_DBG_TIMx_STOP 用于停止对 TIMx 定时器调试的宏定义

// 解决
注释掉里面的内容就行

定义不兼容

system_stm32f4xx.c(445): error:  
#147: declaration is incompatible with "const uint8_t AHBPrescTable[16]"  
(declared at line 59 of "system_stm32f4xx.h")

// 可能 system_stm32f4xx.h 与 system_stm32f4xx.c 不兼容,一个是标准库的,一个是 HAL 库的

文件带黄色钥匙

用keil打开的工程,里面的文件带黄色的小锁怎么办_keil文件加锁-CSDN博客

// 解决
取消只读选项

设备拒绝连接

connection refused due to device mismatch

// 解决
// options for target -> debug -> setting -> pack -> 关闭 ENABLE 选项

keil报错:connection refused due to device mismatch 和 invalid rom table_connection refused due to device mismatch! device -CSDN博客

下载速度过快

invalid rom table
// 原因:下载速度太快 或者 没有设置成 sram 启动

// 解决:
// 降低下载速度
// 调成 SRAM 下载模式:把 BOOT0 BOOT1 都接 0 低电平
// 重新擦出 flash,时钟不匹配导致

nake

/core_cm3.c(411): error: non-ASM statement in naked function is not supported

// 原因:core_cm3.c和core_cm3.h 太老导致,2009 年的版本,ST 已经停止维护

// 解决 1:
// 删除 core_cm3.h,core_cm3.c
// 下载 STM32cube_FW 软件包
// 从 \\CMSIS\\Core\\Include 下拷贝 cmsis_armcc.h、cmsis_armclang.h、core_cm3.h、cmsis_compiler.h、cmsis_version.h 到工程 lib 下
// 编译器会自动改用 CMSIS 标准接口
CMSIS 是 ARM 的官方标准接口,坏处是 CMSIS 屏蔽了实现细节,但这是趋势

// 解决 2:将版本调低,从 AC6 调整到 AC5

\\AppData\\Local\\Arm\\Packs\\ARM\\CMSIS\\6.1.0\\CMSIS\\Core\\Include
\\AppData\\Local\\Arm\\Packs\\STM32Cube_FW_F1_V1.8.0\\Drivers\\CMSIS\\Core\\Include

STM32踩坑:keil编译工程后,core_cm3.c出现4处报错_stm32 cm3.c-CSDN博客

下载:

https://www.st.com.cn/zh/embedded-software/stm32cubef1.html

GitCode - 全球开发者的开源社区,开源代码托管平台

具体操作

这里先删除原来工程里的两个头文件,再从标准库中复制以下五个最新的文件,到当前工程中,keil里会自动更新,识别到 CMSIS 的接口

代码不兼容

// 迁移到设备包:大多数Cortex-M设备现在通过软件包支持。你可以下载相应的软件包并将项目迁移到新格式

// 安装旧版支持:如果你想继续使用旧的项目格式,可以安装MDK版本5的Cortex-M设备旧版支持

一般选择第一个就行

编译器版本

*** Target 'Target 1' uses ARM-Compiler 'Default Compiler Version 5' which is not available.
*** Please review the installed ARM Compiler Versions:
   'Manage Project Items - Folders/Extensions' to manage ARM Compiler Versions.
   'Options for Target - Target' to select an ARM Compiler Version for the target.
*** Build aborted.
Build Time Elapsed:  00:00:00

// 解决:
// 说明当前编译器不支持此项目,换 AC5,但下图并未装 AC5

Keil5遇到:*** Target ‘xxx‘ uses ARM-Compiler ‘Default Compiler Version 5‘ which is not available._*** target 'target 1' uses arm-compiler 'default c-CSDN博客

Keil 5.37 以后不再默认安装 Compiler Version 5 (AC5\\ARMCC) 编译器
而是默认安装 Compiler Version 6.xx 编译器

在 MDK-ARM 5(AC5)及更早版本会使用 armcc 编译器 (__CC_ARM)
在 MDK-ARM 6(AC6)用 armclang 替换了 armcc 编译器 (__CLANG_ARM),AC6 基于现代 LLVM 编译器框架

用 AC6 产生几百个报错的大概率原因是用 STM32 CubeMX 生成代码,而截止2023/03,
Cube MX 只支持自动生成Compiler Version5的Keil代码,不支持 Version 6,
所以需要安装Version5然后用5编译

AC6 介绍:https://zhuanlan.zhihu.com/p/421369236

AC5 下载:

Keil MDK 5.37 及之后版本 安装 AC5(ARMCC) 编译器详细步骤_keil ac5-CSDN博客

百度网盘 请输入提取码 1wEt

编译标准

// 原因
inline 是 C99 标准中引入的关键字,用于指示编译器将函数内联展开,以减少函数调用的开销

// 解决
切换为 C99

文件名问题

// 原因
本地文件名字大小写不正确,修改即可

// 解决
项目路径中最好全英文

输出编码问题

Minibalance.c(16): warning: illegal character encoding in string literal [-Winvalid-source-encoding]
   16 |         printf("<BF><A8> <B6><FB> <C2><FC> <C2><CB> <B2><A8> <CA><E4> <B3><F6> Pitch:  %f\\r\\n  ", Angle_Balance); // y
      |                 ^~~~~~~~ ~~~~~~~~ ~~~~~~~~ ~~~~~~~~ ~~~~~~~~ ~~~~~~~~ ~~~~~~~~
1 warning generated.

// 解决:
// 修改编码为 GB2312,但不推荐,不如英文输出

编译器版本问题

当前编译器为 AC6,而项目应该使用 AC5
// 解决
// 可以修改替换文件,或者下载 AC5

ISO c99 and later do not support implicit int
// 解决
// 加 void 即可

【STM32杂谈】Keil:从AC5到AC6_*** please review the installed arm compiler versi-CSDN博客

keil 关于error: #260-D: explicit type is missing (“int“ assumed)_error: #260-d: explicit type is missing ("int" ass-CSDN博客

修改替换文件:

// usart.c
// AC5
#if 1
#pragma import(__use_no_semihosting)

struct __FILE
{
	int handle;
};
FILE __stdout;
// 设置 __sys_exit() 避免使用半主机模式
_sys_exit(int x) 
{
    x = x;
}

// AC6
#if 1
__ASM (".global __use_no_semihosting");

FILE __stdout;
// 设置 __sys_exit() 避免使用半主机模式
void _sys_exit(int x)
{
    x = x;
} 
// sys.c
// AC5
void WFI_SET(void)
{
	__ASM volatile("wfi");		  
}

void INTX_DISABLE(void)
{		  
	__ASM volatile("cpsid i");
}

void INTX_ENABLE(void)
{
	__ASM volatile("cpsie i");		  
}

void MSR_MSP(u32 addr) 
{
	__ASM volatile("MSR MSP, r0"); 			//set Main Stack value
	__ASM volatile("BX r14");
}

// AC6
// 执行汇编指令 WFI
__asm void WFI_SET(void)
{
    WFI;
}
// 关闭所有中断
__asm void INTX_DISABLE(void)
{
    CPSID I;
}
// 打开所有中断
__asm void INTX_ENABLE(void)
{
    CPSIE I;
}
// 设置栈顶地址
__asm void MSR_MSP(u32 addr)
{
    MSR MSP, r0 // set Main Stack value
                 BX r14
}

修改编译选项:

无法跳转函数

一般情况下,工程重新编译过,并且通过编译且没有报错,
能够通过 "Go To Definition Of " 跳转到相应的函数

// 建议设置快捷键

Keil里面无法使用“Go To Definition Of ”跳转到相应的函数解决办法_keil "go to definition of" 不跳转-CSDN博客

core_cm4.h 找不到 core_cmInstr

..\CORE\core_cm4.h(169): error:  #5: cannot open source input file "core_cmInstr.h": No such file or directory
  #include <core_cmInstr.h>                /* Core Instruction Access                         */

# 原因:
当前 code 为 uv4,在 uv5 上编译失败

# 解决:
# 1.替换 USER 里的以下 6 个文件
\Arm\Packs\STM32_StdPeriph_Driver\en.stsw-stm32065_v1-9-0\STM32F4xx_DSP_StdPeriph_Lib_V1.9.0\Libraries\CMSIS\Device\ST\STM32F4xx\Include
- stm32f4xx.h
- system_stm32f4xx.h
 
\Arm\Packs\STM32_StdPeriph_Driver\en.stsw-stm32065_v1-9-0\STM32F4xx_DSP_StdPeriph_Lib_V1.9.0\Project\STM32F4xx_StdPeriph_Templates
- stm32f4xx_conf.h
- stm32f4xx_it.c
- stm32f4xx_it.h
- system_stm32f4xx.c

# 2.在 CORE 里添加以下 3 个文件
- core_cmFunc.h
- core_cmInstr.h
- core_cmSimd.h

# 3.FWLIB 里的文件也替换成同样版本的

添加引用库:

KEIL5报 core_cm4.h(169): error:错误解决办法_armcm4.h定义错误-CSDN博客

替换为 CMSIS_5:

https://github.com/ARM-software/CMSIS_5/blob/develop/CMSIS/Core/Include/core_cm4.h

microLIB 问题

Warning: You are compiling one or more files of source type C++ and have selected 'use MicroLIB'. 
MicroLIB does not support C++

/// 程序使用了 C++,而且勾选了 microLIB,microLIB 不支持 C++
// 把 microLIB 前的勾去掉,关闭一下半主机模式,如果使用 printf 再重定向一下

__ttywrch 缺少

.\\OBJ\\USART.axf: Error: L6915E: Library reports error: __use_no_semihosting was requested, but _ttywrch was referenced

// 关掉了半主机模式,函数 __ttywrch 缺少

// 重写一个半主机模式下的接口即可
int _ttywrch(int ch)    
{
		ch = ch;
		return ch;
}

_sys_exit 缺少

..\\SYSTEM\\usart\\usart.c(30): error:  #260-D: explicit type is missing ("int" assumed)

// 原因:
// 缺少返回类型

// 解决:
// 加上 void
void _sys_exit(int x) 
{ 
	x = x; 
}

### 解决方案 当遇到 `Target 'LED' uses ARM-Compiler 'Default Compiler Version 5' which is not available` 的错误时,这通常是因为项目设置中指定了一个未安装的 ARM 编译器版本。以下是具体的解决方案: #### 安装 ARM Compiler Version 5 (AC5) 1. **下载并安装 AC5 编译器** 需要从官方渠道下载 ARM Compiler Version 5 (AC5),并将它安装到 Keil 软件目录下的 `{Keil安装路径}/ARM` 文件夹中[^3]。 2. **验证安装路径** 确保编译器已成功安装,并且其文件结构位于指定的子目录下。例如,默认情况下应为: ``` C:\Keil_v5\ARM\ARMCC\ ``` #### 修改项目的编译器配置 1. **通过菜单管理编译器版本** 打开 Keil IDE 中的 `Project -> Manage -> Project Items` 对话框(或者直接点击工具栏上的三色方格图标),进入 `Folders/Extensions` 页面来确认当前可用的编译器列表。 2. **为目标选择合适的编译器版本** 进入 `Options for Target -> Target` 设置页面,在其中找到关于 ARM 编译器的选择项,将其更改为实际已经安装的版本号(如 Version 5 或其他支持的版本)[^4]。 3. **重新构建工程** 更改完成后保存设置,清理之前的构建缓存并通过 `Rebuild All` 命令再次尝试整个项目的完全重建过程。 --- ### 示例操作流程 以下是一个简单的 Python 脚本模拟如何自动化检测和提示用户完成上述步骤的过程: ```python def check_arm_compiler_availability(project_path, keil_install_dir): """ 检查目标项目使用的 ARM 编译器是否可用。 :param project_path: 项目文件路径 (.uvprojx) :param keil_install_dir: Keil 工具链安装根目录 :return: 是否存在兼容的编译器版本 """ import os armcc_installed_versions = [] expected_version = "Version 5" # 列举所有可能存在的编译器版本 if os.path.exists(os.path.join(keil_install_dir, "ARM", "ARMCC")): armcc_installed_versions.append(expected_version) if expected_version in armcc_installed_versions: print(f"ARM Compiler {expected_version} found at {os.path.join(keil_install_dir, 'ARM', 'ARMCC')}.") return True else: print(f"No compatible ARM Compiler version detected.") return False if __name__ == "__main__": result = check_arm_compiler_availability(r"C:\Projects\lifex_motorcontroller.uvprojx", r"C:\Keil_v5") if not result: print("Please install ARM Compiler Version 5 and update your project settings accordingly.") ``` 此脚本仅作为辅助说明用途;具体实现仍需依赖手动调整 Keil GUI 界面中的参数设定。 --- ### 注意事项 - 如果仍然无法解决问题,则可以考虑升级至最新版 KEIL MDK 并重复以上步骤以获得更好的兼容性和技术支持。 - 此外还需注意不同版本之间可能存在细微差异,请参照对应文档进一步排查潜在冲突情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值