查看原文
其他

CANOpen系列教程14_协议源码移植(二)

strongerHuang strongerHuang 2021-01-31

置顶/星标公众,不错过每一条消息!


    本教程由作者strongerHuang于2018年11月原创发布。

标签:CAN、 CANOpen、 CanFestival

版权所有:禁止商用

申明:该文档仅供个人学习使用,转载请公众号联系作者授权。


1写在前面

该系列教程上一篇文章《协议源码移植(一)》算是对CANOpen移植的准备工作,如果想要理解移植过程的知识,其实还有许多内容得了解。


本文挑一些重点来讲述,从协议源码添加到工程,源代码理解,到最后输出效果。


提示:该系列教程基于:CanFestival架构、STM32F1芯片、FreeRTOS操作系统、Keil MDK-ARM开发环境


2

添加源码、路径

本节内容针对初学者做出简要描述,相关内容可参看文章《Keil系列教程02_新建基础软件工程》。


2.1 添加组、文件

简单来说,就是在你已建好的工程中添加与CANOpen相关的组和文件,如下图:


2.2 添加路径

添加CANOpen源码的inc头文件等相关路径,编译的时候才能找到对应文件。


3

添加代码及分析

移植的重要过程就是添加、删除和修改源代码这一步骤。从教程上一篇文章下载,并看过源代码的朋友就会发现,其实我们需要添加的代码并不多,主要就是需要实现几个底层的驱动函数


下面将重要的几点罗列出来。


1.修改canfestival.h文件

上文说了一下:添加三行语句,防止递归包含


这里就是CANOpen定义的底层驱动接口,接口函数具体代码需要我们自己实现。


canSend这个函数被CANOpen源代码调用的最多,我们最好不修改函数接口,同时需要我们实现(我在canopen_drv.c中实现的)。


其它initTimer、 canInit等函数接口,在源码中没有调用,我也没有按照这套接口来实现(初始化我在bsp下实现的)。


2.底层驱动初始化代码

上面说的initTimer、 canInit初始化,我这边为了与我代码一致,使用TIM_Initializes、CAN_Initializes替代。


分别位于bsp_timer.c 和 bsp_can.c下面,实现的具体内容这里不描述,具体可以下载源码工程参看。


3.定时器调度相关接口

其中setTimer和getElapsedTime这两个函数会被timer.c协议源文件调用。在timer.h里面有什么(如下图),但函数体没有实现,需要我们自己实现。


同时,TimeDispatch函数已经实现,定义在timer.c,但需要被定时调用(调度)。


4.CAN发送接口函数canSend

这个CAN发送函数相当重要,接口最好不要自定义,因为scr下面多个源文件都调用了该函数。


同时,发送函数会被定时调度。所以,如果你调度方式像我例程那样,使用定时器中断的方式实现。那么,你就要考虑在中断函数里面发送的情况。


以上就是CANOpen移植,底层驱动相关的一些接口实现和说明。这部分内容,CanFestival框架提供源码是定义在drivers下面,比如STM32F1的就是cm3下面的cm3.c:


我单独提出来实现这些驱动函数是因为我跑了一个FreeRTOS系统。当然,你的驱动也可按照drivers下面那样实现。


5.其它

A.发送和接收缓存

我这边是通过队列来实现发送和接收缓存,而cm3.c是通过MessBuf_Write和MessBuf_Read来实现缓存。


B.中断接收

我使用CAN中断接收数据,和定时器中断调度。


提示:我中断入口函数是宏定义实现的,需要包含宏定义头文件。

#define CAN_RX_IRQHandler  USB_LP_CAN1_RX0_IRQHandler


#define CANOPEN_TIM_IRQ_Handler TIM2_IRQHandler



C.配置节点

配置节点ID,节点的状态,这里只是简单的Demo,没有添加应用代码。


4

工程下载及运行效果

1.下载工程“CANOpen工程模板(含主、从站-心跳)”

https://pan.baidu.com/s/1LzD0Epc-Z8vlHsb-sD3WVw

提取码:l2dc


提示:如果链接失效,公众号回复【CANOpen系列教程】获取更新链接;


2.运行效果

我提供的例程是一个只有心跳(间隔时间我们配置为1000ms)Demo工程。所以,启动之后,你会发现总线上间隔1秒有一个心跳


下图是我通过CAN分析仪抓取的CAN总线数据(如果你没有分析仪,可以用我《系列教程6》提供的例程,通过串口打印)

先启动一会儿主站,然后关闭,再启动从站的数据,重要信息我都标记出来了。


A.上线报文:ID:0x700  Data:0


B.网络管理:ID:0x000  Data:00代表管理所有节点 Data:80代表复位节点


C.心跳报文:ID:0x700  Data:05代表Operational操作状态


提示:主站具有网络管理,而从站没有。同时,数据值(如81、05)的含义可参看CiA 301手册网络管理的章节(后期进行讲述)。


好了,源码移植的重要内容就分析到这里,有什么不明白的,可以结合代码理解。


5

说明

1.该文档仅供个人学习使用,版权所有,禁止商用。


2.本文由我一个人编辑并整理,难免存在一些错误。


3.本文收录于公众号「strongerHuang」,关注微信公众号回复【CANOpen系列教程】即可查看全系列教程。  


6最后

若觉得文章对你有帮助,随手点赞、分享,也是对我莫大的支持和鼓励。


扫描下面二维码、关注公众号,在底部菜单中查看更多精彩内容!


长按识别图中二维码关注



    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存