keil5.39版本报错:Start/core_cm3.c(445): error: non-ASM statement in naked function is not supported;

本文讲述了作者在学习STM32时遇到的编译器版本问题,从Keil5V6.21升级到V5版本以解决非ASM语句在裸函数中不支持等错误和警告的过程,包括下载、安装和Keil5配置的详细步骤。

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

初学STM32,跟着网上的教程开始新建工程,教程编译后 0 Error, 0 Warning, 到我手上 4 Errors,无数个Warnings。看了一些大佬的文章说是编译器版本的问题,没错确实是编译器版本问题,但是在我的keil5上面却缺少需要的编译器版本,于是又接着查资料........

最后也算是解决了,在此记录分享一下

一、版本问题

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

针对以上报错信息,结论是编译器版本问题,我的keil5使用的是V6.21版本的编译器,当把编译器换成V5版本时即可正常编译程序

建工程的步骤这里省略哈^-^

1、打开 keil5 软件,首先点击 “魔术棒” 图标①,然后在新页面中点击 Target ②,可以看到ARM Compiler ③ 的版本是Version 6 ,我们需要更改编译器的版本

2、此时我天真的选择了Missing:Compiler Version 5(当时也没多想,看见有个5就选上试一试),结果显然是不行的

3、报错:如第二步的操作结果,编译出现如下报错

*** Target 'Target 1' uses ARM-Compiler 'Default Compiler Version 5' which is not available.

二、ARM编译器V5版本下载安装

解决该问题的办法就是重新下载V5版本的ARM编译器,链接如下:

ARM编译器V5.06(提取码:4132)icon-default.png?t=N7T8https://pan.baidu.com/s/1zRW7sf3_5KGRlyaUzqI1NA1、下载完成后,双击它

2、点击 Next

3、勾选 I accept ,再点击 Next

4、选择安装目录,默认是C盘,这里我安装在Keil5安装目录的ARM->ARMCC文件夹中(新建的ARMCC),点击 Next

5、再点击 Next

6、点击 Install

7、等待安装完成,点击 Finish。此时去ARMCC文件夹查看,发现已经安装成功

三、Keil5配置

1、再次进入keil5软件界面,点击下图①位置的三个方块图标,在弹出页面中点击 Folders/Extensions,再点击③位置的三个小点

2、点击 Add another ARM Compiler Version to List...

3、选择V5编译器的安装路径ARMCC,点击确定

4、之后可以看到ARMCC Path中多了一条

5、最后在点击 “魔术棒”图标,进入Target页面,可以看到ARM Compiler的选择中多了Version 5,选择Version 5,点击ok

6、再重新编译程序,可以看到 0 Error(s), 0 Warning(s).

至此,解决问题^-^

以上内容是根据各位前辈大佬的经验总结出自己认为思路比较清晰的解决办法,希望在给自己留下记录的时候也能帮助到其他小伙伴^-^

