从站代码迁移,基于stm32f103与LAN9252
最近刚刚完成了从站代码的迁移,新的控制芯片使用了stm32f103,通信芯片使用了LAN9252,过程当中碰到了很多问题,当然在知乎寻求帮助得到了回应,所以来做个总结吧。
1.迁移到另一块单片机的代码keil报了如下错误:
Error:#268:declaration may not appear after executable statement in block.
Error:#29 execpected an expression.
这个代码我本身并未修改,但是还是报错了,百度第一个结果如下,定义的变量没有定义在最前面,编译器在执行的时候先使用了未初始化的变量。然后我又查看了百度的第二个结果,博客告诉我这是因为KEIL软件默认执行的是C89的标准,在编译选项中选中C99便不会报错了,但个人认为原因在根本上是一致的,代码本身并不够规范,变量初始化应该放在函数的起始部分,这样不管标准如何,程序都可以正常编译。
2.程序迁移编译环节通过了,没有报错,但是在调试过程中卡在了FSMC.C函数中,里面FSMC_NORSRAM_TimingTypeDef结构体的初始化需要对六个变量赋值,其中有数据建立时间、数据保存时间、地址保存时间、总线恢复时间、时钟分频因子和数据延迟时间,需要对LAN9252的数据手册查找关键数据。
3.在调试过程中,程序卡死在系统时钟初始化函数中,一开始怀疑为外部晶振问题,后来测量到板上外部晶振为25MHZ,但是芯片不支持这个频率的外部晶振,,f103芯片支持的外部晶振频率为4-16M,在sys.c中的时钟配置中,经过倍频后直接到了225Mhz,单片机直接超频卡死了,然后改用内部晶振8M,倍频最大到了64M,时钟初始化完成。
4. 在下载hex文件到flash中时,有警告信息“invalid rom table”,下载失败,后面通过烧写软件擦除清空flash后完成烧写。个人猜测flash可能经过多次烧写空间不足或是其他问题我暂时无法解释。
5. 程序在烧写以后,LAN9252的IRQ系统中断引脚被拉低后无法恢复,一直为低电平状态,无法触发下降沿,中断服务函数无法进入,从站初始化状态切换失败。经过一天的排查,我发现居然是自己的中断设置有问题,因为程序是移植过来的,中断引脚被接到了PB12上,我一直检查中断配置,中断线使能都没有发现问题,最后在调试过程中,发现自己的中断引脚和中断处理函数名居然没有对应,使用的一直是EXTI0_Handler,这样只是在中断线0的中断触发时会进入中断服务函数,而我使用的中断却映射在EXTI15_10_Handler上,由于这个中断服务函数是由硬件直接跳转的,所以我忽略了这个问题,很低级也很致命,毕竟问题没有出现在函数体内,所以排查确实靠的是灵光一现。
6.在FSMC初始化碰到的问题挺多的,这个部分主要是看stm32f103vct6的数据手册和LAN9252的数据手册,关于看手册的话确实经验不多,在这个移植过程中算是得到了锻炼,每个需要对应的引脚,不同模式下所需引脚和时序,起码看手册可以让你读懂代码。在767和103由于封装不同,所带资源的差异,当前的板子上面我只能使用一个FSMC内存片选引脚,即只能选用BANK1中的前64M内存,这里我要提到库函数中关于FSMC的bank内存定义名称有误,造成我很长时间不理解究竟选了哪块内存,最后我还是选择相信数据手册。由于没有FPGA,所以这片64M内存空间我就全部给LAN9252处理协议数据了,后面板子接上fpga的话个人觉得可以将64M空间分成两半给LAN9252和FPGA使用(FPGA用来处理IO数据),不过如何定义内存地址对应芯片仍然是一个问题。下周要是解决了回来做个补充。
可以发现,我的问题其实都是硬件问题,大部分问题通过芯片手册是可以解决的,关于ETHERCAT协议部分我并没有做修改,不过我最近也在深入了解,希望能够有所收获。这篇文章只是简单的总结,要是有疑问或者错漏欢迎交流。
~~~~~~~~~~~~~~~~分割线
后续的移植也完成了,一个FSMC接口分别连接了LAN9252芯片和FPGA,这时需要两个片选引脚来区分,但是103芯片100PIN封装只有一个FSMC片选信号,我的解决办法是重新使用了一个普通GPIO口来连接FPGA片选线,在与FPGA通信时拉低引脚电平,通信完成后置高,这样同样可以实现FSMC的通信,因为FSMC与两块芯片都是在不同时间通信的,我们只需要对FSMC所属的内存空间直接操作数据即可。