ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Keil 4.72添加GD32F10x芯片:设备数据库与Flash算法配置指南

Keil 4.72添加GD32F10x芯片:设备数据库与Flash算法配置指南 “Keil 4.72添加GD32F10x芯片”这事看起来简单实际操作起来坑真不少。很多人拿到一块GD32F103C8第一反应是把它当STM32F103C8来用结果新建工程时在Keil 4.72的芯片列表里翻了半天压根找不到GigaDevice这个厂商只能回退到STM32的型号勉强建工程。这篇文章想把这个流程从头到尾讲清楚包括为什么要添加、添加的原理是什么、手动和自动两条添加路线以及添加完成后新建工程最容易被忽略的配置项。适合正在用4.72做老项目维护、或者手头调试器还不支持MDK5的工程师参考。1. 为什么要在Keil 4.72里折腾GD32F10x先说个背景。GD32F10x是国产厂商兆易创新推出的Cortex-M3内核MCU引脚排布、片上外设和ST的STM32F10x高度相似价格上有明显优势。这几年很多产品从STM32换到GD32硬件板子基本不用改软件改动也不大。但有一个环节容易被卡住旧的Keil MDK 4.72里没有GD32的芯片条目。不是Keil官方不想支持而是4.72这个版本发布时GD32还没有像现在这样普及。Keil 5.0以后的版本通过Pack Installer装一个DFP包就能识别GD32但Keil 4.72用的是老一套的器件数据库机制默认只带了几个大厂家的型号GigaDevice自然不在其中。所以想在4.72里用GD32F10x就必须手动把芯片信息“塞”进IDE里。很多人会问既然Keil 5那么方便为什么还在用4.72我实际接触下来原因五花八门公司加密软件只绑定了4.72的IDE环境、老项目从十年前就一直用4.72维护、组内同事习惯了老界面的操作逻辑、以及部分旧调试器在MDK5下驱动不完善。说白了工具不是越新越好能把手头活干完才是核心。所以“4.72添加GD32F10x”这个需求一直存在网上资料却大多只讲MDK5的做法对4.72要么一笔带过要么直接劝人升级。这篇文章就是给那些没法立刻换MDK5的人准备的。看完你能明白Keil识别芯片的内部逻辑能自己搞定设备数据库和Flash算法还能避开几个网上很少有人提到的坑。1.1 很多人搞不清的前提MDK与C51的区别动手之前有一个前提必须先确认你装的Keil 4.72是MDK-ARM版本还是C51版本。这句话看起来像废话但我见过太多人在这上面浪费了一下午。Keil的安装包分成几类C51版专门编译8051单片机MDK-ARM版编译ARM内核芯片。GD32F10x是Cortex-M3内核必须用MDK-ARM。如果你机器上装的是C51版本软件打开后设备列表里全是Atmel 89C51、STC89C52这类老古董再怎么折腾也不可能出现GigaDevice。区分方法很简单。打开Keil菜单栏Help - About uVision对话框里如果有ARM字样说明是MDK版本如果只有C51字样那就是装错了。更直接的办法是看安装目录MDK版本安装目录下会有一个ARM文件夹C51版本没有。如果你的电脑上同时装了C51和MDK两个版本那还要注意启动的是哪个快捷方式。MDK4.72的安装程序默认会在桌面生成“Keil uVision4”快捷方式但如果你后装了C51快捷方式可能会被覆盖指向C51版本。我遇到过几次这种情况点开软件发现是C51还以为是MDK坏了其实就是快捷方式指向错了。1.2 添加芯片的实质设备数据库与Flash算法在Keil里看到一个芯片型号背后实际上对应两套东西设备数据库和Flash编程算法。设备数据库Device Database是Keil用来描述芯片信息的文件后缀一般是.pdb。里面记录了芯片型号名称、内核类型、片内Flash和RAM容量、默认的启动文件、分散加载文件等。新建工程时你从列表里选中“GD32F103C8”编译器就会根据这条数据库记录自动带出正确的ARM启动代码和内存布局。没有这条记录Keil就不知道该怎么处理这颗芯片。Flash编程算法对应的是烧录器下载程序时执行的擦写代码文件后缀是.FLMFlash Loader Module。每款MCU的Flash控制器都有差异哪怕GD32和STM32在寄存器层面再像厂商还是会提供独立的一套FLM。烧录器下载程序时通过这个FLM文件对目标芯片进行擦除、写入、校验。如果你在工程里选的是STM32的FLM拿去烧GD32运气好能烧进去运气不好就报校验错误或者烧进去后芯片跑飞。所以给Keil 4.72添加GD32F10x说到底就两件事把GD32的设备数据库注册进IDE把GD32的FLM文件放到Keil的Flash算法目录里。理解了这两点后面不管是自动安装还是手动配置思路都会清楚很多。2. 准备工作与材料清单在正式开始操作之前先把材料准备齐不要装到一半才发现缺文件。2.1 确认Keil安装路径和版本先找到Keil 4.72的安装目录默认一般是C:\Keil\。这个目录下面应该同时存在UV4和ARM两个子目录。UV4是IDE主程序所在目录ARM目录下还有Flash、CMSIS、INC等子目录。把安装路径记清楚后面复制FLM、编辑TOOLS.INI都要用到。如果你的Keil安装到了D盘或者其他非默认路径也没关系操作逻辑一样只是路径要跟着改。建议顺手把C:\Keil\UV4\TOOLS.INI这个文件备份一份到桌面。TOOLS.INI是Keil启动时的核心配置文件加载什么编译器、注册哪些设备数据库全靠它。手动添加GD32设备数据库时需要编辑这个文件备份一下万一改坏了还能秒回滚。2.2 下载GD32官方支持包打开浏览器去兆易创新官网找GD32F10x的Keil支持包。官网下载页一般会把文档、固件库、IDE支持包分门别类列出来找名字里带“AddOn”“Keil”“MDK”字样的文件。下载时注意看文件名后缀。如果是.exe结尾这是MDK4时代的AddOn安装程序双击后会自动帮我们把所有事情办完。如果是.pack结尾那是MDK5的包格式4.72不能直接双击安装需要走后面的手动路线。不管下载到哪种格式我建议顺手把官方“GD32F10x Firmware Library”固件库也下了。这个固件库里有官方启动文件、系统初始化代码、外设驱动源码后面的工程模板全靠它省得自己从零敲寄存器。2.3 解压后先看目录结构拿到压缩包后先解压不要急着双击运行。花一分钟看一下里面有什么能避免很多奇怪的问题。一个标准的GD32F10x支持包里通常会有这几类东西AddOn安装程序或.pack文件一组.FLM后缀的Flash算法文件可能还有一个.pdb后缀的设备数据库文件另外就是Firmware固件库目录。把.FLM文件和.pdb文件的路径记一下后续手动配置时要用。有些精简版支持包可能不带.pdb文件那也没关系安装程序会在注册表里写信息或者直接修改TOOLS.INI只有.FLM的话说明设备数据库需要靠其他途径解决最常见的方式是安装程序完成Pdb的写入。3. 完整实操一步步把GD32F10x装进Keil接下来进入正题。我先讲自动安装再讲手动配置。自动安装省事但不是所有环境下都能成功手动配置虽然多几个步骤但胜在可控性好出问题也能定位。3.1 推荐路线使用官方AddOn自动安装如果支持包里带.exe安装程序优先用这条路。双击运行安装程序后它会要求你选择Keil安装目录这里要选到C:\Keil这一级别也就是UV4和ARM的上一级目录。安装程序会自动完成三件事把FLM文件复制到ARM\Flash目录把设备数据库放到Keil指定位置修改TOOLS.INI注册GD32条目。整个过程几乎是黑盒不需要人工干预。安装完成后启动Keil 4.72打开Project - New uVision Project在弹出的芯片选择窗口左侧厂商列表里应该能看到GigaDevice。展开之后GD32F10x系列型号都在里面了。这里有个容易被忽视的点AddOn安装程序可能会默认装到C盘哪怕你的Keil实际在D盘。如果安装时它找不到Keil路径就会自动用默认路径最后设备列表里依然没有GigaDevice。所以安装时一定要手动确认一下路径不要一路Next到底。3.2 手动添加设备数据库AddOn失效时的备选自动安装失败也不代表没救了手动添加完全可以解决。核心思路就是我前面说的两件事放FLM注册设备数据库。第一步找到解压出来的.FLM文件把它们全部复制到Keil安装目录下的ARM\Flash文件夹里。这个文件夹里已经有很多其他厂商的FLM文件直接把GD32的文件丢进去就行。第二步看支持包里有没有.pdb文件。如果有把它复制到Keil安装目录下的UV4\DeviceDatabase目录。这个目录在部分精简版安装里可能不存在不存在就自己新建一个。第三步用记事本打开C:\Keil\UV4\TOOLS.INI。在[ARM]段下面寻找形如DEVICE_DATABASE的记录行按同样的格式新增一行记录下来指向GD32的pdb文件。保存后重启Keil设备列表里就应该能看到GigaDevice了。第三部操作务必慎重。TOOLS.INI是一个格式要求很严格的配置文件路径分隔符、双引号、大小写都不能随意改。看到文件中已有其他设备的写法就照抄那个格式不要自由发挥。3.3 校验是否添加成功添加完了不能直接开工先校验一下。打开Keil新建工程在芯片选择窗口里找GigaDevice。如果找到了随便选一个型号比如GD32F103C8点OK。Keil会弹窗问你是否复制启动文件到工程目录选择“是”。然后看工程左边的Project窗格应该会出现一个类似startup_gd32f10x_md.s的启动文件。出现这个文件说明设备数据库已经生效了后面就可以正常写代码。如果没出现按顺序排查重启过Keil没有确认是MDK版本不是C51版本检查TOOLS.INI里新增那行路径是否正确确认pdb文件确实在指定目录里。这一步排查完之后95%的问题都能解决。4. 新建工程与关键配置芯片列表里能看到GD32只是第一步。接下来新建工程时还有几个配置点要是没设置对编译和下载阶段照样会报一堆错。4.1 选择GigaDevice芯片并搭建工程新建工程时在芯片选择窗口选中GigaDevice下的具体型号比如GD32F103C8或GD32F103RCT6注意选对Flash密度。GD32F10x和STM32F10x一样按Flash容量分成低密度、中密度、高密度、超高密度几个等级。Keil在创建工程时会根据设备数据库自动匹配对应的启动文件。比如GD32F103C8是64KB Flash中密度Keil会给你带出startup_gd32f10x_md.s如果是256KB Flash的高密度型号就应该用startup_gd32f10x_hd.s。选错启动文件的后果很隐蔽。编译器不会报错程序能正常编译链接也能通过但下载复位后程序常常跑不到main函数或者某个外设中断永远不响应。这种问题排查起来非常费劲因为不是报错而是“玄学”故障。所以在工程搭建阶段就要确保启动文件跟芯片密度是匹配的。4.2 启动文件与固件库别直接用STM32的很多做过STM32的人拿到GD32后会习惯性把原来的STM32工程整个复制过来只把芯片型号改成GD32。短时间点个灯、跑个串口可能没问题但只要用到中断就有隐患。GD32F10x的中断向量表跟STM32F10x不是完全一样。个别中断源和寄存器名称有差异如果用的是STM32的启动文件链接器不会报错但对应中断永远触发不了。这种Bug非常难查因为它没有任何报错提示就是功能不对。我自己的做法是从GD32官方固件库里复制一份标准模板工程出来在模板的基础上改代码。官方模板的目录结构一般是Libraries\CMSIS、Libraries\Periph、Project\Templates。CMSIS里有启动文件和系统初始化代码Periph里有外设驱动源码。把工程打开后在C/C选项卡的Define里加上USE_STDPERIPH_DRIVER并按芯片密度加上GD32F10X_MD或GD32F10X_HD这类宏定义。Include Paths里要包含CMSIS和Periph的头文件目录否则编译直接报找不到gd32f10x.h。工程模板这块不同版本的固件库宏定义细节略有不同具体以你下载的固件库说明文档为准。但总的原则是优先用官方模板和官方启动文件别把STM32那套照搬过来。4.3 下载算法与调试器设置芯片选对了编译也过了很多人在下载这一步卡住。打开Options for Target - Utilities点Settings切到Flash Download页面Programming Algorithm列表里应该有一个和芯片容量匹配的GD32算法文件。如果列表里只有STM32F10x的FLM建议清掉换GD32的。因为GD32的FLM对Flash状态位、写保护的处理跟STM32有细微差别用STM32的FLM烧GD32偶尔会出现烧录成功但校验失败或者第二次下载报错的奇怪现象。换成GD32自己的FLM后这些现象基本消失。调试器选择上最常见的搭配是GD-Link对应Keil里的CMSIS-DAP Debugger。用ST-Link连GD32也可以在Debug选项卡右上角把调试器改成ST-Link Debugger。如果用的是J-Link建议在J-Link的芯片选择界面里选Cortex-M3通用目标能认出GD32的选项就优先选GD32。最后记得在Flash Download页面勾选Reset and Run。不勾的话程序下载完不会自动复位运行你还得手动按一下开发板上的复位键。5. 常见问题与排错实录下面把我在实际操作中遇到过的典型问题和排查思路整理成表格方便你对照着快速定位。现象可能原因处理方法设备列表找不到GigaDevice设备数据库未注册检查TOOLS.INI重新运行AddOn编译报错cannot open source file gd32f10x.h固件库头文件路径没添加在Include Paths里添加固件库目录Flash Download failed - Cortex-M3Flash算法缺失或不匹配添加对应的GD32 FLM文件下载成功但程序不运行Reset and Run未勾选 / 启动文件选错勾选Reset and Run检查启动文件Debug提示No ULINK Device Found调试器类型选错在Debug选项卡里改选实际使用的调试器Pack安装时报硬件错误把MDK5的pack用在了MDK4上改用AddOn安装或手动解压配置5.1 常见报错速查表“No ULINK Device Found”这个报错网上搜一下能出来一大堆很多人以为是自己电脑或开发板出了问题其实就是一个配置项的事。Keil工程默认的调试器可能被设置成了ULINK2/3而你插的是ST-Link、GD-Link或者J-Link。打开Options for Target - Debug把右上角下拉框改成你实际用的调试器类型错误立刻消失。“Flash Download failed - Cortex-M3”这个报错九成原因是Flash算法列表里没有GD32对应的FLM。有些工程是从STM32模板复制来的算法列表里只有STM32F10x High-density Flash这种条目把GD32板子接上去当然报错。处理方法就是在Flash Download页面里把STM32的算法删掉添加GD32的FLM。5.2 几个容易踩但搜不到的坑有几个问题不是报错而是行为异常网上很难搜到标准答案我在这里单独说一下。第一个是GD32F10x跑高频时莫名其妙跑飞。GD32F103的最高主频比STM32F103更高高频下Flash等待周期的设置跟STM32标准库的默认值不一定吻合。直接搬STM32的代码在72MHz能跑跑到108MHz或者更高时就开始复位或产生HardFault。解决办法是参考GD32固件库里的时钟初始化函数在高频场景用官方推荐的方式设置等待周期。第二个是外部晶振频率配置。GD32F10x的启动代码里系统时钟默认从内部HSI启动还是从外部HXTAL启动不同版本的固件库行为不一样。如果你的板子上没有焊接外部晶振但启动代码配置的是从外部晶振启动程序就会卡在时钟初始化里。处理方式是检查system_gd32f10x.c里的时钟配置按实际硬件情况选择晶振来源和频率。第三个是SWD连接不稳定。降低调试器SWD时钟频率比如从默认的4MHz降到2MHz或者1MHz很多连接问题会自然消失。这个方法在飞线连接、杜邦线比较长、接触不良的情况下非常好用。5.3 如果实在不行还有一条退路要是你花了一两个小时4.72还是认不出GD32或者TOOLS.INI改来改去把IDE弄崩了我建议换个思路。把当前工程备份一份去官网下载Keil MDK5在Pack Installer里搜索GD32F10x安装对应DFP包然后在MDK5里新建同款工程。虽然标题是4.72添加GD32F10x但实际项目不等人。真有急事先用MDK5把程序写出来验证完再回头解决4.72的问题也不迟。不过说实话我遇到过个别“精简版”的4.72安装包本身缺了不少组件不管怎么改TOOLS.INI都没用。这种环境下与其死磕不如把MDK5当作临时方案至少不耽误项目进度。6. 实战中沉淀下来的一些习惯前面把主流程讲完了最后聊点我自己积累下来的小习惯不算什么高深技术但能省不少时间。6.1 支持包离线备份与管理员权限下载下来的GD32 AddOn支持包和固件库我建议单独存一个离线目录别放在浏览器的下载文件夹里让它吃灰。官网有时候会调整下载栏目旧版本支持包可能过段时间就找不到入口了。手头留一份离线包换电脑、帮同事配环境时都能直接拿出来用。另外在Windows下给Keil装AddOn时尽量右键“以管理员身份运行”。我有一次在Win10上装AddOn一直提示写入失败设备列表里就是不出GigaDevice。后来发现是权限问题安装程序往C:\Keil目录写文件时被系统拦了。换成管理员权限运行一次成功。6.2 用临时替换法快速验证板子如果你只是手头有一块GD32F103C8的板子想临时验证一下能不能跑其实没必要专门建一个GD32工程。打开原来STM32F103C8的工程在Options for Target - Device里把芯片型号改成GD32F103C8前提是设备数据库已经添加成功再把Flash算法换成GD32的FLM编译下载板子基本就能跑起来。这个方法适合“救急”但不建议长期这么干。正式产品开发一定要从官方模板起步把启动文件、固件库、宏定义都切到GD32的标准上来。临时替换法只是省事隐藏的坑可不少。最后再分享一个小经验遇到“Flashing失败”这类情况别急着换硬件先看一眼Keil左下角的Build Output窗口。很多时候提示信息已经写得非常直白了只是我们习惯了英文报错就跳过。静下心把报错原文逐字看懂尤其是“not found”“failed”“missing”这几个关键词基本都能定位到问题所在。
返回列表