S32Kxxx bootloader之LIN bootloader
了解更多关于bootloader 的C语言实现,请加我Q扣: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序)。
上一次发布博文到如今既然已一年有余, 开始着手写今天这篇博文, 有着一种久违的感觉。 今天要给大家介绍的是S32K116 的LIN bootloader, 这个LIN bootloader 可以很容易地移植到S32K118,S32K142, S32K146以及S32K148。
Bootloader 要一种用来更新应用程序的软件。它一般和PC端的host软件一起协同合作才能完成应用程序的更新。PC端的host软件我们常称之为上位机,Bootloader 亦常被称为下位机,今天这个LIN bootloader的上位机是使用C#语言写的,需要调用USB-2-LIN适配器的驱动程序API. 所以PC端需要安装USB-2-LIN适配器的驱动。我使用的是我自己开发的USB-2-LIN适配器,这也是我为什么一年多了才有新的bootloader 产品出现。目前所有的开发任务都已经完成,只剩给我的USB-2-LIN配置器找一个漂亮的外壳了。LIN bootloader 已经经过了完成的测试。测试连接图如下:
PC端安装了我的USB-2-LIN适配器的驱动,运行我用C#写的host程序zFlash, 通过USB口,连接我的USB-2-LIN适配器,USB-2-LIN适配器另一头通过LIN总线和用户板相连,用户板就是我的S32K116 EVB板,上面运行我的LIN bootloader软件。
zFlash 的UI界面如下:
LIN Bootloader 是在NXP ARM Cortex-M0 32-bit 微控制器上实现的。开发环境如下:
1. IDE: S32DS for ARM, Version: 2018.R1
2. Compiler: GCC for ARM, Version:gcc-6.3-arm32-eabi
3. SDK: S32DS/S32SDK_S32K1xx_RTM_3.0.0
LIN bootloader 的上层代码是手写的,以下底层Components 代码都是通过S32DS 的Processor Expert配置后自动生成:
1, PIN (pin_mux)
2. Clock (clock manager)
3. Interrupt (interrupt manager)
4. LIN stack
5. Flash (flash driver)
6. LIN tranceiver Tja1027
LIN bootloader 实现过程比较顺利,只在两个问题上花费了一些时间去调试,第一个是timing的问题,上位机是LIN Master节点,发送擦除命令后,需要发送LIN frame header 让LIN Slave节点下位机反馈擦除的状态,由于预估的时间不准,下位机还在执行中,就把LIN frame header 发送出去,然后一直报no response的错误,后来经过调试,才解决了这个timing的问题。第二个问题是跳转的问题,擦出和烧写都顺利完成,但是跳转过去,APP死活运行不正常,我将板子里面的程序读出来和应用程序的hex文件对比,是一模一样的,烧写器单独烧APP,运行正常,LIN Bootloader跳转到APP,却不能正常工作,所以我怀疑是跳转的问题,我在跳转前增加了一小段代码,把所以用到的Peripheral都Deinit, 再试,多次试,都能成功跳转,并且APP运行正常。
INT_SYS_DisableIRQ(LPTMR0_IRQn);
INT_SYS_DisableIRQGlobal();
LPTMR_DRV_Deinit(INST_LPTMR1);
lin_lld_deinit(LI0);
Jump_To_Application(*((uint32_t*)APP_START_ADDRESS));