canfestival系列教程之程序移植

步骤一:

首先准备一个工程

确保这个工程是可以用的,比如用正点原子的can工程

第二步:

从官网上下载一个源码程序,解压:

打开之后,有很多文件,我们只取其中的两个文件

src文件夹(里面是.c文件)

include文件夹(里面是.h文件)

第三步:

把  src文件夹  和  include文件夹  复制到工程目录下面.具体放入到工程的哪里,可以按照自己的意愿.

先分析一下正点原子的工程:

正点原子的工程比较规范,工程下面有6个文件夹,每个文件夹都有不同的作用:

USER,代表最上层的函数,实现程序主要功能的逻辑和顺序.

HARDWARE,用于编写各个器件的.c和.h文件,里面就是每个硬件各自的功能.

SYSTEM,系统的东西.

CORE,关于stm32单片机内核的东西,比如启动文件.

FWLIB,关于stm32单片机官方提供的库函数.

README,介绍文档.

具体入下图所示:

添加前

正点原子的工程文件目录.

添加前

 为了方便起见,我们把src和include放入到一个新建的文件夹中.

这个文件夹命名为canfestival.

添加后

并在canfestival文件夹中复制源码库的src和include文件夹.

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

src去除前(标红为需要去除的)
src去除后

(注意symbols.c文件也要去除)

同理,打开include文件夹,去除多余的文件

include去除前
include文件夹去除后

include里面有很多平台的文件,这里我们只留下AVR的,

又因为我们使用的是keil,所以要把AVR文件进行改造.把AVR名字改成stm32.

然后进入该文件夹,去除掉多余的文件:

去除前
去除后

第四步:

添加如keil的工程里面,在keil工程里面新加入一个文件夹:canfestival.并把之前的src文件夹中的.c文件添加进去. 同样,也需要添加.h文件.

第五步:

因为我们的这个工程是在AVR工程中改过来的,但是现在我们用的编译器不是AVR而是keil.

所以要进行一下工程上的修改.编译会报错.

需要把config.h文件修改.

第六步:

保存后,再次进行编译.因为函数不完整,会进行报错.

从报错中看,可以知道是缺5个函数.

首先看start_and_seek_node() 和 start_node(),这两个函数原型程序里是有的.

从keil中进行搜索就可以找到,但是为什么还会有报错,就是因为keil不识别inline这个关键字,

把inline去掉即可.


另外还剩下下面三个函数:

canSend()

getElapsedTime()

setTimer()

这三个函数是需要我们编写的.(而且需要根据自己的平台编写,我们用的平台是stm32)

canSend() ,作用是发送can数据,最终canfestival库发送数据,都会调用canSend()函数.

getElapsedTime(),作用是软件定时器的修正(通过一个硬件定时器,来模拟多个软件定时器).

setTimer(),作用是改变硬件定时器的溢出周期.

第七步:

上面讲到还需要canSend(), getElapsedTime(), setTimer()三个函数需要编写.

这里不能单单编写这三个函数.

需要配置stm32的can接口,也就是对can进行参数配置,初始化,使能.然后再调用canSend()才会有作用.

getElapsedTime(), setTimer()要想起到作用,需要配置stm32的定时器.然后timer定时器才可以提供canfestival库一个时钟基准.

如果你用的是其他单片机,或者其他平台,就需要配置其他平台的can底层和定时器底层.


所以在工程目录下面,又创建了两个文件夹:

添加到keil的工程中:

在canfestival_can  中添加  canfestival_can.c  和  canfestival_can.h  文件.

这里面主要添加stm32单片机can的底层配置.

在canfestival_timer  中添加  canfestival_timer.c  和  canfestival_timer.h  文件.

主要添加stm32单片机的定时器配置.


canfestival_can.c文件如下:

#include "stm32f4xx.h"
#include "canfestival_can.h"
#include "canfestival.h"

/* CANOPEN字典 */
extern CO_Data masterObjdict_Data;

/* 功能: GPIO配置
参数: 无
返回值:无
*/

static void gpio_config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

<span class="token function">RCC_AHB1PeriphClockCmd</span><span class="token punctuation">(</span>RCC_AHB1Periph_GPIOD<span class="token punctuation">,</span> <span class="token constant">ENABLE</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//使能PORTA时钟</span>

GPIO_InitStructure<span class="token punctuation">.</span>GPIO_Pin <span class="token operator">=</span> GPIO_Pin_0<span class="token operator">|</span> GPIO_Pin_1<span class="token punctuation">;</span>
GPIO_InitStructure<span class="token punctuation">.</span>GPIO_Mode <span class="token operator">=</span> GPIO_Mode_AF<span class="token punctuation">;</span>         <span class="token comment">//复用功能</span>
GPIO_InitStructure<span class="token punctuation">.</span>GPIO_OType <span class="token operator">=</span> GPIO_OType_PP<span class="token punctuation">;</span>       <span class="token comment">//推挽输出</span>
GPIO_InitStructure<span class="token punctuation">.</span>GPIO_Speed <span class="token operator">=</span> GPIO_Speed_50MHz<span class="token punctuation">;</span>    <span class="token comment">//100MHz  GPIO_Speed_100MHz</span>
GPIO_InitStructure<span class="token punctuation">.</span>GPIO_PuPd <span class="token operator">=</span> GPIO_PuPd_UP<span class="token punctuation">;</span>         <span class="token comment">//上拉</span>
<span class="token function">GPIO_Init</span><span class="token punctuation">(</span><span class="token constant">GPIOD</span><span class="token punctuation">,</span> <span class="token operator">&amp;</span>GPIO_InitStructure<span class="token punctuation">)</span><span class="token punctuation">;</span>               <span class="token comment">//初始化</span>

<span class="token function">GPIO_PinAFConfig</span><span class="token punctuation">(</span><span class="token constant">GPIOD</span><span class="token punctuation">,</span>GPIO_PinSource0<span class="token punctuation">,</span><span class="token constant">GPIO_AF_CAN1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//复用为CAN1</span>
<span class="token function">GPIO_PinAFConfig</span><span class="token punctuation">(</span><span class="token constant">GPIOD</span><span class="token punctuation">,</span>GPIO_PinSource1<span class="token punctuation">,</span><span class="token constant">GPIO_AF_CAN1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//复用为CAN1</span>

}

/* 功能: 中断嵌套控制器配置
参数: 无
返回值:无
*/

static void nvic_config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;

<span class="token comment">/* 设置CAN接收中断,先占优先级2,从站优先级2 */</span>
NVIC_InitStructure<span class="token punctuation">.</span>NVIC_IRQChannel <span class="token operator">=</span> CAN1_RX0_IRQn<span class="token punctuation">;</span>
NVIC_InitStructure<span class="token punctuation">.</span>NVIC_IRQChannelPreemptionPriority <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span>
NVIC_InitStructure<span class="token punctuation">.</span>NVIC_IRQChannelSubPriority <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span>
NVIC_InitStructure<span class="token punctuation">.</span>NVIC_IRQChannelCmd <span class="token operator">=</span> <span class="token constant">ENABLE</span><span class="token punctuation">;</span>

<span class="token comment">/* 初始化中断 */</span>
<span class="token function">NVIC_Init</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>NVIC_InitStructure<span class="token punctuation">)</span><span class="token punctuation">;</span>

}

/* 功能: CAN总线过滤器配置
参数: 无
返回值:无
*/

