基于STM32F103xxx的J1939程序开发

1. 摘要

本篇笔记主要介绍,如何在STM32F103XXX系列上实现SAE J1939协议,基于STM32F103RCT6芯片 使用IAR8.32作为软件开发环境。

2. 准备工作

1), 熟悉SAE J1939标准,熟悉ST STM32CubeMX,  STM32Cube_FW_F1_V1.8.0结构

2), 装有IAR的电脑

3), 带有CAN 收发器的板子,因为开发板上的只有CAN接口,不带收发器,我们采用外接引入收发器挂在开发板上,收发器芯片使用的是SN65HVD232D

3. 熟悉STCube架构

ST官方提供Cube帮助工程师快速开发产品原型,类似于软件SDK,包含所有外设驱动,还有例程,之前多次讲过在NXP平台芯片上做J1939协议栈,如果熟悉J1939的话会很容易移植到ST芯片上 。

这次我们使用CubeMX来生成工程,且初始化CAN,配置CAN管脚和中断

基于STM32F103xxx的J1939程序开发

根据自己的需要选择配置相应的管脚,和外设

基于STM32F103xxx的J1939程序开发

使用内部时钟,禁止掉HSE。

基于STM32F103xxx的J1939程序开发

配置时钟,可以使用外部时钟晶振,也可以配置使用内部时钟,我们以内部时钟为例

基于STM32F103xxx的J1939程序开发

CAN中断的配置

基于STM32F103xxx的J1939程序开发

CAN时钟,以及位时间等的配置

基于STM32F103xxx的J1939程序开发

基于STM32F103xxx的J1939程序开发

选择路径和命名,,开发环境,生成工程,MX会基于这些配置生成对应环境的工程

基于STM32F103xxx的J1939程序开发

点击GENERATE CODE生成工程,生成的工程目录结构如下

基于STM32F103xxx的J1939程序开发

Ioc文件时MX生成的文件,每次修改工程,添加外设等的更改,建议都通过这个文件去更改重新生成。打开生成的工程看一下

基于STM32F103xxx的J1939程序开发

我们使用SysTick 1ms来作为系统的时基,生成的工程里只有CAN的初始化代码,需要我们添加中断函数,并且启动CAN。可以重新建立两个文件来完成CAN的相关代码。可以来看一下生成的初始化函数,红色框为我注释的内容

基于STM32F103xxx的J1939程序开发

启动CAN,使能中断

基于STM32F103xxx的J1939程序开发

实现接收中断和发送中断,给出接收中断代码,CAN的中断源比较多,根据自己需要使能或者不使能。

基于STM32F103xxx的J1939程序开发

添加完CAN驱动后,确认编译没有问题,且驱动收发正常,这时候开始动手移植我们之前多次成功在其他平台上移植的J1939协议栈。

4. 协议栈移植

添加j1939相关文件到工程,其实移植主要修改几个函数,需要熟悉J1939的PDU结构,不熟悉J1939的可以自己查找相关文档,或者去听听我在发烧友学院的课程

基于STM32F103xxx的J1939程序开发

其实就是修改调用底层CAN接口的两个函数,其他与底层无关的不用修改,修改编译无误后,下载测试

5. 测试

其余修改地方不在赘述,编译无误后,下载到开发板,并正确连接硬件电路,并通过CAN转USB接到电脑,通过CANPro软件进行测试,测试中我就放了一帧,你可以根据自己的需要添加更多内容。

基于STM32F103xxx的J1939程序开发

至此在STM32F103上移植J1939协议栈成功。

在移植过程中,遇到编译器优化的问题,后面会在跟大家分享。