置顶/星标公众号,不错过每一条消息!
本教程由作者strongerHuang于2018年10月原创发布。
标签:CAN、 CANOpen、 CanFestival
版权所有:禁止商用
申明:该文档仅供个人学习使用,转载请公众号联系作者授权。
教程上一篇文章《关于Canfestival及对象字典生成工具环境搭建》中我们简单认识了一下Canfestival这套免费开源CANOpen协议的框架。
那么,本文将会以下载的PDF手册(源码里面也有)为导向,来深入解析Canfestival这套框架。
本文大概分两部分来讲述:
1.manual手册概要内容;
2.解析Canfestival源码;
2
manual手册概要内容请先下载我们教程上一篇文章《关于Canfestival及对象字典生成工具环境搭建》提到的PDF手册(解压源码,在目录objdictgen \ doc下面也有manual_en.pdf手册文档)。
打开PDF手册,我们可以清楚的看到手册共有12章。对于使用STM32开发的初学者来说,相对重要一点的章节有:2, 3, 4, 9这些章节。
为了照顾初学者,这里先把每一章节内容概述一下,后面在重点讲述部分的内容。
2.1 内容概要
第1章Introduction介绍
主要介绍了CanFestival是一个开源(LGPL和GPL) CANopen框架,CanFestival项目的起源及支持。同时,也介绍了什么是CANOpen协议,以及协议相关的规范。
第2章CanFestival特征
1.工具:提供对象字典GUI图形化编辑器、代码生成,以及脚本等配套工具;
2.多平台:库源代码是ANSI标准C,支持多平台编译和开发;
3.CANopen标准:支持DS-301、302、305等标准的CANOpen协议。
第3章How to start如何开始
这一章节其实主要就是对一些环境的要求和配置,及如何获取CanFestival等。
其实,对我我们使用MCU开发的人来说,重要的就是对象字典编辑和生成工具的环境(具体请参看教程上一篇文章《对象字典生成工具环境搭建》)。其它基于Windows、Linux开发的环境,大家可以参考文档配置一下,这里不讲述。
第4章理解Canfestival
主要讲述:理解源代码文件目录划分情况、在应用程序中实现CanFestival以及源文件结构关系、CAN底层驱动接口的调用和实现、对事件调度的实现方法。
本章节内容直接牵涉源代码相关内容,所以说比较重要,下面章节将进一步详解。
第5、6章
这两章节主要是针对Linux、Windows平台的配置和开发相关内容,感兴趣朋友可以认真研究一下,这里不讲述。
第7章
主要讲述源码提供的HCS12例程相关的编译、下载、硬件连接以及演示。这里参考意义也不大,如果你有对应的板卡,可以参考进行演示一下。
第8章例程和测试程序
这一章节讲述了配套提供的一些例程的相关说明。比如TestMasterSlave主从站测试例程中心跳发生器时间为1000毫秒等。
这些说明在源代码中也有,通过查看提供的源代码一目了然。所以,参看价值也不是很大。
第9章开发一个新节点
这一章比较重要,我们开发一个新的节点,就需要编辑其对象字典,那么就需要通过编辑器编辑对象字典并生成代码。
简单的说,这章节的重要内容就是让你学会如何使用这个对象字典编辑器工具。
第10章FAQ常见问题
这一章节,初学者能看懂的还建议看下有些问题可能对你有帮助,比如:CanFestival3是否符合DS301 V4.02版本?
第11章文档资源
主要就是一些参考网址。
第12章关于这个项目
不是重点,可以了解一下这些信息。
3
解析Canfestival源码3.1 源文件目录
解压下载的源码压缩包,会看到如下图文件及文件夹:
我们主要需要的三个.c .h源文件目录:
drivers:底层驱动;
include:.h头文件;
src:.c源代码;
一个对象字典生成工具:
objdictgen:object dictionary generate.
examples:例程,初学者可以参考;
3.2 源代码结构关系及应用程序如何实现
这里有一张源文件的结构关系图,大致就是将源文件按照其作用进行了划分,初学者需要多看多理解。
从图中我们可以看出,将源代码划分成三块。中间的Library库文件我们不会去动它。主要修改左右两边的代码。
左边CAN底层驱动接口(前面我提供过STM32例程)。Target目标接口,如定时器。
右边底部对象字典,我们需要通过工具事先配置好,不需要人为编写。最后就是我们通过调用API函数,实现应用程序。
提示:最右边的英文希望大家理解一下,对初学者有帮助,如打开CAN接口(也可以叫初始化)、初始化定时器......等。
3.3 CAN底层接口实现和要求
我们底层发送要求非阻塞的方式实现,一般我建议跑一个操作系统,加一个队列的方式实现。
需要一个发送线程、一个接收线程,同时需要定时器实现事件的调度。
这一节的内容,对于初学者理解起来相对较难,可以先了解,有一个概念,后面我会结合代码让大家更容易理解其中含义。
4
说明1.该文档仅供个人学习使用,版权所有,禁止商用。
2.本文由我一个人编辑并整理,难免存在一些错误。
3.本文收录于公众号「strongerHuang」,关注微信公众号回复【CANOpen系列教程】即可查看全系列教程。
若觉得文章对你有帮助,随手点赞、分享,也是对我莫大的支持和鼓励。
扫描下面二维码、关注公众号,在底部菜单中查看更多精彩内容!
长按识别图中二维码关注
赞赏是对作者的认可与支持!