# co_with_eeprom

### 实验过程

+ 初始化系统和外设时钟及引脚定义
+ 初始化 TIM， FlexCAN， I2C 和 CANopen 协议栈
+ 启动 CAN 收发中断，启动 1ms 定时器，启动 CANopen 协议栈，CANopen 节点以 500 kbps的比特率上线

### 实验现象

节点上线向 CAN 网络发送节点上线报文：

| CAN-ID(hex) | Length | Data(hex) |
| :---------- | :----- | :-------- |
| 70A         | 1      | 00        |

之后以 1000ms 的时间间隔向 CAN 网络发送节点心跳报文：

| CAN-ID(hex) | Length | Data(hex) |
| :---------- | :----- | :-------- |
| 70A         | 1      | 7F        |



本样例实现了 CANopen OD_H1010 存储当前对象字典中 EEPROM 属性参数和 ROM 属性参数功能以及 CANopen OD_H1011 恢复默认 ROM 属性参数功能。

我们在 MCU 外部 EEPROM 中将其分为三部分来存储数据。第一部分用于存放对象字典中 EEPROM 属性参数数据，第二部分用于存放对象字典中 ROM 属性参数数据，第三部分用来存放 MBR(Master Boot Record)数据。

当本节点设备从 CAN 总线接收到 OD_H1010 存储当前参数指令，即如下报文：

| CAN-ID(hex) | Length | Data(hex)               |
| :---------- | :----- | :---------------------- |
| 60A         | 8      | 23 10 10 01 73 61 76 65 |

当前的对象字典中属于 ROM 存储属性的对象字典参数存储到 MCU 外部的 EEPROM 中，并在以后的运行中都使用保存在外部 EERPOM 中的对象字典参数启动。

当本节点设备从 CAN 总线接收到 OD_H1011 恢复默认参数指令，即如下报文：

| CAN-ID(hex) | Length | Data(hex)               |
| :---------- | :----- | :---------------------- |
| 60A         | 8      | 23 11 10 01 6C 6F 61 64 |

属于 ROM 属性的对象字典参数将恢复为初始默认参数，并在以后的运行中都使用默认 ROM 属性的对象字典参数。

可以向当前节点发送如下指令查询当前节点的上电次数来验证 co_with_eeprom 样例是否正常工作：


| CAN-ID(hex) | Length | Data(hex)               |
| :---------- | :----- | :---------------------- |
| 60A         | 8      | 40 06 21 00 00 00 00 00 |

当本节点设备从 CAN 总线接收到上述报文时便会回复下如报文：
| CAN-ID(hex) | Length | Data(hex)               |
| :---------- | :----- | :---------------------- |
| 58A         | 8      | 43 06 21 00 01 00 00 00 |

该报文表示当前节点共有 1次上电记录。