2021-08-16 20:03:01 索煒達(dá)電子 1977
項(xiàng)目編號:E212
文件大小:23.5M
源碼說明:帶中文注釋
開發(fā)環(huán)境:C編譯器
簡要概述:
這是一個(gè)CANopen協(xié)議通信例程,硬件平臺為STM32F103單片機(jī),實(shí)現(xiàn)了簡單的PDO和SDO通信,CANopen的實(shí)現(xiàn)是移植的開源協(xié)議棧CanFestival
CanFestival
CanFestival(官網(wǎng)鏈接https://canfestival.org/), 網(wǎng)上資料很多,入門也很簡單,官方的Manul寫的很簡潔易懂。用CanFestival開源協(xié)議棧之前主要是移植協(xié)議棧到自己的平臺上,支持的平臺很多,Linux和類Unix,Windows,32位ARM單片機(jī)...都可以移植使用,本工程是基于STM32F103平臺的應(yīng)用
硬件
使用STM32F103為主控,主機(jī)用的STM32F103ZET6,6個(gè)從機(jī)用的STM32F103C8T6,CAN收發(fā)器用的NXP家的TJA1050,便宜、好用。主機(jī)要跑emWin就加了塊SDRAM。
開發(fā)環(huán)境
Windows平臺開發(fā),用的MDK,下載后直接打開project文件夾下的工程文件即可打開工程。CANopen對象字典的編輯器我用的是Can Festival官方推薦的,雖然有點(diǎn)不怎么智能,但是湊活著用吧,畢竟自家的協(xié)議棧還得用自家的編輯器不是,避免踩坑嘛(其實(shí)官方的編輯器坑也多),另外由于監(jiān)視用的主機(jī)我加了塊五寸LCD顯示,懶得手寫GUI了,直接用的emWin圖形軟件框架。
主、從機(jī)
主機(jī)用STM32F103ZET6,從機(jī)用C8T6,例程里面,由于主機(jī)跑emWin,沒內(nèi)存跑操作系統(tǒng)了所以主機(jī)就直接裸奔了額,從機(jī)跑了FreeRTOS,整個(gè)系統(tǒng)就是模擬的工業(yè)現(xiàn)場的數(shù)據(jù)采集功能,從機(jī)采集數(shù)據(jù)通過PDO傳輸?shù)街鳈C(jī),主機(jī)用SDO向從機(jī)發(fā)送控制命令,主機(jī)可以監(jiān)視所有從機(jī)的心跳。 從機(jī)代碼是通用的,如果需要多個(gè)從機(jī),直接復(fù)制即可,不過要更改對應(yīng)的從機(jī)ID號。具體更改方法是下載從機(jī)代碼之后打開工程文件,找到node_coonfig.h文件,更改ID號,也可在這個(gè)文件下更改從機(jī)的心跳頻率。
#ifndef _NODE_CONFIG_H
#define _NODE_CONFIG_H
#define SLAVE_NODE_ID 4 //ID為4,可以任意更改,保留0號ID,0號為主機(jī)
#define Producer_Heartbeat_Time 500 //從機(jī)心跳頻率,任意更改,單位ms
#endif
文件列表:
目錄│文件列表:
│ CANopen-STM32F1.rar
└ CANopen-STM32F1
└ CANopen-STM32F1
├ CANOpenSlave_Ultra
│ │ Slave_ultra.od
│ ├ App
│ │ │ app.c
│ │ │ app.h
│ │ │ FreeRTOSConfig.h
│ │ │ main.c
│ │ │ stm32f10x_conf.h
│ │ │ stm32f10x_it.c
│ │ │ stm32f10x_it.h
│ │ └ canopen
│ │ │ canopen_app.c
│ │ │ canopen_app.h
│ │ │ canopen_drv.c
│ │ │ canopen_drv.h
│ │ │ config.h
│ │ │ Node_Config.h
│ │ │ Slave.c
│ │ └ Slave.h
│ ├ Bsp
│ │ │ bsp.c
│ │ │ bsp.h
│ │ │ bsp_can.c
│ │ │ bsp_can.h
│ │ │ bsp_timer.c
│ │ │ bsp_timer.h
│ │ │ bsp_usart.c
│ │ └ bsp_usart.h
│ ├ CANOpen
│ │ │ canopen_readme.txt
│ │ ├ inc
│ │ │ │ can.h
│ │ │ │ can_driver.h
│ │ │ │ data.h
│ │ │ │ dcf.h
│ │ │ │ def.h
│ │ │ │ emcy.h
│ │ │ │ lifegrd.h
│ │ │ │ lss.h
│ │ │ │ nmtMaster.h
│ │ │ │ nmtSlave.h
│ │ │ │ objacces.h
│ │ │ │ objdictdef.h
│ │ │ │ pdo.h
│ │ │ │ sdo.h
│ │ │ │ states.h
│ │ │ │ sync.h
│ │ │ │ sysdep.h
│ │ │ │ timer.h
│ │ │ │ timers_driver.h
│ │ │ └ stm32
│ │ │ │ applicfg.h
│ │ │ │ canfestival.h
│ │ │ └ timerscfg.h
│ │ └ 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
│ ├ Doc
│ │ └ ReadMe.txt
│ ├ FreeRTOS
│ │ │ croutine.c
│ │ │ event_groups.c
│ │ │ list.c
│ │ │ queue.c
│ │ │ readme.txt
│ │ │ stream_buffer.c
│ │ │ tasks.c
│ │ │ timers.c
│ │ ├ include
│ │ │ │ croutine.h
│ │ │ │ deprecated_definitions.h
│ │ │ │ event_groups.h
│ │ │ │ FreeRTOS.h
│ │ │ │ list.h
│ │ │ │ message_buffer.h
│ │ │ │ mpu_prototypes.h
│ │ │ │ mpu_wrappers.h
│ │ │ │ portable.h
│ │ │ │ projdefs.h
│ │ │ │ queue.h
│ │ │ │ semphr.h
│ │ │ │ StackMacros.h
│ │ │ │ stack_macros.h
│ │ │ │ stdint.readme
│ │ │ │ stream_buffer.h
│ │ │ │ task.h
│ │ │ └ timers.h
│ │ └ portable
│ │ ├ IAR
│ │ │ ├ ARM_CM0
│ │ │ │ │ port.c
│ │ │ │ │ portasm.s
│ │ │ │ └ portmacro.h
│ │ │ ├ ARM_CM3
│ │ │ │ │ port.c
│ │ │ │ │ portasm.s
│ │ │ │ └ portmacro.h
│ │ │ ├ ARM_CM4F
│ │ │ │ │ port.c
│ │ │ │ │ portasm.s
│ │ │ │ └ portmacro.h
│ │ │ ├ ARM_CM4F_MPU
│ │ │ │ │ port.c
│ │ │ │ │ portasm.s
│ │ │ │ └ portmacro.h
│ │ │ └ ARM_CM7
│ │ │ │ ReadMe.txt
│ │ │ └ r0p1
│ │ │ │ port.c
│ │ │ │ portasm.s
│ │ │ └ portmacro.h
│ │ ├ MemMang
│ │ │ │ heap_1.c
│ │ │ │ heap_2.c
│ │ │ │ heap_3.c
│ │ │ │ heap_4.c
│ │ │ │ heap_5.c
│ │ │ └ ReadMe.url
│ │ └ RVDS
│ │ ├ ARM7_LPC21xx
│ │ │ │ port.c
│ │ │ │ portASM.s
│ │ │ │ portmacro.h
│ │ │ └ portmacro.inc
│ │ ├ ARM_CA9
│ │ │ │ port.c
│ │ │ │ portASM.s
│ │ │ │ portmacro.h
│ │ │ └ portmacro.inc
│ │ ├ ARM_CM0
│ │ │ │ port.c
│ │ │ └ portmacro.h
│ │ ├ ARM_CM3
│ │ │ │ port.c
│ │ │ └ portmacro.h
│ │ ├ ARM_CM4F
│ │ │ │ port.c
│ │ │ └ portmacro.h
│ │ ├ ARM_CM4_MPU
│ │ │ │ port.c
│ │ │ └ portmacro.h
│ │ └ ARM_CM7
│ │ │ ReadMe.txt
│ │ └ r0p1
│ │ │ port.c
│ │ └ portmacro.h
│ ├ Libraries
│ │ ├ CMSIS
│ │ │ ├ CoreSupport
│ │ │ │ │ core_cm3.c
│ │ │ │ └ core_cm3.h
│ │ │ └ DeviceSupport
│ │ │ │ stm32f10x.h
│ │ │ │ system_stm32f10x.c
│ │ │ │ system_stm32f10x.h
│ │ │ └ startup
│ │ │ │ startup_stm32f10x_cl.s
│ │ │ │ startup_stm32f10x_hd.s
│ │ │ │ startup_stm32f10x_hd_vl.s
│ │ │ │ startup_stm32f10x_ld.s
│ │ │ │ startup_stm32f10x_ld_vl.s
│ │ │ │ startup_stm32f10x_md.s
│ │ │ │ startup_stm32f10x_md_vl.s
│ │ │ └ startup_stm32f10x_xl.s
│ │ └ STM32F10x_StdPeriph_Driver
│ │ ├ inc
│ │ │ │ misc.h
│ │ │ │ stm32f10x_adc.h
│ │ │ │ stm32f10x_bkp.h
│ │ │ │ stm32f10x_can.h
│ │ │ │ stm32f10x_cec.h
│ │ │ │ stm32f10x_crc.h
│ │ │ │ stm32f10x_dac.h
│ │ │ │ stm32f10x_dbgmcu.h
│ │ │ │ stm32f10x_dma.h
│ │ │ │ stm32f10x_exti.h
│ │ │ │ stm32f10x_flash.h
│ │ │ │ stm32f10x_fsmc.h
│ │ │ │ stm32f10x_gpio.h
│ │ │ │ stm32f10x_i2c.h
│ │ │ │ stm32f10x_iwdg.h
│ │ │ │ stm32f10x_pwr.h
│ │ │ │ stm32f10x_rcc.h
│ │ │ │ stm32f10x_rtc.h
│ │ │ │ stm32f10x_sdio.h
│ │ │ │ stm32f10x_spi.h
│ │ │ │ stm32f10x_tim.h
│ │ │ │ stm32f10x_usart.h
│ │ │ └ stm32f10x_wwdg.h
│ │ └ src
│ │ │ misc.c
│ │ │ stm32f10x_adc.c
│ │ │ stm32f10x_bkp.c
│ │ │ stm32f10x_can.c
│ │ │ stm32f10x_cec.c
│ │ │ stm32f10x_crc.c
│ │ │ stm32f10x_dac.c
│ │ │ stm32f10x_dbgmcu.c
│ │ │ stm32f10x_dma.c
│ │ │ stm32f10x_exti.c
│ │ │ stm32f10x_flash.c
│ │ │ stm32f10x_fsmc.c
│ │ │ stm32f10x_gpio.c
│ │ │ stm32f10x_i2c.c
│ │ │ stm32f10x_iwdg.c
│ │ │ stm32f10x_pwr.c
│ │ │ stm32f10x_rcc.c
│ │ │ stm32f10x_rtc.c
│ │ │ stm32f10x_sdio.c
│ │ │ stm32f10x_spi.c
│ │ │ stm32f10x_tim.c
│ │ │ stm32f10x_usart.c
│ │ └ stm32f10x_wwdg.c
│ └ Project
│ │ CANopen_Slave.uvguix.ZhiyangZhou
│ │ CANopen_Slave.uvoptx
│ │ CANopen_Slave.uvprojx
│ │ EventRecorderStub.scvd
│ │ JLinkLog.txt
│ │ JLinkSettings.ini
│ │ 雙擊刪除“編譯產(chǎn)生文件”.bat
│ ├ DebugConfig
│ │ │ CANOpenSlave_STM32F103C8_1.0.0.dbgconf
│ │ │ CANOpenSlave_STM32F103ZE_1.0.0.dbgconf
│ │ │ CANopen_Slave_STM32F103C8_1.0.0.dbgconf
│ │ └ Target_1_STM32F103C8_1.0.0.dbgconf
│ ├ Listings
│ │ │ CANopen_Slave.map
│ │ │ Demo.map
│ │ └ startup_stm32f10x_hd.lst
│ └ Objects
│ │ app.crf
│ │ app.d
│ │ app.o
│ │ bsp.crf
│ │ bsp.d
│ │ bsp.o
│ │ bsp_can.crf
│ │ bsp_can.d
│ │ bsp_can.o
│ │ bsp_timer.crf
│ │ bsp_timer.d
│ │ bsp_timer.o
│ │ bsp_usart.crf
│ │ bsp_usart.d
│ │ bsp_usart.o
│ │ canopen_app.crf
│ │ canopen_app.d
│ │ canopen_app.o
│ │ canopen_drv.crf
│ │ canopen_drv.d
│ │ canopen_drv.o
│ │ CANopen_Slave.axf
│ │ CANopen_Slave.build_log.htm
│ │ CANopen_Slave.htm
│ │ CANopen_Slave.lnp
│ │ CANopen_Slave.sct
│ │ CANopen_Slave_CANopen_Slave.dep
│ │ croutine.crf
│ │ croutine.d
│ │ croutine.o
│ │ dcf.crf
│ │ dcf.d
│ │ dcf.o
│ │ Demo.axf
│ │ Demo.build_log.htm
│ │ Demo.hex
│ │ Demo.htm
│ │ Demo.lnp
│ │ Demo.sct
│ │ Demo_CANOpenSlave.dep
│ │ emcy.crf
│ │ emcy.