《一》canfestival系列教程之程序移植
步驟一:
首先準備一個工程
確保這個工程是可以用的,比如用正點原子的can工程

第二步:
從官網(wǎng)上下載一個源碼程序,解壓:

打開之后,有很多文件,我們只取其中的兩個文件
src文件夾(里面是.c文件)
include文件夾(里面是.h文件)

第三步:
把? src文件夾??和? include文件夾? 復制到工程目錄下面.具體放入到工程的哪里,可以按照自己的意愿.
先分析一下正點原子的工程:
正點原子的工程比較規(guī)范,工程下面有6個文件夾,每個文件夾都有不同的作用:
USER,代表最上層的函數(shù),實現(xiàn)程序主要功能的邏輯和順序.
HARDWARE,用于編寫各個器件的.c和.h文件,里面就是每個硬件各自的功能.
SYSTEM,系統(tǒng)的東西.
CORE,關于stm32單片機內(nèi)核的東西,比如啟動文件.
FWLIB,關于stm32單片機官方提供的庫函數(shù).
README,介紹文檔.
具體入下圖所示:

正點原子的工程文件目錄.

?為了方便起見,我們把src和include放入到一個新建的文件夾中.
這個文件夾命名為canfestival.

并在canfestival文件夾中復制源碼庫的src和include文件夾.

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


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


include里面有很多平臺的文件,這里我們只留下AVR的,
又因為我們使用的是keil,所以要把AVR文件進行改造.把AVR名字改成stm32.

然后進入該文件夾,去除掉多余的文件:


第四步:
添加如keil的工程里面,在keil工程里面新加入一個文件夾:canfestival.并把之前的src文件夾中的.c文件添加進去.?同樣,也需要添加.h文件.

第五步:
因為我們的這個工程是在AVR工程中改過來的,但是現(xiàn)在我們用的編譯器不是AVR而是keil.
所以要進行一下工程上的修改.編譯會報錯.

需要把config.h文件修改.

第六步:
保存后,再次進行編譯.因為函數(shù)不完整,會進行報錯.

從報錯中看,可以知道是缺5個函數(shù).
首先看start_and_seek_node()?和?start_node(),這兩個函數(shù)原型程序里是有的.
從keil中進行搜索就可以找到,但是為什么還會有報錯,就是因為keil不識別inline這個關鍵字,
把inline去掉即可.


另外還剩下下面三個函數(shù):
canSend()
getElapsedTime()
setTimer()
這三個函數(shù)是需要我們編寫的.(而且需要根據(jù)自己的平臺編寫,我們用的平臺是stm32)
canSend() ,作用是發(fā)送can數(shù)據(jù),最終canfestival庫發(fā)送數(shù)據(jù),都會調(diào)用canSend()函數(shù).
getElapsedTime(),作用是軟件定時器的修正(通過一個硬件定時器,來模擬多個軟件定時器).
setTimer(),作用是改變硬件定時器的溢出周期.
第七步:
上面講到還需要canSend(), getElapsedTime(), setTimer()三個函數(shù)需要編寫.
這里不能單單編寫這三個函數(shù).
需要配置stm32的can接口,也就是對can進行參數(shù)配置,初始化,使能.然后再調(diào)用canSend()才會有作用.
getElapsedTime(),?setTimer()要想起到作用,需要配置stm32的定時器.然后timer定時器才可以提供canfestival庫一個時鐘基準.
如果你用的是其他單片機,或者其他平臺,就需要配置其他平臺的can底層和定時器底層.
所以在工程目錄下面,又創(chuàng)建了兩個文件夾:

添加到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文件后,可以直接進行替換.)
字典是一個配置文檔,可以通過配置字典,來實現(xiàn)不同的通信內(nèi)容.
可以在工程目錄下面建立一個canfestival_master文件夾,用于保存字典的.c和.h文件:

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

canfestival_master.c文件內(nèi)容如下:
canfestival_master.h文件內(nèi)容如下:
然后進行編譯,就沒有報錯了.

主函數(shù)怎么寫
工程移植完成后,
需要進行"字典"的.c和.h生成.(按照自己的需求去生成)
需要按照自己的需求去編寫相應的主函數(shù)main.c了.
主函數(shù)的大體框架:
引入頭文件.
進行can初始化配置,前面canfestival_can.c中有.
進行硬件定時器初始化,前面canfestival_timer.c中有.
然后進行canfestival庫函數(shù)的調(diào)用.(配置節(jié)點為主或從,把can的狀態(tài)切換到操作模式)
進入while(1)循環(huán).

至此,移植工作圓滿完成了.