环境:
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