2021-08-16 20:03:01 索炜达电子 2051
项目编号:E212
文件大小:23.5M
源码说明:带中文注释
开发环境:C编译器
简要概述:
这是一个CANopen协议通信例程,硬件平台为STM32F103单片机,实现了简单的PDO和SDO通信,CANopen的实现是移植的开源协议栈CanFestival
CanFestival
CanFestival(官网链接https://canfestival.org/), 网上资料很多,入门也很简单,官方的Manul写的很简洁易懂。用CanFestival开源协议栈之前主要是移植协议栈到自己的平台上,支持的平台很多,Linux和类Unix,Windows,32位ARM单片机...都可以移植使用,本工程是基于STM32F103平台的应用
硬件
使用STM32F103为主控,主机用的STM32F103ZET6,6个从机用的STM32F103C8T6,CAN收发器用的NXP家的TJA1050,便宜、好用。主机要跑emWin就加了块SDRAM。
开发环境
Windows平台开发,用的MDK,下载后直接打开project文件夹下的工程文件即可打开工程。CANopen对象字典的编辑器我用的是Can Festival官方推荐的,虽然有点不怎么智能,但是凑活着用吧,毕竟自家的协议栈还得用自家的编辑器不是,避免踩坑嘛(其实官方的编辑器坑也多),另外由于监视用的主机我加了块五寸LCD显示,懒得手写GUI了,直接用的emWin图形软件框架。
主、从机
主机用STM32F103ZET6,从机用C8T6,例程里面,由于主机跑emWin,没内存跑操作系统了所以主机就直接裸奔了额,从机跑了FreeRTOS,整个系统就是模拟的工业现场的数据采集功能,从机采集数据通过PDO传输到主机,主机用SDO向从机发送控制命令,主机可以监视所有从机的心跳。 从机代码是通用的,如果需要多个从机,直接复制即可,不过要更改对应的从机ID号。具体更改方法是下载从机代码之后打开工程文件,找到node_coonfig.h文件,更改ID号,也可在这个文件下更改从机的心跳频率。
#ifndef _NODE_CONFIG_H
#define _NODE_CONFIG_H
#define SLAVE_NODE_ID 4 //ID为4,可以任意更改,保留0号ID,0号为主机
#define Producer_Heartbeat_Time 500 //从机心跳频率,任意更改,单位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
│ │ 双击删除“编译产生文件”.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.