国产芯片N32替换XXX32的步骤(转)
一、工程配置1.安装硬件库硬件库为厂家提供的资料,如下图所示,双击安装,使得keil能够找到该芯片。
https://pic4.zhimg.com/80/v2-012467fd48d8d46f7ba1c2cfa0e4cf27_720w.webp
2.更改J-Flash配置由于Keil官方没有对该芯片的支持,所以J-Link下载时也无法找到该芯片,所以需要手动添加芯片。更改步骤官方提供有说明文档。
https://pic4.zhimg.com/80/v2-400390110f688e3c72ddd10e5c4862bf_720w.webp
主要步骤是:修改JLinkDevices 配置文档添加Nationstech 的下载算法文件添加Nationstech 的JFlash 工程文件添加解锁Nationstech 芯片读保护L1 等级的应用程序
进行如上步骤后,启动J-Flash就能够扫描并连接到芯片,但是有可能keil链接的J-Flash和安装的J-Flash不是一个路径,所以将配置好的J-Flash文件替换keil下Keil5\ARM\Segger目录文件,就能够正常下载调试。
3.更改芯片
https://pic2.zhimg.com/80/v2-f3a8a68f9ed08c4219e526ffb45da7a1_720w.webp
4.添加驱动文件将N32的底层驱动库拷贝到工程目录下,并将include路径添加进去。
https://pic4.zhimg.com/80/v2-306e1bb2fb8777ce009091970bd7906f_720w.webphttps://pic1.zhimg.com/80/v2-21085e7caeb0623c632b253cb4534228_720w.webp
5.更改全局变量
https://pic3.zhimg.com/80/v2-87ce2a98b949d78168a9c3ed23fb941a_720w.webp
6.将启动文件和驱动文件替换为N32库文件
https://pic3.zhimg.com/80/v2-9906039cbe3bc6a5f8bcd7de13e5bc22_720w.webp
7.将所有的stm32l1xx替换为n32g45x
二、底层驱动函数接口对照表更改代码,将STM32的驱动函数替换为N32的驱动函数,这部分比较繁琐,需要慢慢替换,下面是我整理的替换对照表。
https://pic4.zhimg.com/80/v2-3700e7acf57e7066d20789d729fd9313_720w.webp
https://pic3.zhimg.com/80/v2-f9fe7d8478a248777ab4c702493c107a_720w.webp
https://pic2.zhimg.com/80/v2-5681a6c601fd4643ab998a269111f059_720w.webp
三、踩坑记录
经过上面的替换,应该可以编译过去了,但是这指示开始,后面悲剧的踩坑大战才刚刚开始。
1.仿真卡死程序仿真卡死,单步调试发现卡死在OSInit()函数里面,这个函数是OS的初始化函数,所以应该是OS配置的问题,排查下来发现是启动文件里面的OS启动项没有更改,更改如下:
https://pic3.zhimg.com/80/v2-82bbeb6224098b86c5515418df563502_720w.webp
2.DMA配置出错程序能够进入到任务中后,调试发现无法进入到串口接收中断,但是示波器中有数据,而且中断都没有进入,应该是卡死在优先级高的中断中,排查发现,是DMA发送中断的配置有问题,导致一直卡死在DMA中断中。下面是DMA部分的配置。
https://pic1.zhimg.com/80/v2-177b968f03526119c685ed6ff6f43ff0_720w.webp
https://pic1.zhimg.com/80/v2-2040c2663b119cc1f0fa1c279c49ebbc_720w.webp
3.Flash配置由于国民芯片和STM32芯片的FLASH划分有区别,所以FLASH的替换是比较费事的部分,先对比一下两个片子的区别:
STM32L151的flash部分:
https://pic4.zhimg.com/80/v2-059f1cd62b3f4786cf8068c39d096507_720w.webp
N32G455芯片的flash部分:
https://pic1.zhimg.com/80/v2-9f84b6325cb0b2b8df305cd049475abc_720w.webp
可以看出STM32单独有EEPROM的划分,而N32是没有的,只有flash部分。所以要注意两点:
Flash空间的问题,STM32可用空间要比N32的空间大;底层接口函数,STM32有操作EEPROM的函数,而N32没有,只能使用flash操作函数。
下面是flash部分的操作:
https://pic1.zhimg.com/80/v2-eb9549b5d41d49fd018c3d9d6dfda360_720w.webp
4.bootloader移植由于本项目采用bootloader引导主程序的方式,因此要注意烧写空间的配置,配置点在下面位置:
https://pic3.zhimg.com/80/v2-da04bf0d94f8499df42a70fa37da056a_720w.webp
当单独调试其中的程序时,烧写程序需要将整个flash擦除,要不运行不正常。
5.OS初始化卡死又遇到程序卡死问题,这次是主程序,而且主程序起始地址为0x8000000时单独运行良好,但是改成0x8007000用bootloader跳转过去就卡死,也是卡死在OS的初始化中。因为单独运行良好,所以排查起来困难些。最终定位是堆栈和堆的空间设置太大了,设置小了后就可以运行。更改该空间的位置如下:
https://pic2.zhimg.com/80/v2-3286f415ab8557a0ffe91045d1058d19_720w.webp
而且问题还不是堆栈的空间不够用,是空间设置太大了。有点无语。6.程序跳转后运行不正常这是最后的问题,程序能够从bootloader跳转,但是运行不正常,咨询了厂家技术人员,技术人员反馈可以采用分散加载的方式进行排查,也就是让芯片直接在主程序烧录的位置启动,分散加载的教程网上比较多,主要需要设置烧录域和启动域地址,还有VTOR寄存器,
配置如下所示:
https://pic3.zhimg.com/80/v2-579abf8a8d8dc688b18fce608f7f496a_720w.webp
需要编写*.ini文件更改VTOR,ini文件编写如下:
https://pic3.zhimg.com/80/v2-d4d9e2f81ee6d9a7b3c6afcb9ed0530e_720w.webp
在keil中加载,使得软件启动后先配置单片机:
https://pic2.zhimg.com/80/v2-f75e56d8520befa7f29f1f7529c710dd_720w.webp
配置好后可以实现分散加载,能够是程序在烧录位置启动,发现程序分散加载可以运行正常,但是bootloader跳转不正常,因此需要排查跳转部分的问题。最终定位STM32在主程序启动时不会重启向量表,而N32会重启向量表,在主程序启动位置更改如下:
https://pic1.zhimg.com/80/v2-ea73205d009e816eb18a72a96f6859ec_720w.webp
跳转部分代码如下:
https://pic3.zhimg.com/80/v2-2f7bc6295dfab7bf89937966477239d6_720w.webp
页:
[1]