1、环境
- S32DS IDE
2、背景
- NXP官方出的开发工具 S32KDS提供了图像化配置工具PE(Processor Export),所有外设可以在界面中配置,然后自动生成代码。
- 这样虽然方便了点,但个人感觉对学习不是很有利。操作起来方便,但对底层接触的就比较少,想看他底层部分,嵌套太多层,看起来很累。
- 所以我参考他们的寄存器版的程序,自己编写自己所需。但有些没有寄存器版本,例如flash的擦写部分就没有参考程序,所以我只能参考PE生成的程序进行移植。
3、调试过程
-
先找个官方基础例程,作为基础移植工程。
-
移植过程还是用原来官方程序的Project_Settings文件夹下 S32K116_16_flash.ld、S32K116_16_ram.ld、startup_S32K116.S、system_S32K116.c,后面需要关注到这几个文件
-
配置好外设,实现定时器,串口功能等之后(确保功能实现,说明移植相对没问题),就开始移植PE生成程序flash_partitioning_s32k116的flash_driver.c,flash_driver.h两个文件。对应添加头函数,对应初始化,调用两个文件所提供的函数。程序如下:
INT_SYS_DisableIRQGlobal();
ret = FLASH_DRV_EraseSector(&flashSSDConfig, APP_PFLASH_START_ADDR, flashSSDConfig.PFlashSize - APP_PFLASH_START_ADDR);
INT_SYS_EnableIRQGlobal();
-
上面对应的APP_PFLASH_START_ADDR是我打算存放app程序的开始地址,INT_SYS_DisableIRQGlobal与INT_SYS_EnableIRQGlobal是开启和关闭全局中断,其他参数可以参考原PE生成程序
-
运行起来,发现程序卡死,跳转到DefaultISR,解决方法可以参考以下链接:S32K1XX调试–程序跑飞到DefaultISR
-
解决了DefaultISR问题,又出现跳转到HardFault问题,解决方法可以参考以下链接:S32K1XX调试–快速定位HardFault
-
定位到是FLASH_DRV_CommandSequence函数的问题,多次查找后,发现是相应的函数内容没有从flash拷贝到RAM,程序跑起来跳转过去,相当于跳转到了一个空函数,所以出现HardFault
-
这时考虑到可能是链接以及启动程序问题,于是打算大干一场,处理移植问题(操作之前还是很有必要备份程序)。
-
准备开始替换Project_Settings文件夹下的几个文件,到PE所生成的程序flash_partitioning_s32k116处去找,从对应文件处把内容全选复制过来,到现有程序全选粘贴(因为有些文件命名可能不一样,但目的是一样的),然后编译
-
编译过程中,可能还会有报错,比如某些参数未定义,例如init_data_bss未定义,这个在startup.c和startup.h中有定义,再从PE处移植过来即可
-
可能还会有其他问题,再移植添加即可。
其他
- 因为自己在这部分卡了几天,所以就把调试过程编写出来供参考,希望能够帮到你。
- 编写或是解释难免有错,欢迎指正。
另附参考所提到的两个链接:
[1]. S32K1XX调试–程序跑飞到DefaultISR
[2]. S32K1XX调试–快速定位HardFault