Keil基于ARM Compiler 5的工程迁移为ARM Compiler 6的工程

环境:

keil版本为5.38,版本务必高于5.30

STM32F4的pack包版本要高于2.9

软件包下载地址:https://zhuanlan.zhihu.com/p/262507061

一、更改Keil中编译器


更改后编译,会报很多错,先不管。

二、更改头文件依赖

观察报错会有条报错为:error: unknown register name vfpcc in asm,这是CMSIS库的版本过低,导致AC6不兼容,解决方法是升级CMSIS库,链接里面有下载包,一定要确保CMSIS库在5.0以上。

如果你Keil的CMSIS版本是5.0以上的还是存在报错,说明你工程里面的文件是老版本的,就不用升级了,按照下面步骤继续。

1. 删除工程CORE里面的.h文件

把这四个.h文件都删除

2.把Keil安装路径中的.h新文件复制到工程中的core文件夹中
3. 如果你工程用到了FreeRTOS,还需要用FreeRTOS源码中GCC的文件代替你工程中RVDS的文件。

三、修改部分语法

新的AC6中部分语法有更新,完成上述步骤后还可能报错,根据报错位置修改为AC6支持的语法格式就可以了。

错误有 pragma import(__use_no_semihosting) 、__asm void WFI_SET(void)、__FILE 等

print重定向修改为如下,这种格式能同时兼容AC5和AC6编译器,其中__CC_ARM是AC5编译器定义的标识,GNUC 和__clang__是AC6定义的标识,由此判断编译器版本。

c 复制代码
#if 1
#ifdef  __CC_ARM
#pragma import(__use_no_semihosting)
struct __FILE 
{ 
	int handle; 
}; 
#elif defined ( __GNUC__ ) || defined (__clang__)
__asm (".global __use_no_semihosting\n\t");   
#endif


FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
void _sys_exit(int x) 
{ 
	x = x; 
} 
//重定义fputc函数 
int fputc(int ch, FILE *f)
{ 	
	while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
	USART1->DR = (u8) ch;      
	return ch;
}

#endif
相关推荐
踏着七彩祥云的小丑8 小时前
嵌入式——认识电子元器件——电容系列
单片机·嵌入式硬件
NQBJT9 小时前
DMA —— 让 CPU “偷懒”的数据搬运工
stm32·单片机·dma·嵌入式
xiangw@GZ10 小时前
EMC原理:CS传导抗扰度测试总结
单片机·嵌入式硬件
三佛科技-1341638421210 小时前
PL3325CS/CD/CH/CE 与PL3325BE 之间的对比与联系(应用功率与典型应用电路)
单片机·嵌入式硬件·物联网·智能家居·pcb工艺
blevoice10 小时前
杰理智能蓝牙音响开发板AC696N:文件系统操作API精讲
单片机·物联网·杰理蓝牙芯片·ac6966b蓝牙音响方案·杰理智能音箱开发·杰理ac6965e蓝牙音频开发
恶魔泡泡糖11 小时前
stm32F103C8T6标准库流水灯1——输出模式
stm32·单片机·嵌入式硬件
三佛科技-1341638421211 小时前
FT838NB1-RT_5W(5V1A)原边反馈(5级能效)典型应用电路分析
单片机·嵌入式硬件·物联网·智能家居·pcb工艺
森利威尔电子-13 小时前
森利威尔SL3075 脚位完全兼容 TPS54560 65V降压恒压芯片5A电流能力
单片机·嵌入式硬件·集成电路·芯片·电源芯片
神一样的老师14 小时前
【兆易创新GD32VW553开发板试用】 BSP 从 GitHub 下载与编译指南
单片机·github·rt-thread
VBsemi-专注于MOSFET研发定制14 小时前
协作机器人螺丝锁付系统功率MOSFET选型方案——高效、精准与安全驱动系统设计指南
单片机·安全·机器人