CANopen移植步骤和ESD编辑器安装方式
CANopen移植步驟和ESD編輯器安裝方式
前言
參考網上的方式,整理了一下個人實操步驟!
一、環境搭建
下載CANFestival源碼和對象字典工具,可以從官網下載也可以從各個論壇下載,所有需要的東西我打包在我的網盤當中方便下載
鏈接:https://pan.baidu.com/s/1ee5PeAU23vLV0dZP_oE91Q
提取碼:1234
1.1安裝順序
(1)python-2.7.3 ?
?
默認安裝步驟結束之后開始創建環境變量,
其中4為python安裝的路徑,軟件不大建議直接默認安裝。設置好環境變量之后代開命令運行窗口(快捷鍵WIN+R)輸入CMD。
再在窗口輸入python,顯示如圖界面(提示python版本)則代表環境變量創建成功。
(2)wxPython2.8
?
(3)beremiz
安裝的時候都安裝路徑都選C盤(就是默認路徑)。
然后再裝beremiz,裝完之后在beremiz的文件夾中的canfestival-3中,找到這個C:\Program Files (x86)\Beremiz\CanFestival-3\objdictgen\ objdictedit.py文件雙擊就可以了,打開后界面如圖所示。
至此對象字典安裝完成如何使用后面會有講解。
二、CANfestival移植步驟
1.步驟1
新建或者找一份STM32的最簡單的歷程代碼打開在其中建立CanFestival文件夾,再在CanFestival文件夾下建立dirver、inc和src文件夾,繼續在inc文件夾下建立stm32文件夾
?
?
2.步驟二
找TIM底層配置和CAN底層配置,底層配置需要改名字為bsp_******,因為后面會和CANFestival當中的can.c沖突。
3.步驟三
將我們需要的CANFestival源碼當中的文件分別復制到我們新建的文件夾下面。
(1)將CanFestival-3-10\src目錄下的dcf.c、emcy.c、lifegrd.c、lss.c、nmtMaster.c、nmtSlave.c、objacces.c、pdo.c、sdo.c、states.c、sync.c、timer.c共12個文件拷貝到?CanFestival\src目錄下。
(2)將CanFestival-3-10\include目錄下的所有.h文件共19個文件全部拷貝到CanFestival\inc目錄下,再把CanFestival-3-10\examples\AVR\Slave目錄下的ObjDict.h文件拷貝到CanFestival\inc目錄下,一共20個;
(3)將CanFestival-3-10\include\AVR目錄下的applicfg.h、canfestival.h、config.h、timerscfg.h共4個頭文件拷貝到Canfestival\inc\stm32 目錄下;
(4)在該目錄下新建 stm32_canfestival.c和stm32_canfestival.h文件。打開對象字典編輯器C:\Program Files (x86)\Beremiz\CanFestival-3\objdictgen\objdictedit.py(先做最簡單的心跳報文測試)其他的后續再研究。點擊文件新建按照下圖建立新節點。
點擊確定——然后點擊文件——另存為(.od文件)保存在桌面等會要用。
繼續點擊文件——建立字典——保存在桌面(.c文件)但其實會生成兩個文件一個現在
桌面總共三個文件TestMaster.c、TestMaster.h、TestMaster.od。
將這三個文件復制到C:\Users\YIJIAHE\Desktop\CANFestival_Master\CanFestival\driver文件夾下,現在該文件夾下總共五個文件。(從站建立的三個文件也一樣用對象字典編輯器建立時將名字改為TestSlave.c即可)
如果實現的是從設備,再將canfestival\driver目錄下的TestSlave.c文件添加到工程,如果實現的是主設備,則將TestMaster.c文件添加到工程。
4.步驟四
打開工程文件,將剛才.c文件添加到工程,再設置文件路徑。在stm32_canfestival.c中包含頭文件#include "canfestival.h"
(1)編輯 stm32_canfestival.c文件如下:
#include "stm32_canfestival.h" #include "bsp_can.h" unsigned int TimeCNT=0;//時間計數 unsigned int NextTime=0;//下一次觸發時間計數 unsigned int TIMER_MAX_COUNT=70000;//最大時間計數 static TIMEVAL last_time_set = TIMEVAL_MAX;//上一次的時間計數 void setTimer(TIMEVAL value){NextTime=(TimeCNT+value)%TIMER_MAX_COUNT;} TIMEVAL getElapsedTime(void) {int ret=0; ret = TimeCNT> last_time_set ? TimeCNT - last_time_set : TimeCNT + TIMER_MAX_COUNT - last_time_set;return ret; }unsigned char canSend(CAN_PORT notused, Message *m) { uint32_t i;CanTxMsg TxMessage;CanTxMsg *ptx_msg=&TxMessage;ptx_msg->StdId = m->cob_id;if(m->rtr)ptx_msg->RTR = CAN_RTR_REMOTE;elseptx_msg->RTR = CAN_RTR_DATA;ptx_msg->IDE = CAN_ID_STD;ptx_msg->DLC = m->len;for(i = 0; i < m->len; i++)ptx_msg->Data[i] = m->data[i];if( CAN_Transmit( CAN1, ptx_msg )==CAN_NO_MB){return 0xff;}else{return 0x00;} } void timerForCan(void) {TimeCNT++;if (TimeCNT>=TIMER_MAX_COUNT){TimeCNT=0;}if (TimeCNT==NextTime){last_time_set = TimeCNT;TimeDispatch();} }?
(2)canfestival.h文件如下:
#ifndef __STM32_CANFESTIVAL_H #define __STM32_CANFESTIVAL_H #include "canfestival.h" void setTimer(TIMEVAL value); TIMEVAL getElapsedTime(void); unsigned char canSend(CAN_PORT notused, Message *m); void timerForCan(void); #endif(3)打開can中斷,并且在bsp_can.c文件中添加回調函數
//中斷服務函數?????????????????????? ???void USB_LP_CAN1_RX0_IRQHandler(void){//? ???? CanRxMsg RxMessage;//??????? int i=0;//??? CAN_Receive(CAN1, 0, &RxMessage);//??????? for(i=0;i<8;i++)//??????? printf("rxbuf[%d]:%d\r\n",i,RxMessage.Data[i]);u32 i;Message m;CanRxMsg RxMessage;CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);m.cob_id=RxMessage.StdId;if(RxMessage.RTR == CAN_RTR_REMOTE)m.rtr=1;else if(RxMessage.RTR == CAN_RTR_DATA)m.rtr=0;m.len=RxMessage.DLC;for(i = 0; i < RxMessage.DLC; i++)m.data[i] = RxMessage.Data[i];canDispatch(&TestMaster_Data, &m);}
通過以上幾步,所有的文件都弄齊了,但是編譯一定會出現報錯,注釋或刪除掉config.h文件中的如下幾行,打開def.c 文件刪除兩個inline關鍵字
其他就是文件包含的問題了,解決了之后繼續往下做。
MS_TO_TIMEVAL和US_TO_TIMEVAL兩個宏定義,需要修改為對應的中斷時間,否則會對字典配置參數的ms和us單位有影響
?
5.步驟五
主函數代碼當中加入CAN、TIM初始化和CANFestival相關如下:
CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_6tq,CAN_BS1_7tq,6,CAN_Mode_Normal);setNodeId(&TestMaster_Data, nodeID);setState(&TestMaster_Data, Initialisation);setState(&TestMaster_Data, Operational); TIM3_Int_Init(1000-1,84-1);?
并且加入Can_Send_Msg(canbuf,8);來測試底層是否正確,
編譯包含頭文件,解決掉所有錯誤之后繼續往下做。到這里如果能解決掉所有問題,代碼移植就完成了下面就用一個Can卡來測試,使用的是廣成ECANTools軟件和USBCAN-II Pro,來進行測試。
/*此處會導致代碼跑飛硬件錯誤*/ const indextable * TestMaster_scanIndexOD (UNS16 wIndex, UNS32 * errorCode, ODCallback_t **callbacks) {int i;*callbacks = NULL;switch(wIndex){case 0x1000: i = 0;break;case 0x1001: i = 1;break;case 0x1017: i = 2;*callbacks = TestMaster_Index1017_callbacks; break;case 0x1018: i = 3;break;default: // *errorCode = OD_NO_SUCH_OBJECT;return NULL;}*errorCode = OD_SUCCESSFUL;return &TestMaster_objdict[i]; }至此代碼移植就完成了。
跟蹤setState(&ObjDict_Data, Initialisation);?之后會自動跳到Pre_operational狀態,該狀態支持{0, 1, 1, 1, 1, 0, 1}; switchCommunicationState()中會執行StartOrStop(csLifeGuard,lifeGuardInit(d),lifeGuardStop(d))這就會執行lifeGuardInit(d),?就會執行heartbeatInit(d);定時時間到就會執行ProducerHeartbeatAlarm(),該函數就會調用底層CAN發送函數canSend(d->canHandle,&msg );發送心跳報文,幀ID為0x701。
?
總結
經測試CANFestival心跳功能正常,說明CANopen底層與應用層對接成功,其余功能待開發。
總結
以上是生活随笔為你收集整理的CANopen移植步骤和ESD编辑器安装方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于CSS Reset 那些事(一)之
- 下一篇: Zbrush 4R7中镜像教程