步骤一:
首先准备一个工程
确保这个工程是可以用的,比如用正点原子的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"
extern CO_Data masterObjdict_Data;
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">&</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">&</span>NVIC_InitStructure<span class="token punctuation">)</span><span class="token punctuation">;</span>
}
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">&</span>CAN_FilterInitStructure<span class="token punctuation">)</span><span class="token punctuation">;</span>
}
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">&</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">&</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>
}
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">&</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">&</span>masterObjdict_Data<span class="token punctuation">,</span> <span class="token operator">&</span>Rx_Message<span class="token punctuation">)</span><span class="token punctuation">;</span>
}
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">></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">></span>data<span class="token punctuation">,</span> message<span class="token operator">-</span><span class="token operator">></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">></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">></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">&</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">&&</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文件如下:
#ifndef _canfestival_can_H
#define _canfestival_can_H
void CANOpen_can_config ( void ) ;
#endif
canfestival_timer.c文件如下:
#include “canfestival_timer.h”
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">&</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">&</span>NVIC_InitStructure<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//写入设置</span>
}
void TIM8_TRG_COM_TIM14_IRQHandler ( void ) { if ( TIM_GetITStatus ( TIM14 , TIM_IT_Update) != RESET ) { TIM_ClearITPendingBit ( TIM14 , TIM_IT_Update) ; TimeDispatch ( ) ; } }
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文件内容如下:
#include “canfestival_master.h”
INTEGER32 D0 = 0x0 ; UNS32 D1 = 0x0 ; UNS32 D2 = 0x0 ; INTEGER16 Current_actual_value = 0x0 ; INTEGER32 Target_velocity = 0x0 ;
#define Transmission_Type 0x25
#define valueRange_EMC 0x9F 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 ; }
UNS8 Master_bDeviceNodeId = 0x00 ;
const UNS8 Master_iam_a_slave = 0 ;
TIMER_HANDLE Master_heartBeatTimers[ 1 ] ;
OBJECT DICTIONARY
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ */
UNS32 Master_obj1000 = 0x0 ; subindex Master_Index1000[ ] = { { RO , uint32, sizeof ( UNS32 ) , ( void ) & Master_obj1000, NULL } } ;
UNS8 Master_obj1001 = 0x0 ; subindex Master_Index1001[ ] = { { RO , uint8, sizeof ( UNS8 ) , ( void ) & Master_obj1001, NULL } } ;
UNS8 Master_highestSubIndex_obj1003 = 0 ; UNS32 Master_obj1003[ ] = { 0x0 } ; subindex Master_Index1003[ ] = { { RW , valueRange_EMC, sizeof ( UNS8 ) , ( void ) & Master_highestSubIndex_obj1003, NULL } , { RO , uint32, sizeof ( UNS32 ) , ( void * ) & Master_obj1003[ 0 ] , NULL } } ;
UNS32 Master_obj1005 = 0x40000080 ; subindex Master_Index1005[ ] = { { RW , uint32, sizeof ( UNS32 ) , ( void ) & Master_obj1005, NULL } } ;
UNS32 Master_obj1006 = 200 ; subindex Master_Index1006[ ] = { { RW , uint32, sizeof ( UNS32 ) , ( void ) & Master_obj1006, NULL } } ;
UNS32 Master_obj1007 = 200 ; subindex Master_Index1007[ ] = { { RW , uint32, sizeof ( UNS32 ) , ( void ) & Master_obj1007, NULL } } ;
UNS16 Master_obj100C = 0x0 ;
UNS8 Master_obj100D = 0x0 ;
UNS32 Master_obj1014 = 0x80 ; subindex Master_Index1014[ ] = { { RW , uint32, sizeof ( UNS32 ) , ( void ) & Master_obj1014, NULL } } ;
UNS8 Master_highestSubIndex_obj1016 = 0 ; UNS32 Master_obj1016[ ] = { 0 } ;
UNS16 Master_obj1017 = 0x0 ;
UNS8 Master_highestSubIndex_obj1018 = 4 ; UNS32 Master_obj1018_Vendor_ID = 0x0 ; UNS32 Master_obj1018_Product_Code = 0x0 ; UNS32 Master_obj1018_Revision_Number = 0x0 ; UNS32 Master_obj1018_Serial_Number = 0x0 ; 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 } } ;
UNS8 Master_obj1019 = 0x4 ; subindex Master_Index1019[ ] = { { RW , uint8, sizeof ( UNS8 ) , ( void ) & Master_obj1019, NULL } } ;
UNS8 Master_highestSubIndex_obj1280 = 3 ; UNS32 Master_obj1280_COB_ID_Client_to_Server_Transmit_SDO = 0x601 ; UNS32 Master_obj1280_COB_ID_Server_to_Client_Receive_SDO = 0x581 ; UNS8 Master_obj1280_Node_ID_of_the_SDO_Server = 0x1 ; 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 } } ;
UNS8 Master_highestSubIndex_obj1281 = 3 ; UNS32 Master_obj1281_COB_ID_Client_to_Server_Transmit_SDO = 0x602 ; UNS32 Master_obj1281_COB_ID_Server_to_Client_Receive_SDO = 0x582 ; UNS8 Master_obj1281_Node_ID_of_the_SDO_Server = 0x2 ; 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 } } ;
UNS8 Master_highestSubIndex_obj1282 = 3 ; UNS32 Master_obj1282_COB_ID_Client_to_Server_Transmit_SDO = 0x603 ; UNS32 Master_obj1282_COB_ID_Server_to_Client_Receive_SDO = 0x583 ; UNS8 Master_obj1282_Node_ID_of_the_SDO_Server = 0x3 ; 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 } } ;
UNS8 Master_highestSubIndex_obj1283 = 3 ; UNS32 Master_obj1283_COB_ID_Client_to_Server_Transmit_SDO = 0x604 ; UNS32 Master_obj1283_COB_ID_Server_to_Client_Receive_SDO = 0x584 ; UNS8 Master_obj1283_Node_ID_of_the_SDO_Server = 0x4 ; 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 } } ;
UNS8 Master_highestSubIndex_obj1284 = 3 ; UNS32 Master_obj1284_COB_ID_Client_to_Server_Transmit_SDO = 0x605 ; UNS32 Master_obj1284_COB_ID_Server_to_Client_Receive_SDO = 0x585 ; UNS8 Master_obj1284_Node_ID_of_the_SDO_Server = 0x5 ; 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 } } ;
UNS8 Master_highestSubIndex_obj1285 = 3 ; UNS32 Master_obj1285_COB_ID_Client_to_Server_Transmit_SDO = 0x606 ; UNS32 Master_obj1285_COB_ID_Server_to_Client_Receive_SDO = 0x586 ; UNS8 Master_obj1285_Node_ID_of_the_SDO_Server = 0x6 ; 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 } } ;
UNS8 Master_highestSubIndex_obj1400 = 6 ; UNS32 Master_obj1400_COB_ID_used_by_PDO = 0x200 ; UNS8 Master_obj1400_Transmission_Type = 0x00 ; UNS16 Master_obj1400_Inhibit_Time = 0x0 ; UNS8 Master_obj1400_Compatibility_Entry = 0x0 ; UNS16 Master_obj1400_Event_Timer = 0x0 ; UNS8 Master_obj1400_SYNC_start_value = 0x0 ; 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 } } ;
UNS8 Master_highestSubIndex_obj1401 = 6 ; UNS32 Master_obj1401_COB_ID_used_by_PDO = 0x300 ; UNS8 Master_obj1401_Transmission_Type = 0x00 ; UNS16 Master_obj1401_Inhibit_Time = 0x0 ; UNS8 Master_obj1401_Compatibility_Entry = 0x0 ; UNS16 Master_obj1401_Event_Timer = 0x0 ; UNS8 Master_obj1401_SYNC_start_value = 0x0 ; 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 } } ;
UNS8 Master_highestSubIndex_obj1402 = 6 ; UNS32 Master_obj1402_COB_ID_used_by_PDO = 0x400 ; UNS8 Master_obj1402_Transmission_Type = 0x00 ; UNS16 Master_obj1402_Inhibit_Time = 0x0 ; UNS8 Master_obj1402_Compatibility_Entry = 0x0 ; UNS16 Master_obj1402_Event_Timer = 0x0 ; UNS8 Master_obj1402_SYNC_start_value = 0x0 ; 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 } } ;
UNS8 Master_highestSubIndex_obj1403 = 6 ; UNS32 Master_obj1403_COB_ID_used_by_PDO = 0x481 ; UNS8 Master_obj1403_Transmission_Type = 0x00 ; UNS16 Master_obj1403_Inhibit_Time = 0x0 ; UNS8 Master_obj1403_Compatibility_Entry = 0x0 ; UNS16 Master_obj1403_Event_Timer = 0x0 ; UNS8 Master_obj1403_SYNC_start_value = 0x0 ; 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 } } ;
UNS8 Master_highestSubIndex_obj1600 = 1 ; UNS32 Master_obj1600[ ] = { 0x20000020 } ; subindex Master_Index1600[ ] = { { RW , uint8, sizeof ( UNS8 ) , ( void ) & Master_highestSubIndex_obj1600, NULL } , { RW , uint32, sizeof ( UNS32 ) , ( void * ) & Master_obj1600[ 0 ] , NULL } } ;
UNS8 Master_highestSubIndex_obj1601 = 1 ; UNS32 Master_obj1601[ ] = { 0x20010020 } ; subindex Master_Index1601[ ] = { { RW , uint8, sizeof ( UNS8 ) , ( void ) & Master_highestSubIndex_obj1601, NULL } , { RW , uint32, sizeof ( UNS32 ) , ( void * ) & Master_obj1601[ 0 ] , NULL } } ;
UNS8 Master_highestSubIndex_obj1602 = 1 ; UNS32 Master_obj1602[ ] = { 0x20020020 } ; subindex Master_Index1602[ ] = { { RW , uint8, sizeof ( UNS8 ) , ( void ) & Master_highestSubIndex_obj1602, NULL } , { RW , uint32, sizeof ( UNS32 ) , ( void * ) & Master_obj1602[ 0 ] , NULL } } ;
UNS8 Master_highestSubIndex_obj1603 = 1 ; UNS32 Master_obj1603[ ] = { 0x60780010 } ; subindex Master_Index1603[ ] = { { RW , uint8, sizeof ( UNS8 ) , ( void ) & Master_highestSubIndex_obj1603, NULL } , { RW , uint32, sizeof ( UNS32 ) , ( void * ) & Master_obj1603[ 0 ] , NULL } } ;
UNS8 Master_highestSubIndex_obj1800 = 6 ; UNS32 Master_obj1800_COB_ID_used_by_PDO = 0x201 ; UNS8 Master_obj1800_Transmission_Type = Transmission_Type; UNS16 Master_obj1800_Inhibit_Time = 0 ; UNS8 Master_obj1800_Compatibility_Entry = 0x0 ; UNS16 Master_obj1800_Event_Timer = 0 ; UNS8 Master_obj1800_SYNC_start_value = 0x11 ; 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 } } ;
UNS8 Master_highestSubIndex_obj1801 = 6 ; UNS32 Master_obj1801_COB_ID_used_by_PDO = 0x202 ; UNS8 Master_obj1801_Transmission_Type = Transmission_Type; UNS16 Master_obj1801_Inhibit_Time = 0 ; UNS8 Master_obj1801_Compatibility_Entry = 0x0 ; UNS16 Master_obj1801_Event_Timer = 0 ; UNS8 Master_obj1801_SYNC_start_value = 0x12 ; 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 } } ;
UNS8 Master_highestSubIndex_obj1802 = 6 ; UNS32 Master_obj1802_COB_ID_used_by_PDO = 0x0000203 ; UNS8 Master_obj1802_Transmission_Type = Transmission_Type; UNS16 Master_obj1802_Inhibit_Time = 0 ; UNS8 Master_obj1802_Compatibility_Entry = 0x0 ; UNS16 Master_obj1802_Event_Timer = 0 ; UNS8 Master_obj1802_SYNC_start_value = 0x13 ; 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 } } ;
UNS8 Master_highestSubIndex_obj1803 = 6 ; UNS32 Master_obj1803_COB_ID_used_by_PDO = 0x00000204 ; UNS8 Master_obj1803_Transmission_Type = Transmission_Type; UNS16 Master_obj1803_Inhibit_Time = 0 ; UNS8 Master_obj1803_Compatibility_Entry = 0x0 ; UNS16 Master_obj1803_Event_Timer = 0 ; UNS8 Master_obj1803_SYNC_start_value = 0x14 ; 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 } } ;
UNS8 Master_highestSubIndex_obj1804 = 6 ; UNS32 Master_obj1804_COB_ID_used_by_PDO = 0x00000205 ; UNS8 Master_obj1804_Transmission_Type = Transmission_Type; UNS16 Master_obj1804_Inhibit_Time = 0 ; UNS8 Master_obj1804_Compatibility_Entry = 0x0 ; UNS16 Master_obj1804_Event_Timer = 0 ; UNS8 Master_obj1804_SYNC_start_value = 0x15 ; 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 } } ;
UNS8 Master_highestSubIndex_obj1805 = 6 ; UNS32 Master_obj1805_COB_ID_used_by_PDO = 0x00000206 ; UNS8 Master_obj1805_Transmission_Type = Transmission_Type; UNS16 Master_obj1805_Inhibit_Time = 0 ; UNS8 Master_obj1805_Compatibility_Entry = 0x0 ; UNS16 Master_obj1805_Event_Timer = 0 ; UNS8 Master_obj1805_SYNC_start_value = 0x16 ; 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 } } ;
UNS8 Master_highestSubIndex_obj1A00 = 1 ; UNS32 Master_obj1A00[ ] = { 0x60FF0020 } ; subindex Master_Index1A00[ ] = { { RW , uint8, sizeof ( UNS8 ) , ( void ) & Master_highestSubIndex_obj1A00, NULL } , { RW , uint32, sizeof ( UNS32 ) , ( void * ) & Master_obj1A00[ 0 ] , NULL } } ;
UNS8 Master_highestSubIndex_obj1A01 = 1 ; UNS32 Master_obj1A01[ ] = { 0x60FF0020 } ; subindex Master_Index1A01[ ] = { { RW , uint8, sizeof ( UNS8 ) , ( void ) & Master_highestSubIndex_obj1A01, NULL } , { RW , uint32, sizeof ( UNS32 ) , ( void * ) & Master_obj1A01[ 0 ] , NULL } } ;
UNS8 Master_highestSubIndex_obj1A02 = 1 ; UNS32 Master_obj1A02[ ] = { 0x60FF0020 } ; subindex Master_Index1A02[ ] = { { RW , uint8, sizeof ( UNS8 ) , ( void ) & Master_highestSubIndex_obj1A02, NULL } , { RW , uint32, sizeof ( UNS32 ) , ( void * ) & Master_obj1A02[ 0 ] , NULL } } ;
UNS8 Master_highestSubIndex_obj1A03 = 1 ; UNS32 Master_obj1A03[ ] = { 0x60FF0020 } ; subindex Master_Index1A03[ ] = { { RW , uint8, sizeof ( UNS8 ) , ( void ) & Master_highestSubIndex_obj1A03, NULL } , { RW , uint32, sizeof ( UNS32 ) , ( void * ) & Master_obj1A03[ 0 ] , NULL } } ;
UNS8 Master_highestSubIndex_obj1A04 = 1 ; UNS32 Master_obj1A04[ ] = { 0x60FF0020 } ; subindex Master_Index1A04[ ] = { { RW , uint8, sizeof ( UNS8 ) , ( void ) & Master_highestSubIndex_obj1A04, NULL } , { RW , uint32, sizeof ( UNS32 ) , ( void * ) & Master_obj1A04[ 0 ] , NULL } } ;
UNS8 Master_highestSubIndex_obj1A05 = 1 ; UNS32 Master_obj1A05[ ] = { 0x60FF0020 } ; subindex Master_Index1A05[ ] = { { RW , uint8, sizeof ( UNS8 ) , ( void ) & Master_highestSubIndex_obj1A05, NULL } , { RW , uint32, sizeof ( UNS32 ) , ( void * ) & Master_obj1A05[ 0 ] , NULL } } ;
subindex Master_Index2000[ ] = { { RW , int32, sizeof ( INTEGER32 ) , ( void ) & D0 , NULL } } ;
subindex Master_Index2001[ ] = { { RW , uint32, sizeof ( UNS32 ) , ( void ) & D1 , NULL } } ;
subindex Master_Index2002[ ] = { { RW , uint32, sizeof ( UNS32 ) , ( void ) & D2 , NULL } } ;
subindex Master_Index6078[ ] = { { RO , int16, sizeof ( INTEGER16 ) , ( void ) & Current_actual_value, NULL } } ;
subindex Master_Index60FF[ ] = { { RW , int32, sizeof ( INTEGER32 ) , ( void ) & Target_velocity, NULL } } ;
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