CANopen移植步骤和ESD编辑器安装方式
CANopen移植步驟和ESD編輯器安裝方式
前言
參考網(wǎng)上的方式,整理了一下個(gè)人實(shí)操步驟!
一、環(huán)境搭建
下載CANFestival源碼和對象字典工具,可以從官網(wǎng)下載也可以從各個(gè)論壇下載,所有需要的東西我打包在我的網(wǎng)盤當(dāng)中方便下載
鏈接:https://pan.baidu.com/s/1ee5PeAU23vLV0dZP_oE91Q
提取碼:1234
1.1安裝順序
(1)python-2.7.3 ?
?
默認(rèn)安裝步驟結(jié)束之后開始創(chuàng)建環(huán)境變量,
其中4為python安裝的路徑,軟件不大建議直接默認(rèn)安裝。設(shè)置好環(huán)境變量之后代開命令運(yùn)行窗口(快捷鍵WIN+R)輸入CMD。
再在窗口輸入python,顯示如圖界面(提示python版本)則代表環(huán)境變量創(chuàng)建成功。
(2)wxPython2.8
?
(3)beremiz
安裝的時(shí)候都安裝路徑都選C盤(就是默認(rèn)路徑)。
然后再裝beremiz,裝完之后在beremiz的文件夾中的canfestival-3中,找到這個(gè)C:\Program Files (x86)\Beremiz\CanFestival-3\objdictgen\ objdictedit.py文件雙擊就可以了,打開后界面如圖所示。
至此對象字典安裝完成如何使用后面會(huì)有講解。
二、CANfestival移植步驟
1.步驟1
新建或者找一份STM32的最簡單的歷程代碼打開在其中建立CanFestival文件夾,再在CanFestival文件夾下建立dirver、inc和src文件夾,繼續(xù)在inc文件夾下建立stm32文件夾
?
?
2.步驟二
找TIM底層配置和CAN底層配置,底層配置需要改名字為bsp_******,因?yàn)楹竺鏁?huì)和CANFestival當(dāng)中的can.c沖突。
3.步驟三
將我們需要的CANFestival源碼當(dāng)中的文件分別復(fù)制到我們新建的文件夾下面。
(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個(gè)文件拷貝到?CanFestival\src目錄下。
(2)將CanFestival-3-10\include目錄下的所有.h文件共19個(gè)文件全部拷貝到CanFestival\inc目錄下,再把CanFestival-3-10\examples\AVR\Slave目錄下的ObjDict.h文件拷貝到CanFestival\inc目錄下,一共20個(gè);
(3)將CanFestival-3-10\include\AVR目錄下的applicfg.h、canfestival.h、config.h、timerscfg.h共4個(gè)頭文件拷貝到Canfestival\inc\stm32 目錄下;
(4)在該目錄下新建 stm32_canfestival.c和stm32_canfestival.h文件。打開對象字典編輯器C:\Program Files (x86)\Beremiz\CanFestival-3\objdictgen\objdictedit.py(先做最簡單的心跳報(bào)文測試)其他的后續(xù)再研究。點(diǎn)擊文件新建按照下圖建立新節(jié)點(diǎn)。
點(diǎn)擊確定——然后點(diǎn)擊文件——另存為(.od文件)保存在桌面等會(huì)要用。
繼續(xù)點(diǎn)擊文件——建立字典——保存在桌面(.c文件)但其實(shí)會(huì)生成兩個(gè)文件一個(gè)現(xiàn)在
桌面總共三個(gè)文件TestMaster.c、TestMaster.h、TestMaster.od。
將這三個(gè)文件復(fù)制到C:\Users\YIJIAHE\Desktop\CANFestival_Master\CanFestival\driver文件夾下,現(xiàn)在該文件夾下總共五個(gè)文件。(從站建立的三個(gè)文件也一樣用對象字典編輯器建立時(shí)將名字改為TestSlave.c即可)
如果實(shí)現(xiàn)的是從設(shè)備,再將canfestival\driver目錄下的TestSlave.c文件添加到工程,如果實(shí)現(xiàn)的是主設(shè)備,則將TestMaster.c文件添加到工程。
4.步驟四
打開工程文件,將剛才.c文件添加到工程,再設(shè)置文件路徑。在stm32_canfestival.c中包含頭文件#include "canfestival.h"
(1)編輯 stm32_canfestival.c文件如下:
#include "stm32_canfestival.h" #include "bsp_can.h" unsigned int TimeCNT=0;//時(shí)間計(jì)數(shù) unsigned int NextTime=0;//下一次觸發(fā)時(shí)間計(jì)數(shù) unsigned int TIMER_MAX_COUNT=70000;//最大時(shí)間計(jì)數(shù) static TIMEVAL last_time_set = TIMEVAL_MAX;//上一次的時(shí)間計(jì)數(shù) 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文件中添加回調(diào)函數(shù)
//中斷服務(wù)函數(shù)?????????????????????? ???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);}
通過以上幾步,所有的文件都弄齊了,但是編譯一定會(huì)出現(xiàn)報(bào)錯(cuò),注釋或刪除掉config.h文件中的如下幾行,打開def.c 文件刪除兩個(gè)inline關(guān)鍵字
其他就是文件包含的問題了,解決了之后繼續(xù)往下做。
MS_TO_TIMEVAL和US_TO_TIMEVAL兩個(gè)宏定義,需要修改為對應(yīng)的中斷時(shí)間,否則會(huì)對字典配置參數(shù)的ms和us單位有影響
?
5.步驟五
主函數(shù)代碼當(dāng)中加入CAN、TIM初始化和CANFestival相關(guān)如下:
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);來測試底層是否正確,
編譯包含頭文件,解決掉所有錯(cuò)誤之后繼續(xù)往下做。到這里如果能解決掉所有問題,代碼移植就完成了下面就用一個(gè)Can卡來測試,使用的是廣成ECANTools軟件和USBCAN-II Pro,來進(jìn)行測試。
/*此處會(huì)導(dǎo)致代碼跑飛硬件錯(cuò)誤*/ 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);?之后會(huì)自動(dòng)跳到Pre_operational狀態(tài),該狀態(tài)支持{0, 1, 1, 1, 1, 0, 1}; switchCommunicationState()中會(huì)執(zhí)行StartOrStop(csLifeGuard,lifeGuardInit(d),lifeGuardStop(d))這就會(huì)執(zhí)行l(wèi)ifeGuardInit(d),?就會(huì)執(zhí)行heartbeatInit(d);定時(shí)時(shí)間到就會(huì)執(zhí)行ProducerHeartbeatAlarm(),該函數(shù)就會(huì)調(diào)用底層CAN發(fā)送函數(shù)canSend(d->canHandle,&msg );發(fā)送心跳報(bào)文,幀ID為0x701。
?
總結(jié)
經(jīng)測試CANFestival心跳功能正常,說明CANopen底層與應(yīng)用層對接成功,其余功能待開發(fā)。
總結(jié)
以上是生活随笔為你收集整理的CANopen移植步骤和ESD编辑器安装方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于CSS Reset 那些事(一)之
- 下一篇: Zbrush 4R7中镜像教程