《一》canfestival系列教程之程序移植
步骤一:
首先准备一个工程
确保这个工程是可以用的,比如用正点原子的can工程

第二步:
从官网上下载一个源码程序,解压:

打开之后,有很多文件,我们只取其中的两个文件
src文件夹(里面是.c文件)
include文件夹(里面是.h文件)

第三步:
把 src文件夹 和 include文件夹 复制到工程目录下面.具体放入到工程的哪里,可以按照自己的意愿.
先分析一下正点原子的工程:
正点原子的工程比较规范,工程下面有6个文件夹,每个文件夹都有不同的作用:
USER,代表最上层的函数,实现程序主要功能的逻辑和顺序.
HARDWARE,用于编写各个器件的.c和.h文件,里面就是每个硬件各自的功能.
SYSTEM,系统的东西.
CORE,关于stm32单片机内核的东西,比如启动文件.
FWLIB,关于stm32单片机官方提供的库函数.
README,介绍文档.
具体入下图所示:

正点原子的工程文件目录.

为了方便起见,我们把src和include放入到一个新建的文件夹中.
这个文件夹命名为canfestival.

并在canfestival文件夹中复制源码库的src和include文件夹.

然后打开src文件夹,把里面多余的部分去掉


(注意symbols.c文件也要去除)
同理,打开include文件夹,去除多余的文件


include里面有很多平台的文件,这里我们只留下AVR的,
又因为我们使用的是keil,所以要把AVR文件进行改造.把AVR名字改成stm32.

然后进入该文件夹,去除掉多余的文件:


第四步:
添加如keil的工程里面,在keil工程里面新加入一个文件夹:canfestival.并把之前的src文件夹中的.c文件添加进去. 同样,也需要添加.h文件.

第五步:
因为我们的这个工程是在AVR工程中改过来的,但是现在我们用的编译器不是AVR而是keil.
所以要进行一下工程上的修改.编译会报错.

需要把config.h文件修改.

第六步:
保存后,再次进行编译.因为函数不完整,会进行报错.

从报错中看,可以知道是缺5个函数.
首先看start_and_seek_node() 和 start_node(),这两个函数原型程序里是有的.
从keil中进行搜索就可以找到,但是为什么还会有报错,就是因为keil不识别inline这个关键字,
把inline去掉即可.


另外还剩下下面三个函数:
canSend()
getElapsedTime()
setTimer()
这三个函数是需要我们编写的.(而且需要根据自己的平台编写,我们用的平台是stm32)
canSend() ,作用是发送can数据,最终canfestival库发送数据,都会调用canSend()函数.
getElapsedTime(),作用是软件定时器的修正(通过一个硬件定时器,来模拟多个软件定时器).
setTimer(),作用是改变硬件定时器的溢出周期.
第七步:
上面讲到还需要canSend(), getElapsedTime(), setTimer()三个函数需要编写.
这里不能单单编写这三个函数.
需要配置stm32的can接口,也就是对can进行参数配置,初始化,使能.然后再调用canSend()才会有作用.
getElapsedTime(), setTimer()要想起到作用,需要配置stm32的定时器.然后timer定时器才可以提供canfestival库一个时钟基准.
如果你用的是其他单片机,或者其他平台,就需要配置其他平台的can底层和定时器底层.
所以在工程目录下面,又创建了两个文件夹:

添加到keil的工程中:

在canfestival_can 中添加 canfestival_can.c 和 canfestival_can.h 文件.
这里面主要添加stm32单片机can的底层配置.
在canfestival_timer 中添加 canfestival_timer.c 和 canfestival_timer.h 文件.
主要添加stm32单片机的定时器配置.
canfestival_can.c文件如下:
canfestival_can.h文件如下:

canfestival_timer.c文件如下:
canfestival_timer.h文件如下:
第八步,
然后进行编译,只有一个错误.
就是"字典"的报错.(关于这一部分,可以先用我下面提供的代码,之后自己生成了字典.c和.h文件后,可以直接进行替换.)
字典是一个配置文档,可以通过配置字典,来实现不同的通信内容.
可以在工程目录下面建立一个canfestival_master文件夹,用于保存字典的.c和.h文件:

并在keil的工程里面加入canfestival_master.c文件:

canfestival_master.c文件内容如下:
canfestival_master.h文件内容如下:
然后进行编译,就没有报错了.

主函数怎么写
工程移植完成后,
需要进行"字典"的.c和.h生成.(按照自己的需求去生成)
需要按照自己的需求去编写相应的主函数main.c了.
主函数的大体框架:
引入头文件.
进行can初始化配置,前面canfestival_can.c中有.
进行硬件定时器初始化,前面canfestival_timer.c中有.
然后进行canfestival库函数的调用.(配置节点为主或从,把can的状态切换到操作模式)
进入while(1)循环.

至此,移植工作圆满完成了.