在刚开始做嵌入式项目的时候,很多人都会碰到一些问题,就是不清楚IAR工程模板怎么选择,或者发现IAR工程模板和芯片型号不匹配,这些情况经常发生;从表面上看这好像只是点错了模板,但实际上,启动文件、链接文件、芯片头文件,还有调试配置和下载算法这些东西都会受到连累;要是模板弄错了,严重的可能导致程序根本没法在芯片里跑起来,轻一点的也会在编译时疯狂报错,所以说,在刚开始动手之前,最好把芯片的型号、用什么内核、Flash和RAM有多大、工程是从哪来的,都先一条一条对清楚。
一、IAR工程模板怎么选择
在挑IAR工程模板的时候,不能光看那是哪个厂家做的,或者看它属于哪个系列,就直接拿来用;因为哪怕是同一个系列的芯片,它们的存储空间、外设寄存器还有启动文件也经常不一样,模板还是得找跟实际型号越接近的越好。
1、先确认芯片完整型号
先把芯片表面的字字句句、原理图的BOM表或者项目需求表翻出来看一遍,把具体的完整型号确定下来,比如后面带不带什么封装、Flash容量有多大、温度等级后缀是什么;在IAR软件里面,有些模板只是粗略地按照芯片系列放在一起,有些才会分得比较细,连具体型号都有;如果只模糊地知道“STM32F4”或者“NXP LPC”这种大范围的名字,就很容易选到一个虽然看起来差不多、但其实不完全一样的工程。
2、优先选择芯片厂商提供的示例工程
如果拿到的项目资料包里本来就带着IAR工程,那一般要先用厂商SDK、HAL库、BSP包或者开发板例程里的模板;因为这些模板里面,基本上把启动文件、链接配置、系统时钟的初始化,还有最基本的外设配置都做好了,比起自己去从头建一个空工程,这样操作不容易出错;特别是在第一次做移植的时候,先把官方的例程在板子上跑通,然后再一点点把自己的业务代码换进去,这样后面排查问题也会省力很多。
3、确认内核架构和工具链版本
挑工程模板的时候,除了看芯片牌子,CPU的内核也得看,像Cortex-M0、M0+、M3、M4、M7还有RISC-V这些都得注意;要是内核选错了,编译的选项、启动代码还有调试的配置就都对不上了;另外就是,不一样的IAR软件版本,对芯片的支持也是有范围的,老的版本可能根本找不到新芯片的模板,而用新版本去开旧工程的时候,软件还总弹窗提示要转换工程格式。
二、IAR工程模板和芯片型号不匹配怎么办
要是发现模板和芯片型号对不上了,倒也不用每次都急着去重新建一个工程;可以先分析一下这个“不匹配”到底是出在哪个地方,是目标芯片那一栏没选对,还是启动文件、链接文件、头文件或者下载算法有问题;不一样的毛病,解决起来办法也是不一样的。
1、先修改目标芯片配置
顺着【Project】→【Options】→【General Options】这条路点进去,看看【Target】里面的Device是不是选成了手上正用着的芯片。
要是软件的列表里刚好有这个准确的型号,直接换成它,然后重新点一下编译;不过换完之后得留神,IAR有时候脑子不转弯,不会自动把所有工程文件都给换掉,启动文件和链接文件可能还是旧型号的,所以光改这一个地方往往是不够的。
2、核对启动文件是否对应芯片型号
启动文件这个东西,里面放的无非就是中断向量表、复位入口、堆栈初始化这些内容;要是芯片型号没对上,最容易表现出来的就是中断函数的名字对不齐,或者一启动就卡死在HardFault里,要不就是外设的中断根本进不去;这时候可以去工程的文件夹里找找名字像startup_xxx.s或者cstartup_xxx.s的文件,去芯片厂商的SDK里找个同型号的启动文件拿来替换掉;换完之后,还要去瞅瞅中断服务函数的起名跟工程代码里是不是一样的。
3、检查链接文件和内存分配
在IAR工程里面,大家常说的链接配置文件其实就是.icf文件;要是芯片型号不一样,Flash和RAM的容量最容易被弄错。
通过【Project】→【Options】→【Linker】能查到目前正在用哪个.icf文件,接着把这个文件打开,挨个检查ROM和RAM的区域是怎么定义的;打个比方,手上的芯片其实只有128KB的Flash,结果误用了512KB的模板,这时候虽然也能编译过去,但下载进去或者运行起来就会出各种古怪的问题。
三、IAR模板调整后还要检查哪些地方
把工程模板东修西改完之后,最后最好再全盘检查一遍;因为IAR工程显示编译成功了,并不代表芯片里面的配置就全部正确了;得把下载、调试、时钟还有启动的过程全部在板子上走一遍,才能算彻底放宽心,证明这个模板真的适合当下的项目。
1、检查调试器和下载算法
点开【Project】→【Options】→【Debugger】,看看里面勾选的是J-Link、ST-LINK、I-jet还是别的什么调试器。
然后还要去瞧瞧下载有关的设置,看看那个Flash loader支不支持现在的芯片;在模板不匹配的时候,经常会弹出来“下载失败”、“擦除失败”或者“Verify failed”这样的报错,遇到这种问题先别觉得是自己写的代码有错,很多时候其实是下载算法或者芯片型号没点对。
2、运行最小工程验证模板
刚开始的时候,别急着把所有的业务代码一股脑全搬进去;可以先只留个时钟初始化、GPIO输出、串口打印或者让LED灯闪一下这种最简单的功能,先去确认程序能不能正常下到芯片里、能不能复位跑起来、能不能进到main函数里面;要是连这个最简单的工程都跑不动,那就得倒回去重新查启动文件、链接文件、时钟配置和调试器的设置,先别急着去怀疑上面应用层的代码写错了。
3、对照芯片手册检查时钟配置
如果这个芯片模板是从差不多的相近型号改过来的,那外面的时钟源、PLL参数还有外部晶振的频率经常会有出入;要是程序能动,但是串口波特率不对、定时器时间不准、通信接口老是断断续续的,这多半和时钟配置脱不了干系;这时候就需要去翻一翻system_xxx.c或者负责时钟初始化的函数,把里面的HSE频率、PLL倍频、总线分频等数字改得跟实际硬件一样。
总结
挑IAR工程模板这事,核心不是看名字长得像不像,而是要看芯片型号、内核、启动文件、链接文件、头文件、Flash和RAM的配置,以及调试下载的设置是不是真的都对齐了;在遇到IAR工程模板和芯片型号对不上的时候,可以先去【General Options】把目标芯片查一下,然后再顺藤摸瓜地去核对启动文件、.icf链接文件、CMSIS头文件以及Flash loader;只要把这些底层的基础项一个一个都对准了,那大部分因为模板不匹配而导致的编译、下载还有运行方面的各种异常,基本上都能比较快地被找出来。