# co_with_flash

### 实验过程

+ 初始化系统和外设时钟及引脚定义
+ 初始化 TIM， FlexCAN， sfud 和 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      | 05        |

本样例实现了 CANopen OD_H1010 存储当前 ROM 属性参数功能和 CANopen OD_H1011 恢复默认 ROM 属性参数功能。

我们在外部 flash 中使用两个区块来存储数据。一个区块存放初始的默认数据，一个用于存放在启动时加载或在用户修改数据时保存的数据。

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

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

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

当本节点设备从 CAN 总线接收到 OD_H1011 恢复默认参数指令，即如下报文：
| CAN-ID(hex) | Length | Data(hex) |
| :---------- | :----- | :-------- |
| 60A         | 8      | 23 11 10 01 6C 6F 61 64 |

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