static void can_filter_config(void)
{
CAN_FilterInitTypeDef CAN_FilterInitStructure;

<span class="token comment">/* 配置过滤器0组,配置成标准标识符且低7位都为0时接受 */</span>
CAN_FilterInitStructure<span class="token punctuation">.</span>CAN_FilterNumber <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>						<span class="token comment">/* 设置过滤器组0 */</span>
CAN_FilterInitStructure<span class="token punctuation">.</span>CAN_FilterMode <span class="token operator">=</span> CAN_FilterMode_IdMask<span class="token punctuation">;</span>		<span class="token comment">/* 屏蔽模式 */</span>
CAN_FilterInitStructure<span class="token punctuation">.</span>CAN_FilterScale <span class="token operator">=</span> CAN_FilterScale_32bit<span class="token punctuation">;</span>	<span class="token comment">/* 32位模式 */</span>
CAN_FilterInitStructure<span class="token punctuation">.</span>CAN_FilterMaskIdHigh <span class="token operator">=</span> <span class="token number">0x0000</span><span class="token punctuation">;</span>					<span class="token comment">/* 在CANOpen中标准标识符的低7位表示节点ID */</span>
CAN_FilterInitStructure<span class="token punctuation">.</span>CAN_FilterMaskIdLow <span class="token operator">=</span> <span class="token number">0x0004</span><span class="token punctuation">;</span>					<span class="token comment">/* 在CANOpen中只用标准标识符,数据帧/远程帧都有 */</span>
CAN_FilterInitStructure<span class="token punctuation">.</span>CAN_FilterIdHigh <span class="token operator">=</span> <span class="token number">0x0000</span><span class="token punctuation">;</span>						<span class="token comment">/* 主节点ID为0 */</span>
CAN_FilterInitStructure<span class="token punctuation">.</span>CAN_FilterIdLow <span class="token operator">=</span> <span class="token number">0x0000</span><span class="token punctuation">;</span>						<span class="token comment">/* 标准帧 */</span>
CAN_FilterInitStructure<span class="token punctuation">.</span>CAN_FilterFIFOAssignment <span class="token operator">=</span> CAN_Filter_FIFO0<span class="token punctuation">;</span>	<span class="token comment">/* 过滤器关联到FIFO0 */</span>
CAN_FilterInitStructure<span class="token punctuation">.</span>CAN_FilterActivation <span class="token operator">=</span> <span class="token constant">ENABLE</span><span class="token punctuation">;</span>					<span class="token comment">/* 使能过滤器 */</span>
<span class="token function">CAN_FilterInit</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>CAN_FilterInitStructure<span class="token punctuation">)</span><span class="token punctuation">;</span>

}

/* 功能: can总线配置
参数: 无
返回值:无
*/