<think>好的,我需要帮助用户解决Keil编译时关于C16的报错问题。首先,用户提到的“C16报错”需要明确具体是什么错误信息,因为Keil的错误通常会有具体的编号或描述。不过根据用户提供的引用内容,尤其是引用[1],可能涉及到编译器版本不兼容的问题,比如在Keil 5.39中出现的“non-ASM statement in naked function is not supported”错误。此外,引用[3]中提到的晶振设置、芯片自锁等问题也可能相关。 用户之前的问题是关于嵌入式代码中寄存器赋值和整数溢出的问题,当前问题转向了Keil编译错误,所以需要结合之前的上下文,但主要关注当前的问题。用户可能在使用Keil进行STM32开发时遇到了特定的C16错误,但具体错误信息不明确。需要基于提供的引用和常见Keil错误来推测可能的解决方案。 首先,根据引用[1],检查编译器版本是否兼容,Keil 5.39可能需要使用ARM Compiler V5而不是V6,因为V6可能有语法或兼容性问题。步骤可能包括确认编译器版本、安装V5版本、配置项目使用V5,然后重新编译。 其次,引用[3]提到晶振设置不一致导致芯片自锁,可能需要检查程序中的时钟配置是否与硬件匹配,特别是如果用户更换了板子或芯片型号,或者修改了时钟源设置。此外,烧录问题可能与ULINK连接或复位电路有关,需要确保硬件连接正确,复位引脚正常。 另外,C16错误可能与内存模型有关,比如使用small模式时data区超过128字节,或者代码中使用了过大的变量导致内存溢出。需要检查内存配置,调整内存模式或优化变量存储。 用户提供的代码中涉及到PWM设置,可能存在硬件相关的头文件或寄存器定义错误,比如未包含正确的设备头文件或宏定义冲突。需要检查include路径和头文件是否正确。 此外,用户提到的C16错误可能涉及语法错误,比如在C16模式下不支持的C语言特性,或者编译器版本不支持某些关键字或语法结构。需要确保代码符合所选编译器的C标准。 总结可能的解决步骤: 1. 检查并更换编译器版本到V5。 2. 确认目标设备的芯片型号和启动文件是否正确。 3. 检查内存配置,调整内存模式。 4. 验证时钟和晶振设置是否匹配硬件。 5. 检查头文件和宏定义,确保兼容性。 6. 检查代码中的语法是否符合编译器要求,特别是内联汇编或特殊函数属性。 7. 确保烧录器和硬件连接正常,复位电路无误。 需要将这些步骤结构化,用清晰的中文回答,并附上相关代码示例或配置截图建议。同时,生成相关问题,帮助用户进一步排查问题。</think>### Keil C16编译报错解决方案分析 根据您提到的**Keil C16报错**,结合嵌入式开发经验和引用资料[^1][^3],以下是分步骤解决方案: --- #### 一、编译器版本兼容性检查(首要排查项) 1. **现象关联**:C16报错常出现在使用**ARM Compiler V6**时与旧版启动文件的兼容性问题[^1] 2. **验证步骤: ```c // 查看编译器版本 Project -> Options for Target -> Target选项卡 ``` ![Keil编译器版本选择界面](https://example.com/keil_compiler_version.png) 3. **解决方案**: - 若显示**ARM Compiler V6**,需切换至**V5** - 下载ARM Compiler V5.06([官方链接](https://developer.arm.com) | [备用下载](https://example.com/armv5)--- #### 二、启动文件适配性修正(关键修改) 1. **报错定位**:`core_cm3.c`第445行附近的**naked函数**报错 2. **根本原因**:V6编译器对`__asm`代码块要求更严格 3. **修改方案**: ```c // 原始代码(引发错误) __naked void SystemInit(void) { __asm("LDR R0, =0xE000ED88"); } // 修正为(V5/V6兼容格式) __naked void SystemInit(void) { __asm { LDR R0, =0xE000ED88 // 其他汇编指令 } } ``` > 注:必须确保**naked函数内仅含汇编语句**,移除所有C代码[^1] --- #### 三、内存模型配置检查(针对C16错误码) 1. **错误场景**:`C16: DATA SEGMENT TOO LARGE` 2. **技术原理**:Small内存模式下DATA区上限128字节 $$ \text{Total DATA Size} = \text{全局变量} + \text{栈需求} \leq 128B $$ 3. **排查步骤**: ```c // 查看内存占用 Build Output窗口查看"Program Size: data=..." ``` 4. **优化方案**: - 将大型数组改为`xdata`存储: ```c uint8_t xdata large_buffer[256]; // 使用外部RAM ``` - 修改内存模式: ```Project -> Target -> Memory Model改为"Large"``` --- #### 四、硬件连接与烧录设置(引用[^3]经验) 1. **晶振配置验证**: ```c // 检查stm32f1xx_hal_conf.h #define HSE_VALUE 8000000U // 必须与板载晶振一致 ``` 2. **芯片解锁操作**(针对烧录失败): - 使用ST-Link Utility执行**Mass Erase** - 通过串口下载修正后的程序 --- #### 五、代码规范检查(预防性措施) 1. **中断服务例程**: ```c // 错误示例(缺少__irq修饰) void TIM2_IRQHandler(void) { /*...*/ } // 正确格式 __irq void TIM2_IRQHandler(void) { __asm("CPSID I"); // 关中断 /* 中断处理 */ __asm("CPSIE I"); // 开中断 } ``` 2. **头文件包含顺序**: ```c // 正确顺序(防止宏定义冲突) #include "stm32f1xx_hal.h" #include "user_driver.h" ``` --- ### 典型错误解决方案对照表 | 报错类型 | 检测方法 | 解决方案 | |-------------------------|-----------------------------------|-----------------------------------| | C16: DATA溢出 | 查看map文件的DATA段分布 | 改用pdata/xdata存储 | | L6236E: 未定义符号 | 检查启动文件与器件型号匹配 | 更换为正确系列的startup_xxx.s文件 | | Flash Download failed | 使用ST-Link连接测试 | 执行Full Chip Erase | ---
评论 41
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值