#申请原创#
我公司在2017年即开始着手国产元器件的替代工作,当时只是隐隐约约感觉到这会成为未来的方向,并没有强制进行。但是已经开始调研一些国产的元器件。本人入职以后,做的第一件事就是调研CPU芯片的国产替代。当时我们用的还是ST的芯片STM32F407IG,经过调研,发现北京有个公司叫兆易创新,可以实现替代。然后实际去了趟GD的指定代理商捷士盟,买了个GD32F207的开发板。跟那边的冯工进行了下技术沟通,感觉不像是那种不靠谱的公司。因为之前出现的“汉芯”造假事件,普遍对国产化芯片持怀疑态度。直到后续在开发板上进行调试,才感觉这个公司比较靠谱。 因为我们公司用的是LQFP176的芯片,当时想用PIN-TO-PIN的替换,这样最省事,直接把精力放在软件移植上就可以了。结果调研发现在STM32F407IG这个芯片上,偏偏没实现原位替代。经过与厂家沟通,发现有BGA的芯片可以替代,LQFP的芯片暂时由于技术上功耗过大的原因无法实现原位开发替代,想要列入开发计划除非有10000的批量订单才行。既然无法实现原位替代,我司最终考虑更换型号,使用GD32F450IK实现了更高性能芯片的替换,当时价格与STM32F407相当,4年后价格比ST的要低很多了。下图是GD32F450IK与STM32F407IG的硬件资源对比表。可以看到,硬件性能指标整体有所提高。 资源对比 | | | 主频 | | | SRAM | | | FLASH | | | 供电范围 | | | 功耗 | | | 温度 | | | 外设 | USB OTG,Ethernet MAC,14xTIMs, 3xADCs,3xIIC,4xUSARTs,4xUARTs, 1xDCI,2xDACs,6xSPIs,2xIIS,2xCAN, 1xSDIO,IPA,EXMC | USB OTG,Ethernet MAC,17xTIMs,3xADCs, 3 xIIC, 4x USARTs, 2xUARTs, 1xDCI,2xDACs,3xSPIs,2xIIS,2xCAN, 1xSDIO,FSMC | 浮点运算 | | |
我公司进行大批生产时,为了验证芯片的可靠性,采用了南京希尔特公司的在线烧录器,SUPERPRO系列,结合专门为BGA176作的底座,配合使用。最终结果验证兆易创新批量芯片出厂质量没有任何问题。后又经过高低温、老练等试验验证,兆易创新的国产化芯片替代的可靠性得到满足,正式得以放心使用。 买开发板时,顺带买了一个兆易创新原厂带的GD-LINK下载器,测试时,发现确实能下载,但是有弊端,一是价格比JLINK V8,JLINK V9价格贵了很多,另外操作起来感觉不方便,就是批产时用这个东西感觉不正规,不可靠,主要是几条杜邦线看着就给人松松垮垮的感觉。 我公司实际调试时,改用JLINK仿真器。使用中也有一些要注意的地方。第一,J-FLASH烧写固件时,需要V6.40版本以上才能支持GD的芯片,早期的版本如V4.68等根本找不到GD的CPU。第二,我公司使用的平台包括IAR及KEIL两种,使用时,同样为了支持GD的各种功能,需要安装两个平台的补丁文件。一个是MDK-ARM_AddOn_GD32F4xx.exe,一个是IAR_GD32F4xx.exe。没有这个文件,无法正常使用集成环境开发平台。第三,我公司使用的是SWD模式,在集成开发环境配置时,务必要把JTAG模式改为SWD模式。
再说一下移植的事,整体上讲,没有什么大问题,有些小问题按照兆易创新的软件移植注意事项也都逐个解决了,由于我司的项目主要是工业PLC方面的应用,主要用到了串口、SPI、以太网、定时器、EXMC、CAN方面的资源。 我公司软件移植方面的注意事项有: 1) HSE相关内容修改 启动时间上GD32与STM32相比,由于GD的执行效率比较快,所以ST的HSE_STARTUP_TIMEOUT ((uint16_t)0x0500)值要加大才行。 修改前: //#define HSE_STARTUP_TIMEOUT((uint16_t)0x0500) /*!< Time out for HSE start up */ 修改后: #define HSE_STARTUP_TIMEOUT((uint16_t)0xFFFF) /*!< Time out for HSE start up */ 2)Flash操作修改 GD的Flash执行速度快,但是写操作慢,所以在对Flash操作的时候需要修改下面几个函数:FLASH_StatusFLASH_EraseOptionBytes(void); FLASH_Status FLASH_ProgramOptionByteData(uint32_tAddress, uint8_t Data); FLASH_Status FLASH_EnableWriteProtection(uint32_tFLASH_Pages); FLASH_Status FLASH_ReadOutProtection(FunctionalState NewState); 在这四个函数写完key( FLASH->OPTKEYR = FLASH_KEY1;FLASH->OPTKEYR = FLASH_KEY2;) 后添加两个__nop()语句或者是增加 While( ! (FLASH->CR & 0x200 ) );//Wait OPTWRE 语句来增加等待的时间。同时修改擦出和写的超时宏定义: #define EraseTimeout ((uint32_t)0x000B0000) #define ProgramTimeout((uint32_t)0x00002000) 修改为: #define EraseTimeout ((uint32_t)0x000FFFFF) #define ProgramTimeout((uint32_t)0x0000FFFF) 3)SPI的CLK线重复配置 当SPI处于主模式下,重复配置SPI的CLK线会引起内部计数器紊乱: 问题代码: GPIO->CRL&=0x000fffff; GPIO->CRL|=0xBBB00000; 上面这段代码是执行SPI口的IO初始化,调用两次后会使CLK上面产生一个脉冲。引起内部计数器出错,ST的在SPI再次初始化的时候会将内部计数器清零,GD不会将内部计数器清零。 修改办法: vu32 temp; temp=GPIOA->CFL; temp&=0x000fffff; temp|=0xbbb00000; GPIOA->CRL=temp; 先进行运算再去进行赋值,内部的SPI 计数器就不会因为CLK数据的变化引起误操作。 先写这么多,后续再写下“项目中的国产化AD芯片替换”及“项目中的国产化外围芯片替换”。
|