根据st的版权要求,由其提供的代码仅能用于由st制造的产品或者为st制造的产品。
如果采用了st提供库函数进行产品的开发,当用CKS或者GD的处理器替代st的处理器时。
必须要用国产厂家提供的库函数重新编写代码,那么需要澄清以下问题:
1. 能否将st以及国产厂家两套库函数编译下载到处理器,程序运行时肯定CPUID等条件判断芯片类型并调用对应的库函数。
在处理器中同时包含 st以及国产厂家的库函数,占用比较大的空间;
另外,当从处理器中读取出相应的二进制代码,并与st库函数编译出来进行比对,会在大量匹配的代码。对于这样的比对结果,很难解释采用国产厂家的芯片时并没有使用到st的库函数。
因此,不能将两套库函数同时编译下载到处理器
2. 能否用编译开关选择不同的库函数
为了便于软件工程的管理,希望使用两种不同芯片的软件共用工程文件,仅在代码层级通过宏定义来区分。
根据公司要求,我们需要将整个工程上传到开源代码扫描平台进行扫描,当用blackduck进行扫描时,会同时检测到st以及国产芯片的代码库。
这时,需要向审核人员解释这两套代码是通过编译开关进行区分,可以保证st的代码仅用于st的产品,不确定审核人员是否认同这一点。
因此,不能用编译开关选择不同的库函数
综上,使用国产芯片替代时,需要:
使用不同的软件工程
编译生成不同的二进制代码
使用不同的git仓库进行代码管理
使用不同的软件料号进行固件管理
创建不同的BOM用于产品生产,根据处理器的厂家选择不同的生产BOM
产品出货之后,有两种不同的固件升级方式:
- 采用烧写工具通过SWD/JTAG升级接口进行升级
- 通过OTA方式由上位机等软件将固件发送给设备进行升级
当用国产芯片替代之后,在市场上的产品会存在使用不同处理器的多种型号。
不同型号需要升级对应的不同固件,但是用户并不知道处理器的差别。
因此,我们的升级方案需要自动识别出处理器的厂家,自动选择芯片对应的固件进行升级。
需要处理器提供方法识别生产厂家,
6c2b76ba8a9d4509aa3d6a192552673e?from=pc.jpg
区分GD32和STM32

比如:
对于GD的处理器,通过下述方法区分GD32和STM32
GD32F30x在设计阶段,已经预留了相关寄存器,用户只需要软件读取寄存器 ,即可获取到相关的型号信息,GD32F30x每一型号此处值都为固定值 。
Code_Num=*( uint32_t *)( 0x40022100 );
对于CKS的处理器,芯片没有提供方法用于区分STM32。
采用烧写工具的升级方案如下:
1) 不能使用现成的烧写软件如st的programmer或者st-link utility等烧写程序。
3359ea972c0842be9b0ebfdbca758d05?from=pc.jpg
st-link utility的命令行

2)自己开发烧写软件,通过st-link utility提供的命令行按下述步骤烧写:
通过st-link_cli.exe -r8 0x40022100 12读取出型号信息 。
根据型号信号判断是否为GD的处理器,如果是则选择GD的固件,否则选择其它厂家的固件。
将选定的固件通过“st-link_cli.exe -p 固件名称“这一命令烧入处理器。
86a03e0965f24a3b97b3b6635ec47a72?from=pc.jpg
程序烧写工具

通过OTA的升级方案如下:
在主处理器、上位机、云服务器需要升级设备固件时,先发一条消息给处理器,由处理器读取型号信息并返回。收到应答之后,判断是否为GD的处理器,如果是则选择GD的固件,否则选择其它厂家的固件,将固件按照原来方案分包发给处理器进行升级。
[size=1.059em]总结:
1) 国产芯片和ST芯片的代码需要按照完全不同的软件料号将代码分开管理
2) 通过烧写工具升级需要自己设计烧写软件
3) 通过OTA升级应该修改升级代码,增加判断芯片厂家的步骤
4) 没有提供方法识别厂家的芯片(如CKS)不能使用ST提供的代码库,只能直接操作寄存器进行软件开发,而且需要与ST完全共用一套代码。



来源:物联网全栈开发