目前刚开始学 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 的文件
重复定义
.\\Objects\\1.axf: Error: L6200E: Symbol SysTick_Handler multiply defined (by stm32f10x_it.o and delay.o).
重复定义
# 解决:
# 一般都是删除 delay.c 里的 SysTick_Handler 的函数或变量
重复定义
配置 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 选项
下载速度过快
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
具体操作
这里先删除原来工程里的两个头文件,再从标准库中复制以下五个最新的文件,到当前工程中,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
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博客
修改替换文件:
// 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:
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;
}