发新帖本帖赏金 50.00元(功能说明)我要提问
返回列表
打印

项目中的国产CPU替换

[复制链接]
14758|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#申请原创#

我公司在2017年即开始着手国产元器件的替代工作,当时只是隐隐约约感觉到这会成为未来的方向,并没有强制进行。但是已经开始调研一些国产的元器件。本人入职以后,做的第一件事就是调研CPU芯片的国产替代。当时我们用的还是ST的芯片STM32F407IG,经过调研,发现北京有个公司叫兆易创新,可以实现替代。然后实际去了趟GD的指定代理商捷士盟,买了个GD32F207的开发板。跟那边的冯工进行了下技术沟通,感觉不像是那种不靠谱的公司。因为之前出现的“汉芯”造假事件,普遍对国产化芯片持怀疑态度。直到后续在开发板上进行调试,才感觉这个公司比较靠谱。
因为我们公司用的是LQFP176的芯片,当时想用PIN-TO-PIN的替换,这样最省事,直接把精力放在软件移植上就可以了。结果调研发现在STM32F407IG这个芯片上,偏偏没实现原位替代。经过与厂家沟通,发现有BGA的芯片可以替代,LQFP的芯片暂时由于技术上功耗过大的原因无法实现原位开发替代,想要列入开发计划除非有10000的批量订单才行。既然无法实现原位替代,我司最终考虑更换型号,使用GD32F450IK实现了更高性能芯片的替换,当时价格与STM32F407相当,4年后价格比ST的要低很多了。下图是GD32F450IK与STM32F407IG的硬件资源对比表。可以看到,硬件性能指标整体有所提高。
  
资源对比
  
GD32F450IK
STM32F407IG
  
主频
  
200 MHz
168MHz
  
SRAM
  
512KB
196 KB
  
FLASH
  
3MB
1 MB
  
供电范围
  
2.6V-3.6V
1.8V-3.6V
  
功耗
  
99mA@200 MHz
98mA@168 MHz
  
温度
  
-40-85
-40-85
  
外设
  
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 */
2Flash操作修改
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)
3SPICLK线重复配置
SPI处于主模式下,重复配置SPICLK线会引起内部计数器紊乱:
问题代码: 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芯片替换”及“项目中的国产化外围芯片替换”。


使用特权

评论回复

打赏榜单

21小跑堂 打赏了 50.00 元 2021-09-01
理由:恭喜通过原创文章审核!请多多加油哦!

沙发
七毛钱| | 2021-9-1 11:11 | 只看该作者
其实国产芯片还是很不错的

使用特权

评论回复
板凳
asmine| | 2021-9-1 17:03 | 只看该作者
你用GD的,替代st
发到MM
然后~~~~~

使用特权

评论回复
地板
jbush226| | 2021-9-2 08:25 | 只看该作者
然后又试下雅特力,发现GD的表现很一般

使用特权

评论回复
5
13426257085|  楼主 | 2021-9-2 16:06 | 只看该作者
asmine 发表于 2021-9-1 17:03
你用GD的,替代st
发到MM
然后~~~~~

MM?不懂啊,什么意思

使用特权

评论回复
6
Sunriver_Yao| | 2021-9-3 10:43 | 只看该作者
后来...我终于明白,GD的内置振荡器HSI温漂有点大,换了个MM32滴,咦...还行!UARTx能在高低温时候能跑了!...

使用特权

评论回复
7
yang15622383762| | 2021-9-3 11:45 | 只看该作者
GD替代ST的贴子为啥发到灵动微这

使用特权

评论回复
8
海滨消消| | 2021-9-3 12:46 | 只看该作者
在灵动的地盘讨论gd!哈哈

使用特权

评论回复
发新帖 本帖赏金 50.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

4

帖子

1

粉丝