前言
最近需要开发一款ECU模拟器,用于辅助OBD产品的测试验证,由于这是内部使用的工具,项目优先级较低,开发周期会比较长,可能到后面连自己都看不懂了,因此有必要写点笔记。
功能规划
总线物理层支持CAN和K-Line,网络层支持ISO15765-2、ISO14230-2、ISO9141-2、J1939-31。
-
控制
-
主要的人机交互是显示屏+触摸+旋转编码器,并附加车速、转速调节旋钮及一个自复位的快捷键。
-
预留了USB转UART,可通过电脑的超级终端控制系统运行,未来也可以开发上位机进行控制。
-
设计有USB -A母头,可连接U盘,读取脚本进行自动化控制。
硬件设计
MCU是STM32F407VG,屏是ILI9486 3.5寸 480*320,触摸是TSC2046驱动的电阻,CAN收发器是TJA1042,K-Line收发电路使用三极管搭建,调试口是CH340实现USB转UART。
软件设计
系统分层
整个软件框架分6层:驱动、操作系统、板级支持包、数据、功能、应用,并且RTOS的task只出现在应用层。
Layer | Module |
---|---|
Application | obd, hmi, dev, script |
Function | j1979, j1939, iso14229 |
Data | iso15765_2, iso14230_2, ymodem, fatfs |
BSP | bsp_tim, bsp_shell, bsp_can, bsp_kline, bsp_lcd, bsp_touch, bsp_flash, usb_host |
OS | ThreadX_RTOS, ThreadX_GUIX |
Driver | CMSIS, STM32F4xx_HAL_Driver, STM32_USB_HOST_Library |
第三方协议栈
效率为王的时代,肯定要避免重复造轮子,因此引用了一些优秀的开源库。由于需要小修小改,所以用了派生库,既能管理自己的迭代,又能跟随原作者的更新。
-
J1939使用了XeiTongXueFlyMe的协议栈,修改了一些自认为的bug,增加了71和73部分的应用:
原库地址:https://github.com/XeiTongXueFlyMe/J1939.git
-
shell模块使用了NevermindZZT的letter-shell,加了一层封装接口,没有动原库:
原库地址:https://github.com/NevermindZZT/letter-shell.git
-
日志系统使用了
原库地址:https://github.com/armink/EasyLogger.git
-
串行 SPI Flash驱动使用了armink的SFUD通用驱动库
原库地址:https://github.com/armink/SFUD.git>
工作流程
固件分为Bootloader和Application两部分