void CANOpen_can_config(void)
{
CAN_InitTypeDef CAN_InitStructure;

<span class="token comment">/* 配置IO */</span>
<span class="token function">gpio_config</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">/* 中断嵌套控制器配置 */</span>
<span class="token function">nvic_config</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">/* 配置CAN总线时钟 */</span>
<span class="token function">RCC_APB1PeriphClockCmd</span><span class="token punctuation">(</span>RCC_APB1Periph_CAN1<span class="token punctuation">,</span> <span class="token constant">ENABLE</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">/* CAN1默认参数 */</span>
<span class="token function">CAN_DeInit</span><span class="token punctuation">(</span><span class="token constant">CAN1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">/* 将结构体填入默认参数 */</span>
<span class="token function">CAN_StructInit</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>CAN_InitStructure<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">/* 关闭时间触发模式 */</span>
CAN_InitStructure<span class="token punctuation">.</span><span class="token constant">CAN_TTCM</span> <span class="token operator">=</span> <span class="token constant">DISABLE</span><span class="token punctuation">;</span>
<span class="token comment">/* 关闭自动离线管理 */</span>
CAN_InitStructure<span class="token punctuation">.</span><span class="token constant">CAN_ABOM</span> <span class="token operator">=</span> <span class="token constant">ENABLE</span><span class="token punctuation">;</span>
<span class="token comment">/* 关闭自动唤醒 */</span>
CAN_InitStructure<span class="token punctuation">.</span><span class="token constant">CAN_AWUM</span> <span class="token operator">=</span> <span class="token constant">ENABLE</span><span class="token punctuation">;</span>
<span class="token comment">/* 自动重传 */</span>
CAN_InitStructure<span class="token punctuation">.</span><span class="token constant">CAN_NART</span> <span class="token operator">=</span> <span class="token constant">DISABLE</span><span class="token punctuation">;</span>
<span class="token comment">/* 禁止FIFO溢出时覆盖原报文 */</span>
CAN_InitStructure<span class="token punctuation">.</span><span class="token constant">CAN_RFLM</span> <span class="token operator">=</span> <span class="token constant">DISABLE</span><span class="token punctuation">;</span>
<span class="token comment">/* 关闭优先级取决于ID */</span>
CAN_InitStructure<span class="token punctuation">.</span><span class="token constant">CAN_TXFP</span> <span class="token operator">=</span> <span class="token constant">DISABLE</span><span class="token punctuation">;</span>
<span class="token comment">/* 正常模式 */</span>
CAN_InitStructure<span class="token punctuation">.</span>CAN_Mode <span class="token operator">=</span> CAN_Mode_Normal<span class="token punctuation">;</span>

<span class="token comment">/* 设置波特率:36MHz/9/(2+1+1)=1mbps */</span>
CAN_InitStructure<span class="token punctuation">.</span><span class="token constant">CAN_SJW</span> <span class="token operator">=</span> CAN_SJW_1tq<span class="token punctuation">;</span>
CAN_InitStructure<span class="token punctuation">.</span><span class="token constant">CAN_BS1</span> <span class="token operator">=</span> CAN_BS1_2tq<span class="token punctuation">;</span>
CAN_InitStructure<span class="token punctuation">.</span><span class="token constant">CAN_BS2</span> <span class="token operator">=</span> CAN_BS2_1tq<span class="token punctuation">;</span>
CAN_InitStructure<span class="token punctuation">.</span>CAN_Prescaler <span class="token operator">=</span> <span class="token number">9</span><span class="token punctuation">;</span>

<span class="token comment">/* 初始化CAN总线 */</span>
<span class="token function">CAN_Init</span><span class="token punctuation">(</span><span class="token constant">CAN1</span><span class="token punctuation">,</span> <span class="token operator">&amp;</span>CAN_InitStructure<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">/* CAN总线过滤器配置 */</span>
<span class="token function">can_filter_config</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">/* 接收挂起中断 */</span>
<span class="token function">CAN_ITConfig</span><span class="token punctuation">(</span><span class="token constant">CAN1</span><span class="token punctuation">,</span> <span class="token constant">CAN_IT_FMP0</span><span class="token punctuation">,</span> <span class="token constant">ENABLE</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

}

/* can总线接收中断回调函数 */
void CAN1_RX0_IRQHandler(void)
{
CanRxMsg message;
Message Rx_Message;

<span class="token comment">/* 接收消息 */</span>
<span class="token function">CAN_Receive</span><span class="token punctuation">(</span><span class="token constant">CAN1</span><span class="token punctuation">,</span> <span class="token constant">CAN_FIFO0</span><span class="token punctuation">,</span> <span class="token operator">&amp;</span>message<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">/* 组装canopen数据包 */</span>
Rx_Message<span class="token punctuation">.</span>cob_id <span class="token operator">=</span> message<span class="token punctuation">.</span>StdId<span class="token punctuation">;</span>						<span class="token comment">/* 功能码和节点ID */</span>
Rx_Message<span class="token punctuation">.</span>rtr <span class="token operator">=</span> <span class="token punctuation">(</span>message<span class="token punctuation">.</span><span class="token constant">RTR</span> <span class="token operator">==</span> <span class="token constant">CAN_RTR_DATA</span><span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token number">0</span> <span class="token operator">:</span> <span class="token number">1</span><span class="token punctuation">;</span>	<span class="token comment">/* 标识符类型 */</span>
Rx_Message<span class="token punctuation">.</span>len <span class="token operator">=</span> message<span class="token punctuation">.</span><span class="token constant">DLC</span><span class="token punctuation">;</span>							<span class="token comment">/* 数据包长度 */</span>
<span class="token function">memcpy</span><span class="token punctuation">(</span>Rx_Message<span class="token punctuation">.</span>data<span class="token punctuation">,</span> message<span class="token punctuation">.</span>Data<span class="token punctuation">,</span> message<span class="token punctuation">.</span><span class="token constant">DLC</span><span class="token punctuation">)</span><span class="token punctuation">;</span>		<span class="token comment">/* 数据 */</span>

<span class="token comment">/* canopen数据包分配处理函数 */</span>
<span class="token function">canDispatch</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>masterObjdict_Data<span class="token punctuation">,</span> <span class="token operator">&amp;</span>Rx_Message<span class="token punctuation">)</span><span class="token punctuation">;</span>

}

/* 功能: CAN发送数据函数
参数: notused can总线端口
message canopen数据包
返回值: 0 成功
1 失败
/

uint8_t canSend(CAN_PORT notused, Message message)
{
uint32_t i = 0xFFFFFF;
CanTxMsg TxMessage;
uint8_t TransmitMailbox = 0;

<span class="token comment">/* 组装CAN数据包 */</span>
TxMessage<span class="token punctuation">.</span><span class="token constant">DLC</span> <span class="token operator">=</span> message<span class="token operator">-</span><span class="token operator">&gt;</span>len<span class="token punctuation">;</span>							<span class="token comment">/* 数据长度 */</span>
<span class="token function">memcpy</span><span class="token punctuation">(</span>TxMessage<span class="token punctuation">.</span>Data<span class="token punctuation">,</span> message<span class="token operator">-</span><span class="token operator">&gt;</span>data<span class="token punctuation">,</span> message<span class="token operator">-</span><span class="token operator">&gt;</span>len<span class="token punctuation">)</span><span class="token punctuation">;</span>	<span class="token comment">/* 数据 */</span>
TxMessage<span class="token punctuation">.</span><span class="token constant">IDE</span> <span class="token operator">=</span> <span class="token constant">CAN_ID_STD</span><span class="token punctuation">;</span>								<span class="token comment">/* 标准ID */</span>
TxMessage<span class="token punctuation">.</span>StdId <span class="token operator">=</span> message<span class="token operator">-</span><span class="token operator">&gt;</span>cob_id<span class="token punctuation">;</span>						<span class="token comment">/* 标识符 */</span>
TxMessage<span class="token punctuation">.</span><span class="token constant">RTR</span> <span class="token operator">=</span> <span class="token punctuation">(</span>message<span class="token operator">-</span><span class="token operator">&gt;</span>rtr <span class="token operator">==</span> <span class="token constant">CAN_RTR_DATA</span><span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token number">0</span> <span class="token operator">:</span> <span class="token number">2</span><span class="token punctuation">;</span>	<span class="token comment">/* 数据帧 */</span>

<span class="token comment">/* 发送数据包 */</span>
TransmitMailbox <span class="token operator">=</span> <span class="token function">CAN_Transmit</span><span class="token punctuation">(</span><span class="token constant">CAN1</span><span class="token punctuation">,</span> <span class="token operator">&amp;</span>TxMessage<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">/* 等待发送成功 */</span>
<span class="token keyword">while</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token function">CAN_TransmitStatus</span><span class="token punctuation">(</span><span class="token constant">CAN1</span><span class="token punctuation">,</span> TransmitMailbox<span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token constant">CANTXOK</span><span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span> <span class="token operator">--</span>i<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">/* 成功0 超时1 */</span>
<span class="token keyword">return</span> <span class="token punctuation">(</span>i <span class="token operator">!=</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token number">0</span> <span class="token operator">:</span> <span class="token number">1</span><span class="token punctuation">;</span>

}

canfestival_can.h文件如下:

/**
***********************************
* 文件名: CANOpen_can.h
* 作者: stone
* 版本: V0.1
* 日期: 2018-3-29
* 描述: CANOPEN协议底层总线接口
***********************************
*/

#ifndef _canfestival_can_H
#define _canfestival_can_H

/* 功能: can总线配置
参数: 无
返回值:无
*/

void CANOpen_can_config(void);

#endif

canfestival_timer.c文件如下:

#include “canfestival_timer.h”

// 下面函数是用于配制canfestival的唯一硬件定时器TIM14,
// 所以这个函数要在主函数中进行调用,然后传入的形参也是TIM14
void TIMConfig(TIM_TypeDef* TIMx, uint16_t TIM_Period, uint16_t TIM_Prescaler)
{
TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;

<span class="token comment">//TIM_RepetitionCounter(TIM1_RCR)=0,每次向上溢出都产生更新事件</span>
<span class="token function">TIM_DeInit</span><span class="token punctuation">(</span>TIMx<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//初始化 TIM1寄存器</span>
<span class="token comment">/*分频和周期计算公式:
Prescaler = (TIMxCLK / TIMx counter clock) - 1;
Period = (TIMx counter clock / TIM3 output clock) - 1
TIMx counter clock 为你所需要的 TXM 的定时器时钟*/</span>
TIM_BaseInitStructure<span class="token punctuation">.</span>TIM_Period <span class="token operator">=</span> TIM_Period<span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span><span class="token comment">//查数据手册可知,TIM1与 TIM8为16位自动装载</span>
<span class="token comment">/*在 system_stm32f4xx.c 中设置的 APB2 Prescaler = 2 ,可知
*APB1时钟为168M/2*2,因为如果 APB1分频不为1,则定时时钟 x2*/</span>
TIM_BaseInitStructure<span class="token punctuation">.</span>TIM_Prescaler <span class="token operator">=</span> TIM_Prescaler<span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span><span class="token comment">//分频为10K</span>
TIM_BaseInitStructure<span class="token punctuation">.</span>TIM_ClockDivision <span class="token operator">=</span> <span class="token constant">TIM_CKD_DIV1</span><span class="token punctuation">;</span>
TIM_BaseInitStructure<span class="token punctuation">.</span>TIM_CounterMode <span class="token operator">=</span>  TIM_CounterMode_Up<span class="token punctuation">;</span><span class="token comment">//向上计数</span>
TIM_BaseInitStructure<span class="token punctuation">.</span>TIM_RepetitionCounter <span class="token operator">=</span> <span class="token number">0x0</span><span class="token punctuation">;</span>
<span class="token function">TIM_TimeBaseInit</span><span class="token punctuation">(</span>TIMx<span class="token punctuation">,</span> <span class="token operator">&amp;</span>TIM_BaseInitStructure<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">//清中断,以免一启用中断后立即产生中断</span>
<span class="token function">TIM_ClearFlag</span><span class="token punctuation">(</span>TIMx<span class="token punctuation">,</span> TIM_FLAG_Update<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">//使能TIM1中断源</span>
<span class="token function">TIM_ITConfig</span><span class="token punctuation">(</span>TIMx<span class="token punctuation">,</span> TIM_IT_Update<span class="token punctuation">,</span> <span class="token constant">ENABLE</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">//TIM1总开关:开启</span>
<span class="token function">TIM_Cmd</span><span class="token punctuation">(</span>TIMx<span class="token punctuation">,</span> <span class="token constant">ENABLE</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//使能 TIM1定时器</span>

}

void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;

<span class="token function">RCC_APB1PeriphClockCmd</span><span class="token punctuation">(</span>RCC_APB1Periph_TIM14<span class="token punctuation">,</span><span class="token constant">ENABLE</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
NVIC_InitStructure<span class="token punctuation">.</span>NVIC_IRQChannel <span class="token operator">=</span> TIM8_TRG_COM_TIM14_IRQn<span class="token punctuation">;</span>    	    <span class="token comment">//更新事件</span>
NVIC_InitStructure<span class="token punctuation">.</span>NVIC_IRQChannelPreemptionPriority <span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>    <span class="token comment">//抢占优先级0  原始0</span>
NVIC_InitStructure<span class="token punctuation">.</span>NVIC_IRQChannelSubPriority <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>          <span class="token comment">//响应优先级1   原始1</span>
NVIC_InitStructure<span class="token punctuation">.</span>NVIC_IRQChannelCmd <span class="token operator">=</span> <span class="token constant">ENABLE</span><span class="token punctuation">;</span>             <span class="token comment">//允许中断</span>
<span class="token function">NVIC_Init</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>NVIC_InitStructure<span class="token punctuation">)</span><span class="token punctuation">;</span>                             <span class="token comment">//写入设置</span>

}

// canfestival 定时器 timer14定时器
void TIM8_TRG_COM_TIM14_IRQHandler(void)
{
if(TIM_GetITStatus(TIM14,TIM_IT_Update)!=RESET)
{
TIM_ClearITPendingBit(TIM14, TIM_IT_Update); //清中断
TimeDispatch(); // canfestival的库
}
}

void setTimer(TIMEVAL value)
{
TIM14->ARR = TIM14->CNT + value;
}

TIMEVAL getElapsedTime(void)
{
return TIM14->CNT;
}

canfestival_timer.h文件如下:

#ifndef __canfestival_timer_H
#define __canfestival_timer_H
#include “sys.h”
#include “stdlib.h”
#include “stm32f4xx.h”
#include “canfestival.h”

void TIMConfig(TIM_TypeDef* TIMx, uint16_t TIM_Period, uint16_t TIM_Prescaler);
void NVIC_Configuration(void);
void setTimer(TIMEVAL value);
TIMEVAL getElapsedTime(void);

#endif

第八步,

然后进行编译,只有一个错误.

就是"字典"的报错.(关于这一部分,可以先用我下面提供的代码,之后自己生成了字典.c和.h文件后,可以直接进行替换.)

字典是一个配置文档,可以通过配置字典,来实现不同的通信内容.

可以在工程目录下面建立一个canfestival_master文件夹,用于保存字典的.c和.h文件:






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






canfestival_master.c文件内容如下:

/* File generated by gen_cfile.py. Should not be modified. */

#include “canfestival_master.h”

//
/* Declaration of mapped variables */
//
INTEGER32 D0 = 0x0; /* Mapped at index 0x2000, subindex 0x00 /
UNS32 D1 = 0x0; / Mapped at index 0x2001, subindex 0x00 /
UNS32 D2 = 0x0; / Mapped at index 0x2002, subindex 0x00 /
INTEGER16 Current_actual_value = 0x0; / Mapped at index 0x6078, subindex 0x00 /
INTEGER32 Target_velocity = 0x0; / Mapped at index 0x60FF, subindex 0x00 */

#define Transmission_Type 0x25 // 0xff:是event定时器模式

//
/* Declaration of value range types */
//

#define valueRange_EMC 0x9F /* Type for index 0x1003 subindex 0x00 (only set of value 0 is possible) /
UNS32 Master_valueRangeTest (UNS8 typeValue, void value)
{
switch (typeValue) {
case valueRange_EMC:
if ((UNS8)value != (UNS8)0) return OD_VALUE_RANGE_EXCEEDED;
break;
}
return 0;
}

//
/* The node id */
//
/* node_id default value.*/
UNS8 Master_bDeviceNodeId = 0x00;

/**************************************************************************/
/* Array of message processing information */

const UNS8 Master_iam_a_slave = 0;

TIMER_HANDLE Master_heartBeatTimers[1];

/*
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

                           OBJECT DICTIONARY

$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
*/

/* index 0x1000 : Device Type. /
UNS32 Master_obj1000 = 0x0; / 0 /
subindex Master_Index1000[] =
{
{ RO, uint32, sizeof (UNS32), (void)&Master_obj1000, NULL }
};

/* index 0x1001 : Error Register. /
UNS8 Master_obj1001 = 0x0; / 0 /
subindex Master_Index1001[] =
{
{ RO, uint8, sizeof (UNS8), (void)&Master_obj1001, NULL }
};

/* index 0x1003 : Pre-defined Error Field /
UNS8 Master_highestSubIndex_obj1003 = 0; / number of subindex - 1*/
UNS32 Master_obj1003[] =
{
0x0 /* 0 /
};
subindex Master_Index1003[] =
{
{ RW, valueRange_EMC, sizeof (UNS8), (void)&Master_highestSubIndex_obj1003, NULL },
{ RO, uint32, sizeof (UNS32), (void*)&Master_obj1003[0], NULL }
};

/* index 0x1005 : SYNC COB ID. /
UNS32 Master_obj1005 = 0x40000080; / 128 /
subindex Master_Index1005[] =
{
{ RW, uint32, sizeof (UNS32), (void)&Master_obj1005, NULL }
};

/* index 0x1006 : Communication / Cycle Period. /
UNS32 Master_obj1006 = 200; / 1000000 /
subindex Master_Index1006[] =
{
{ RW, uint32, sizeof (UNS32), (void)&Master_obj1006, NULL }
};

/* index 0x1007 : Synchronous Window Length. /
UNS32 Master_obj1007 = 200; / 1000000 /
subindex Master_Index1007[] =
{
{ RW, uint32, sizeof (UNS32), (void)&Master_obj1007, NULL }
};

/* index 0x100C : Guard Time /
UNS16 Master_obj100C = 0x0; / 0 */

/* index 0x100D : Life Time Factor /
UNS8 Master_obj100D = 0x0; / 0 */

/* index 0x1014 : Emergency COB ID. /
UNS32 Master_obj1014 = 0x80; / 128 /
subindex Master_Index1014[] =
{
{ RW, uint32, sizeof (UNS32), (void)&Master_obj1014, NULL }
};

/* index 0x1016 : Consumer Heartbeat Time */
UNS8 Master_highestSubIndex_obj1016 = 0;
UNS32 Master_obj1016[]={0};

/* index 0x1017 : Producer Heartbeat Time /
UNS16 Master_obj1017 = 0x0; / 0 */

/* index 0x1018 : Identity. /
UNS8 Master_highestSubIndex_obj1018 = 4; / number of subindex - 1*/
UNS32 Master_obj1018_Vendor_ID = 0x0; /* 0 /
UNS32 Master_obj1018_Product_Code = 0x0; / 0 /
UNS32 Master_obj1018_Revision_Number = 0x0; / 0 /
UNS32 Master_obj1018_Serial_Number = 0x0; / 0 /
subindex Master_Index1018[] =
{
{ RO, uint8, sizeof (UNS8), (void)&Master_highestSubIndex_obj1018, NULL },
{ RO, uint32, sizeof (UNS32), (void)&Master_obj1018_Vendor_ID, NULL },
{ RO, uint32, sizeof (UNS32), (void)&Master_obj1018_Product_Code, NULL },
{ RO, uint32, sizeof (UNS32), (void)&Master_obj1018_Revision_Number, NULL },
{ RO, uint32, sizeof (UNS32), (void)&Master_obj1018_Serial_Number, NULL }
};

/* index 0x1019 : Synchronous counter overflow value. /
UNS8 Master_obj1019 = 0x4; / 4 /
subindex Master_Index1019[] =
{
{ RW, uint8, sizeof (UNS8), (void)&Master_obj1019, NULL }
};

/* index 0x1280 : Client SDO 1 Parameter. /
UNS8 Master_highestSubIndex_obj1280 = 3; / number of subindex - 1*/
UNS32 Master_obj1280_COB_ID_Client_to_Server_Transmit_SDO = 0x601; /* 1537 /
UNS32 Master_obj1280_COB_ID_Server_to_Client_Receive_SDO = 0x581; / 1409 /
UNS8 Master_obj1280_Node_ID_of_the_SDO_Server = 0x1; / 1 /
subindex Master_Index1280[] =
{
{ RO, uint8, sizeof (UNS8), (void)&Master_highestSubIndex_obj1280, NULL },
{ RW, uint32, sizeof (UNS32), (void)&Master_obj1280_COB_ID_Client_to_Server_Transmit_SDO, NULL },
{ RW, uint32, sizeof (UNS32), (void)&Master_obj1280_COB_ID_Server_to_Client_Receive_SDO, NULL },
{ RW, uint8, sizeof (UNS8), (void*)&Master_obj1280_Node_ID_of_the_SDO_Server, NULL }
};

/* index 0x1281 : Client SDO 2 Parameter. /
UNS8 Master_highestSubIndex_obj1281 = 3; / number of subindex - 1*/
UNS32 Master_obj1281_COB_ID_Client_to_Server_Transmit_SDO = 0x602; /* 1538 /
UNS32 Master_obj1281_COB_ID_Server_to_Client_Receive_SDO = 0x582; / 1410 /
UNS8 Master_obj1281_Node_ID_of_the_SDO_Server = 0x2; / 2 /
subindex Master_Index1281[] =
{
{ RO, uint8, sizeof (UNS8), (void)&Master_highestSubIndex_obj1281, NULL },
{ RW, uint32, sizeof (UNS32), (void)&Master_obj1281_COB_ID_Client_to_Server_Transmit_SDO, NULL },
{ RW, uint32, sizeof (UNS32), (void)&Master_obj1281_COB_ID_Server_to_Client_Receive_SDO, NULL },
{ RW, uint8, sizeof (UNS8), (void*)&Master_obj1281_Node_ID_of_the_SDO_Server, NULL }
};

/* index 0x1282 : Client SDO 3 Parameter. /
UNS8 Master_highestSubIndex_obj1282 = 3; / number of subindex - 1*/
UNS32 Master_obj1282_COB_ID_Client_to_Server_Transmit_SDO = 0x603; /* 1539 /
UNS32 Master_obj1282_COB_ID_Server_to_Client_Receive_SDO = 0x583; / 1411 /
UNS8 Master_obj1282_Node_ID_of_the_SDO_Server = 0x3; / 3 /
subindex Master_Index1282[] =
{
{ RO, uint8, sizeof (UNS8), (void)&Master_highestSubIndex_obj1282, NULL },
{ RW, uint32, sizeof (UNS32), (void)&Master_obj1282_COB_ID_Client_to_Server_Transmit_SDO, NULL },
{ RW, uint32, sizeof (UNS32), (void)&Master_obj1282_COB_ID_Server_to_Client_Receive_SDO, NULL },
{ RW, uint8, sizeof (UNS8), (void*)&Master_obj1282_Node_ID_of_the_SDO_Server, NULL }
};

/* index 0x1283 : Client SDO 4 Parameter. /
UNS8 Master_highestSubIndex_obj1283 = 3; / number of subindex - 1*/
UNS32 Master_obj1283_COB_ID_Client_to_Server_Transmit_SDO = 0x604; /* 1540 /
UNS32 Master_obj1283_COB_ID_Server_to_Client_Receive_SDO = 0x584; / 1412 /
UNS8 Master_obj1283_Node_ID_of_the_SDO_Server = 0x4; / 4 /
subindex Master_Index1283[] =
{
{ RO, uint8, sizeof (UNS8), (void)&Master_highestSubIndex_obj1283, NULL },
{ RW, uint32, sizeof (UNS32), (void)&Master_obj1283_COB_ID_Client_to_Server_Transmit_SDO, NULL },
{ RW, uint32, sizeof (UNS32), (void)&Master_obj1283_COB_ID_Server_to_Client_Receive_SDO, NULL },
{ RW, uint8, sizeof (UNS8), (void*)&Master_obj1283_Node_ID_of_the_SDO_Server, NULL }
};

/* index 0x1284 : Client SDO 5 Parameter. /
UNS8 Master_highestSubIndex_obj1284 = 3; / number of subindex - 1*/
UNS32 Master_obj1284_COB_ID_Client_to_Server_Transmit_SDO = 0x605; /* 1541 /
UNS32 Master_obj1284_COB_ID_Server_to_Client_Receive_SDO = 0x585; / 1413 /
UNS8 Master_obj1284_Node_ID_of_the_SDO_Server = 0x5; / 5 /
subindex Master_Index1284[] =
{
{ RO, uint8, sizeof (UNS8), (void)&Master_highestSubIndex_obj1284, NULL },
{ RW, uint32, sizeof (UNS32), (void)&Master_obj1284_COB_ID_Client_to_Server_Transmit_SDO, NULL },
{ RW, uint32, sizeof (UNS32), (void)&Master_obj1284_COB_ID_Server_to_Client_Receive_SDO, NULL },
{ RW, uint8, sizeof (UNS8), (void*)&Master_obj1284_Node_ID_of_the_SDO_Server, NULL }
};

/* index 0x1285 : Client SDO 6 Parameter. /
UNS8 Master_highestSubIndex_obj1285 = 3; / number of subindex - 1*/
UNS32 Master_obj1285_COB_ID_Client_to_Server_Transmit_SDO = 0x606; /* 1542 /
UNS32 Master_obj1285_COB_ID_Server_to_Client_Receive_SDO = 0x586; / 1414 /
UNS8 Master_obj1285_Node_ID_of_the_SDO_Server = 0x6; / 6 /
subindex Master_Index1285[] =
{
{ RO, uint8, sizeof (UNS8), (void)&Master_highestSubIndex_obj1285, NULL },
{ RW, uint32, sizeof (UNS32), (void)&Master_obj1285_COB_ID_Client_to_Server_Transmit_SDO, NULL },
{ RW, uint32, sizeof (UNS32), (void)&Master_obj1285_COB_ID_Server_to_Client_Receive_SDO, NULL },
{ RW, uint8, sizeof (UNS8), (void*)&Master_obj1285_Node_ID_of_the_SDO_Server, NULL }
};

/* index 0x1400 : Receive PDO 1 Parameter. /
UNS8 Master_highestSubIndex_obj1400 = 6; / number of subindex - 1*/
UNS32 Master_obj1400_COB_ID_used_by_PDO = 0x200; /* 512 /
UNS8 Master_obj1400_Transmission_Type = 0x00; / 0 /
UNS16 Master_obj1400_Inhibit_Time = 0x0; / 0 /
UNS8 Master_obj1400_Compatibility_Entry = 0x0; / 0 /
UNS16 Master_obj1400_Event_Timer = 0x0; / 0 /
UNS8 Master_obj1400_SYNC_start_value = 0x0; / 0 /
subindex Master_Index1400[] =
{
{ RO, uint8, sizeof (UNS8), (void)&Master_highestSubIndex_obj1400, NULL },
{ RW, uint32, sizeof (UNS32), (void)&Master_obj1400_COB_ID_used_by_PDO, NULL },
{ RW, uint8, sizeof (UNS8), (void)&Master_obj1400_Transmission_Type, NULL },
{ RW, uint16, sizeof (UNS16), (void)&Master_obj1400_Inhibit_Time, NULL },
{ RW, uint8, sizeof (UNS8), (void)&Master_obj1400_Compatibility_Entry, NULL },
{ RW, uint16, sizeof (UNS16), (void)&Master_obj1400_Event_Timer, NULL },
{ RW, uint8, sizeof (UNS8), (void)&Master_obj1400_SYNC_start_value, NULL }
};

/* index 0x1401 : Receive PDO 2 Parameter. /
UNS8 Master_highestSubIndex_obj1401 = 6; / number of subindex - 1*/
UNS32 Master_obj1401_COB_ID_used_by_PDO = 0x300; /* 768 /
UNS8 Master_obj1401_Transmission_Type = 0x00; / 0 /
UNS16 Master_obj1401_Inhibit_Time = 0x0; / 0 /
UNS8 Master_obj1401_Compatibility_Entry = 0x0; / 0 /
UNS16 Master_obj1401_Event_Timer = 0x0; / 0 /
UNS8 Master_obj1401_SYNC_start_value = 0x0; / 0 /
subindex Master_Index1401[] =
{
{ RO, uint8, sizeof (UNS8), (void)&Master_highestSubIndex_obj1401, NULL },
{ RW, uint32, sizeof (UNS32), (void)&Master_obj1401_COB_ID_used_by_PDO, NULL },
{ RW, uint8, sizeof (UNS8), (void)&Master_obj1401_Transmission_Type, NULL },
{ RW, uint16, sizeof (UNS16), (void)&Master_obj1401_Inhibit_Time, NULL },
{ RW, uint8, sizeof (UNS8), (void)&Master_obj1401_Compatibility_Entry, NULL },
{ RW, uint16, sizeof (UNS16), (void)&Master_obj1401_Event_Timer, NULL },
{ RW, uint8, sizeof (UNS8), (void)&Master_obj1401_SYNC_start_value, NULL }
};

/* index 0x1402 : Receive PDO 3 Parameter. /
UNS8 Master_highestSubIndex_obj1402 = 6; / number of subindex - 1*/
UNS32 Master_obj1402_COB_ID_used_by_PDO = 0x400; /* 1024 /
UNS8 Master_obj1402_Transmission_Type = 0x00; / 0 /
UNS16 Master_obj1402_Inhibit_Time = 0x0; / 0 /
UNS8 Master_obj1402_Compatibility_Entry = 0x0; / 0 /
UNS16 Master_obj1402_Event_Timer = 0x0; / 0 /
UNS8 Master_obj1402_SYNC_start_value = 0x0; / 0 /
subindex Master_Index1402[] =
{
{ RO, uint8, sizeof (UNS8), (void)&Master_highestSubIndex_obj1402, NULL },
{ RW, uint32, sizeof (UNS32), (void)&Master_obj1402_COB_ID_used_by_PDO, NULL },
{ RW, uint8, sizeof (UNS8), (void)&Master_obj1402_Transmission_Type, NULL },
{ RW, uint16, sizeof (UNS16), (void)&Master_obj1402_Inhibit_Time, NULL },
{ RW, uint8, sizeof (UNS8), (void)&Master_obj1402_Compatibility_Entry, NULL },
{ RW, uint16, sizeof (UNS16), (void)&Master_obj1402_Event_Timer, NULL },
{ RW, uint8, sizeof (UNS8), (void)&Master_obj1402_SYNC_start_value, NULL }
};

/* index 0x1403 : Receive PDO 4 Parameter. /
UNS8 Master_highestSubIndex_obj1403 = 6; / number of subindex - 1*/
UNS32 Master_obj1403_COB_ID_used_by_PDO = 0x481; /* 1153 /
UNS8 Master_obj1403_Transmission_Type = 0x00; / 0 /
UNS16 Master_obj1403_Inhibit_Time = 0x0; / 0 /
UNS8 Master_obj1403_Compatibility_Entry = 0x0; / 0 /
UNS16 Master_obj1403_Event_Timer = 0x0; / 0 /
UNS8 Master_obj1403_SYNC_start_value = 0x0; / 0 /
subindex Master_Index1403[] =
{
{ RO, uint8, sizeof (UNS8), (void)&Master_highestSubIndex_obj1403, NULL },
{ RW, uint32, sizeof (UNS32), (void)&Master_obj1403_COB_ID_used_by_PDO, NULL },
{ RW, uint8, sizeof (UNS8), (void)&Master_obj1403_Transmission_Type, NULL },
{ RW, uint16, sizeof (UNS16), (void)&Master_obj1403_Inhibit_Time, NULL },
{ RW, uint8, sizeof (UNS8), (void)&Master_obj1403_Compatibility_Entry, NULL },
{ RW, uint16, sizeof (UNS16), (void)&Master_obj1403_Event_Timer, NULL },
{ RW, uint8, sizeof (UNS8), (void)&Master_obj1403_SYNC_start_value, NULL }
};

/* index 0x1600 : Receive PDO 1 Mapping. /
UNS8 Master_highestSubIndex_obj1600 = 1; / number of subindex - 1*/
UNS32 Master_obj1600[] =
{
0x20000020 /* 536870944 /
};
subindex Master_Index1600[] =
{
{ RW, uint8, sizeof (UNS8), (void)&Master_highestSubIndex_obj1600, NULL },
{ RW, uint32, sizeof (UNS32), (void*)&Master_obj1600[0], NULL }
};

/* index 0x1601 : Receive PDO 2 Mapping. /
UNS8 Master_highestSubIndex_obj1601 = 1; / number of subindex - 1*/
UNS32 Master_obj1601[] =
{
0x20010020 /* 536936480 /
};
subindex Master_Index1601[] =
{
{ RW, uint8, sizeof (UNS8), (void)&Master_highestSubIndex_obj1601, NULL },
{ RW, uint32, sizeof (UNS32), (void*)&Master_obj1601[0], NULL }
};

/* index 0x1602 : Receive PDO 3 Mapping. /
UNS8 Master_highestSubIndex_obj1602 = 1; / number of subindex - 1*/
UNS32 Master_obj1602[] =
{
0x20020020 /* 537002016 /
};
subindex Master_Index1602[] =
{
{ RW, uint8, sizeof (UNS8), (void)&Master_highestSubIndex_obj1602, NULL },
{ RW, uint32, sizeof (UNS32), (void*)&Master_obj1602[0], NULL }
};

/* index 0x1603 : Receive PDO 4 Mapping. /
UNS8 Master_highestSubIndex_obj1603 = 1; / number of subindex - 1*/
UNS32 Master_obj1603[] =
{
0x60780010 /* 1618477072 /
};
subindex Master_Index1603[] =
{
{ RW, uint8, sizeof (UNS8), (void)&Master_highestSubIndex_obj1603, NULL },
{ RW, uint32, sizeof (UNS32), (void*)&Master_obj1603[0], NULL }
};

/* index 0x1800 : Transmit PDO 1 Parameter. /
UNS8 Master_highestSubIndex_obj1800 = 6; / number of subindex - 1*/
UNS32 Master_obj1800_COB_ID_used_by_PDO =0x201; //0x80000201; /* 513 /
UNS8 Master_obj1800_Transmission_Type = Transmission_Type; / 255 /
UNS16 Master_obj1800_Inhibit_Time = 0; / 0 /
UNS8 Master_obj1800_Compatibility_Entry = 0x0; / 0 /
UNS16 Master_obj1800_Event_Timer = 0; / 5 /
UNS8 Master_obj1800_SYNC_start_value = 0x11; / 0 /
subindex Master_Index1800[] =
{
{ RO, uint8, sizeof (UNS8), (void)&Master_highestSubIndex_obj1800, NULL },
{ RW, uint32, sizeof (UNS32), (void)&Master_obj1800_COB_ID_used_by_PDO, NULL },
{ RW, uint8, sizeof (UNS8), (void)&Master_obj1800_Transmission_Type, NULL },
{ RW, uint16, sizeof (UNS16), (void)&Master_obj1800_Inhibit_Time, NULL },
{ RW, uint8, sizeof (UNS8), (void)&Master_obj1800_Compatibility_Entry, NULL },
{ RW, uint16, sizeof (UNS16), (void)&Master_obj1800_Event_Timer, NULL },
{ RW, uint8, sizeof (UNS8), (void)&Master_obj1800_SYNC_start_value, NULL }
};

/* index 0x1801 : Transmit PDO 2 Parameter. /
UNS8 Master_highestSubIndex_obj1801 = 6; / number of subindex - 1*/
UNS32 Master_obj1801_COB_ID_used_by_PDO = 0x202;//0x80000202; /* 514 /
UNS8 Master_obj1801_Transmission_Type = Transmission_Type; / 255 /
UNS16 Master_obj1801_Inhibit_Time = 0; / 0 /
UNS8 Master_obj1801_Compatibility_Entry = 0x0; / 0 /
UNS16 Master_obj1801_Event_Timer = 0; / 11 /
UNS8 Master_obj1801_SYNC_start_value = 0x12; / 0 /
subindex Master_Index1801[] =
{
{ RO, uint8, sizeof (UNS8), (void)&Master_highestSubIndex_obj1801, NULL },
{ RW, uint32, sizeof (UNS32), (void)&Master_obj1801_COB_ID_used_by_PDO, NULL },
{ RW, uint8, sizeof (UNS8), (void)&Master_obj1801_Transmission_Type, NULL },
{ RW, uint16, sizeof (UNS16), (void)&Master_obj1801_Inhibit_Time, NULL },
{ RW, uint8, sizeof (UNS8), (void)&Master_obj1801_Compatibility_Entry, NULL },
{ RW, uint16, sizeof (UNS16), (void)&Master_obj1801_Event_Timer, NULL },
{ RW, uint8, sizeof (UNS8), (void)&Master_obj1801_SYNC_start_value, NULL }
};

/* index 0x1802 : Transmit PDO 3 Parameter. /
UNS8 Master_highestSubIndex_obj1802 = 6; / number of subindex - 1*/
UNS32 Master_obj1802_COB_ID_used_by_PDO = 0x0000203; /* 515 /
UNS8 Master_obj1802_Transmission_Type = Transmission_Type; / 255 /
UNS16 Master_obj1802_Inhibit_Time = 0; / 1 /
UNS8 Master_obj1802_Compatibility_Entry = 0x0; / 0 /
UNS16 Master_obj1802_Event_Timer = 0; / 5 /
UNS8 Master_obj1802_SYNC_start_value = 0x13; / 0 /
subindex Master_Index1802[] =
{
{ RO, uint8, sizeof (UNS8), (void)&Master_highestSubIndex_obj1802, NULL },
{ RW, uint32, sizeof (UNS32), (void)&Master_obj1802_COB_ID_used_by_PDO, NULL },
{ RW, uint8, sizeof (UNS8), (void)&Master_obj1802_Transmission_Type, NULL },
{ RW, uint16, sizeof (UNS16), (void)&Master_obj1802_Inhibit_Time, NULL },
{ RW, uint8, sizeof (UNS8), (void)&Master_obj1802_Compatibility_Entry, NULL },
{ RW, uint16, sizeof (UNS16), (void)&Master_obj1802_Event_Timer, NULL },
{ RW, uint8, sizeof (UNS8), (void)&Master_obj1802_SYNC_start_value, NULL }
};

/* index 0x1803 : Transmit PDO 4 Parameter. /
UNS8 Master_highestSubIndex_obj1803 = 6; / number of subindex - 1*/
UNS32 Master_obj1803_COB_ID_used_by_PDO = 0x00000204; /* 516 /
UNS8 Master_obj1803_Transmission_Type = Transmission_Type; / 255 /
UNS16 Master_obj1803_Inhibit_Time = 0; / 1 /
UNS8 Master_obj1803_Compatibility_Entry = 0x0; / 0 /
UNS16 Master_obj1803_Event_Timer = 0; / 5 /
UNS8 Master_obj1803_SYNC_start_value = 0x14; / 0 /
subindex Master_Index1803[] =
{
{ RO, uint8, sizeof (UNS8), (void)&Master_highestSubIndex_obj1803, NULL },
{ RW, uint32, sizeof (UNS32), (void)&Master_obj1803_COB_ID_used_by_PDO, NULL },
{ RW, uint8, sizeof (UNS8), (void)&Master_obj1803_Transmission_Type, NULL },
{ RW, uint16, sizeof (UNS16), (void)&Master_obj1803_Inhibit_Time, NULL },
{ RW, uint8, sizeof (UNS8), (void)&Master_obj1803_Compatibility_Entry, NULL },
{ RW, uint16, sizeof (UNS16), (void)&Master_obj1803_Event_Timer, NULL },
{ RW, uint8, sizeof (UNS8), (void)&Master_obj1803_SYNC_start_value, NULL }
};

/* index 0x1804 : Transmit PDO 5 Parameter. /
UNS8 Master_highestSubIndex_obj1804 = 6; / number of subindex - 1*/
UNS32 Master_obj1804_COB_ID_used_by_PDO = 0x00000205; /* 517 /
UNS8 Master_obj1804_Transmission_Type = Transmission_Type; / 255 /
UNS16 Master_obj1804_Inhibit_Time = 0; / 1 /
UNS8 Master_obj1804_Compatibility_Entry = 0x0; / 0 /
UNS16 Master_obj1804_Event_Timer = 0; / 5 /
UNS8 Master_obj1804_SYNC_start_value = 0x15; / 0 /
subindex Master_Index1804[] =
{
{ RO, uint8, sizeof (UNS8), (void)&Master_highestSubIndex_obj1804, NULL },
{ RW, uint32, sizeof (UNS32), (void)&Master_obj1804_COB_ID_used_by_PDO, NULL },
{ RW, uint8, sizeof (UNS8), (void)&Master_obj1804_Transmission_Type, NULL },
{ RW, uint16, sizeof (UNS16), (void)&Master_obj1804_Inhibit_Time, NULL },
{ RW, uint8, sizeof (UNS8), (void)&Master_obj1804_Compatibility_Entry, NULL },
{ RW, uint16, sizeof (UNS16), (void)&Master_obj1804_Event_Timer, NULL },
{ RW, uint8, sizeof (UNS8), (void)&Master_obj1804_SYNC_start_value, NULL }
};

/* index 0x1805 : Transmit PDO 6 Parameter. /
UNS8 Master_highestSubIndex_obj1805 = 6; / number of subindex - 1*/
UNS32 Master_obj1805_COB_ID_used_by_PDO = 0x00000206; /* 518 /
UNS8 Master_obj1805_Transmission_Type = Transmission_Type; / 255 /
UNS16 Master_obj1805_Inhibit_Time = 0; / 1 /
UNS8 Master_obj1805_Compatibility_Entry = 0x0; / 0 /
UNS16 Master_obj1805_Event_Timer = 0; / 5 /
UNS8 Master_obj1805_SYNC_start_value = 0x16; / 0 /
subindex Master_Index1805[] =
{
{ RO, uint8, sizeof (UNS8), (void)&Master_highestSubIndex_obj1805, NULL },
{ RW, uint32, sizeof (UNS32), (void)&Master_obj1805_COB_ID_used_by_PDO, NULL },
{ RW, uint8, sizeof (UNS8), (void)&Master_obj1805_Transmission_Type, NULL },
{ RW, uint16, sizeof (UNS16), (void)&Master_obj1805_Inhibit_Time, NULL },
{ RW, uint8, sizeof (UNS8), (void)&Master_obj1805_Compatibility_Entry, NULL },
{ RW, uint16, sizeof (UNS16), (void)&Master_obj1805_Event_Timer, NULL },
{ RW, uint8, sizeof (UNS8), (void)&Master_obj1805_SYNC_start_value, NULL }
};

/* index 0x1A00 : Transmit PDO 1 Mapping. /
UNS8 Master_highestSubIndex_obj1A00 = 1; / number of subindex - 1*/
UNS32 Master_obj1A00[] =
{
0x60FF0020 /* 1627324448 /
};
subindex Master_Index1A00[] =
{
{ RW, uint8, sizeof (UNS8), (void)&Master_highestSubIndex_obj1A00, NULL },
{ RW, uint32, sizeof (UNS32), (void*)&Master_obj1A00[0], NULL }
};

/* index 0x1A01 : Transmit PDO 2 Mapping. /
UNS8 Master_highestSubIndex_obj1A01 = 1; / number of subindex - 1*/
UNS32 Master_obj1A01[] =
{
0x60FF0020 /* 1627324448 /
};
subindex Master_Index1A01[] =
{
{ RW, uint8, sizeof (UNS8), (void)&Master_highestSubIndex_obj1A01, NULL },
{ RW, uint32, sizeof (UNS32), (void*)&Master_obj1A01[0], NULL }
};

/* index 0x1A02 : Transmit PDO 3 Mapping. /
UNS8 Master_highestSubIndex_obj1A02 = 1; / number of subindex - 1*/
UNS32 Master_obj1A02[] =
{
0x60FF0020 /* 1627324448 /
};
subindex Master_Index1A02[] =
{
{ RW, uint8, sizeof (UNS8), (void)&Master_highestSubIndex_obj1A02, NULL },
{ RW, uint32, sizeof (UNS32), (void*)&Master_obj1A02[0], NULL }
};

/* index 0x1A03 : Transmit PDO 4 Mapping. /
UNS8 Master_highestSubIndex_obj1A03 = 1; / number of subindex - 1*/
UNS32 Master_obj1A03[] =
{
0x60FF0020 /* 1627324448 /
};
subindex Master_Index1A03[] =
{
{ RW, uint8, sizeof (UNS8), (void)&Master_highestSubIndex_obj1A03, NULL },
{ RW, uint32, sizeof (UNS32), (void*)&Master_obj1A03[0], NULL }
};

/* index 0x1A04 : Transmit PDO 5 Mapping. /
UNS8 Master_highestSubIndex_obj1A04 = 1; / number of subindex - 1*/
UNS32 Master_obj1A04[] =
{
0x60FF0020 /* 1627324448 /
};
subindex Master_Index1A04[] =
{
{ RW, uint8, sizeof (UNS8), (void)&Master_highestSubIndex_obj1A04, NULL },
{ RW, uint32, sizeof (UNS32), (void*)&Master_obj1A04[0], NULL }
};

/* index 0x1A05 : Transmit PDO 6 Mapping. /
UNS8 Master_highestSubIndex_obj1A05 = 1; / number of subindex - 1*/
UNS32 Master_obj1A05[] =
{
0x60FF0020 /* 1627324448 /
};
subindex Master_Index1A05[] =
{
{ RW, uint8, sizeof (UNS8), (void)&Master_highestSubIndex_obj1A05, NULL },
{ RW, uint32, sizeof (UNS32), (void*)&Master_obj1A05[0], NULL }
};

/* index 0x2000 : Mapped variable D0 /
subindex Master_Index2000[] =
{
{ RW, int32, sizeof (INTEGER32), (void)&D0, NULL }
};

/* index 0x2001 : Mapped variable D1 /
subindex Master_Index2001[] =
{
{ RW, uint32, sizeof (UNS32), (void)&D1, NULL }
};

/* index 0x2002 : Mapped variable D2 /
subindex Master_Index2002[] =
{
{ RW, uint32, sizeof (UNS32), (void)&D2, NULL }
};

/* index 0x6078 : Mapped variable Current actual value /
subindex Master_Index6078[] =
{
{ RO, int16, sizeof (INTEGER16), (void)&Current_actual_value, NULL }
};

/* index 0x60FF : Mapped variable Target velocity /
subindex Master_Index60FF[] =
{
{ RW, int32, sizeof (INTEGER32), (void)&Target_velocity, NULL }
};

//
/* Declaration of pointed variables */
//

const indextable Master_objdict[] =
{
{ (subindex)Master_Index1000,sizeof(Master_Index1000)/sizeof(Master_Index1000[0]), 0x1000},
{ (subindex)Master_Index1001,sizeof(Master_Index1001)/sizeof(Master_Index1001[0]), 0x1001},
{ (subindex)Master_Index1005,sizeof(Master_Index1005)/sizeof(Master_Index1005[0]), 0x1005},
{ (subindex)Master_Index1006,sizeof(Master_Index1006)/sizeof(Master_Index1006[0]), 0x1006},
{ (subindex)Master_Index1007,sizeof(Master_Index1007)/sizeof(Master_Index1007[0]), 0x1007},
{ (subindex)Master_Index1014,sizeof(Master_Index1014)/sizeof(Master_Index1014[0]), 0x1014},
{ (subindex)Master_Index1018,sizeof(Master_Index1018)/sizeof(Master_Index1018[0]), 0x1018},
{ (subindex)Master_Index1019,sizeof(Master_Index1019)/sizeof(Master_Index1019[0]), 0x1019},
{ (subindex)Master_Index1280,sizeof(Master_Index1280)/sizeof(Master_Index1280[0]), 0x1280},
{ (subindex)Master_Index1281,sizeof(Master_Index1281)/sizeof(Master_Index1281[0]), 0x1281},
{ (subindex)Master_Index1282,sizeof(Master_Index1282)/sizeof(Master_Index1282[0]), 0x1282},
{ (subindex)Master_Index1283,sizeof(Master_Index1283)/sizeof(Master_Index1283[0]), 0x1283},
{ (subindex)Master_Index1284,sizeof(Master_Index1284)/sizeof(Master_Index1284[0]), 0x1284},
{ (subindex)Master_Index1285,sizeof(Master_Index1285)/sizeof(Master_Index1285[0]), 0x1285},
{ (subindex)Master_Index1400,sizeof(Master_Index1400)/sizeof(Master_Index1400[0]), 0x1400},
{ (subindex)Master_Index1401,sizeof(Master_Index1401)/sizeof(Master_Index1401[0]), 0x1401},
{ (subindex)Master_Index1402,sizeof(Master_Index1402)/sizeof(Master_Index1402[0]), 0x1402},
{ (subindex)Master_Index1403,sizeof(Master_Index1403)/sizeof(Master_Index1403[0]), 0x1403},
{ (subindex)Master_Index1600,sizeof(Master_Index1600)/sizeof(Master_Index1600[0]), 0x1600},
{ (subindex)Master_Index1601,sizeof(Master_Index1601)/sizeof(Master_Index1601[0]), 0x1601},
{ (subindex)Master_Index1602,sizeof(Master_Index1602)/sizeof(Master_Index1602[0]), 0x1602},
{ (subindex)Master_Index1603,sizeof(Master_Index1603)/sizeof(Master_Index1603[0]), 0x1603},
{ (subindex)Master_Index1800,sizeof(Master_Index1800)/sizeof(Master_Index1800[0]), 0x1800},
{ (subindex)Master_Index1801,sizeof(Master_Index1801)/sizeof(Master_Index1801[0]), 0x1801},
{ (subindex)Master_Index1802,sizeof(Master_Index1802)/sizeof(Master_Index1802[0]), 0x1802},
{ (subindex)Master_Index1803,sizeof(Master_Index1803)/sizeof(Master_Index1803[0]), 0x1803},
{ (subindex)Master_Index1804,sizeof(Master_Index1804)/sizeof(Master_Index1804[0]), 0x1804},
{ (subindex)Master_Index1805,sizeof(Master_Index1805)/sizeof(Master_Index1805[0]), 0x1805},
{ (subindex)Master_Index1A00,sizeof(Master_Index1A00)/sizeof(Master_Index1A00[0]), 0x1A00},
{ (subindex)Master_Index1A01,sizeof(Master_Index1A01)/sizeof(Master_Index1A01[0]), 0x1A01},
{ (subindex)Master_Index1A02,sizeof(Master_Index1A02)/sizeof(Master_Index1A02[0]), 0x1A02},
{ (subindex)Master_Index1A03,sizeof(Master_Index1A03)/sizeof(Master_Index1A03[0]), 0x1A03},
{ (subindex)Master_Index1A04,sizeof(Master_Index1A04)/sizeof(Master_Index1A04[0]), 0x1A04},
{ (subindex)Master_Index1A05,sizeof(Master_Index1A05)/sizeof(Master_Index1A05[0]), 0x1A05},
{ (subindex)Master_Index2000,sizeof(Master_Index2000)/sizeof(Master_Index2000[0]), 0x2000},
{ (subindex)Master_Index2001,sizeof(Master_Index2001)/sizeof(Master_Index2001[0]), 0x2001},
{ (subindex)Master_Index2002,sizeof(Master_Index2002)/sizeof(Master_Index2002[0]), 0x2002},
{ (subindex)Master_Index6078,sizeof(Master_Index6078)/sizeof(Master_Index6078[0]), 0x6078},
{ (subindex*)Master_Index60FF,sizeof(Master_Index60FF)/sizeof(Master_Index60FF[0]), 0x60FF},
};

const indextable Master_scanIndexOD (CO_Data d, UNS16 wIndex, UNS32 * errorCode)
{
(void)d;
int i;
switch(</s

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值