修改串口数据接收解析策略,添加OTA升级功能 zsxfly20240820

This commit is contained in:
zsx 2024-08-20 11:02:49 +08:00
parent 87184aa643
commit 5bb0d06413
17 changed files with 5501 additions and 4714 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -444,6 +444,18 @@
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>16</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\src\app_modbus.c</PathWithFileName>
<FilenameWithoutPath>app_modbus.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
@ -454,7 +466,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>16</FileNumber>
<FileNumber>17</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -466,7 +478,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>17</FileNumber>
<FileNumber>18</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -478,7 +490,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>18</FileNumber>
<FileNumber>19</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -490,7 +502,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>19</FileNumber>
<FileNumber>20</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -502,7 +514,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>20</FileNumber>
<FileNumber>21</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -514,7 +526,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>21</FileNumber>
<FileNumber>22</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -526,7 +538,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>22</FileNumber>
<FileNumber>23</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -538,7 +550,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>23</FileNumber>
<FileNumber>24</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -550,7 +562,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>24</FileNumber>
<FileNumber>25</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -562,7 +574,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>25</FileNumber>
<FileNumber>26</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -574,7 +586,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>26</FileNumber>
<FileNumber>27</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -586,7 +598,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>27</FileNumber>
<FileNumber>28</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -598,7 +610,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>28</FileNumber>
<FileNumber>29</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -610,7 +622,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>29</FileNumber>
<FileNumber>30</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -622,7 +634,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>30</FileNumber>
<FileNumber>31</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -634,7 +646,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>31</FileNumber>
<FileNumber>32</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -646,7 +658,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>32</FileNumber>
<FileNumber>33</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -658,7 +670,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>33</FileNumber>
<FileNumber>34</FileNumber>
<FileType>4</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -678,7 +690,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>34</FileNumber>
<FileNumber>35</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -698,7 +710,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>35</FileNumber>
<FileNumber>36</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -718,7 +730,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>36</FileNumber>
<FileNumber>37</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -730,7 +742,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>37</FileNumber>
<FileNumber>38</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -742,7 +754,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>38</FileNumber>
<FileNumber>39</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -754,7 +766,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>39</FileNumber>
<FileNumber>40</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -766,7 +778,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>40</FileNumber>
<FileNumber>41</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -778,7 +790,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>41</FileNumber>
<FileNumber>42</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -798,7 +810,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>42</FileNumber>
<FileNumber>43</FileNumber>
<FileType>4</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -818,7 +830,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>43</FileNumber>
<FileNumber>44</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -830,7 +842,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>44</FileNumber>
<FileNumber>45</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>

View File

@ -461,6 +461,11 @@
<FileType>1</FileType>
<FilePath>..\src\app_ota.c</FilePath>
</File>
<File>
<FileName>app_modbus.c</FileName>
<FileType>1</FileType>
<FilePath>..\src\app_modbus.c</FilePath>
</File>
</Files>
</Group>
<Group>

View File

@ -79,11 +79,10 @@ static tmr_tk_t BAT_Message_Handle(tmr_id_t id) {
Time_Event_Blink(GRB_WS2812_Event,150,150,0xffff,NULL);
}else{
Time_Event_Blink(GRB_WS2812_Event,500,500,0xffff,NULL);
}
}
}else{
Time_Event_Off(GRB_WS2812_Event,NULL);
}
}
BAT_Message.Bat_Voltage =Bat_Voltage;

View File

@ -28,7 +28,9 @@ typedef enum {
typedef struct BAT_Message{
uint8_t Bat_STA;
uint8_t Bat_Remain_Time; // 剩余充电时间
uint16_t Bat_Voltage; // 480=48.0V
uint16_t Bat_Percent; // 420=42.0%
} BAT_Message_t;

View File

@ -195,16 +195,19 @@ void app_control_init(void){
sys_sta.IOgps = Get_Status(IN_GPS);
sys_sta.IOmanager = Get_Status(IO_MANAGER_MODE);
sys_sta.O_12V = 0;
sys_sta.O_lock = 0;
sys_sta.I_01 = Get_Status(IN_01);
sys_sta.I_brake = Get_Status(IO_BRAKE);
sys_sta.I_back = Get_Status(IO_BACK);
sys_sta.IO_TX = Get_Status(IO_TTL_TX);
sys_sta.IO_RX = Get_Status(IO_TTL_RX);
sys_sta.I_brake = Get_Status(IO_BRAKE);
sys_sta.A_brake = 0;
sys_sta.A_Speed_Cut = 0;
sys_sta.Reserve = 0;
sys_sta.O_lock = 0;
sys_sta.Reserve0 = 0;
sys_sta.IO_TX = Get_Status(IO_TTL_TX);
sys_sta.IO_RX = Get_Status(IO_TTL_RX);
sys_sta.O_12V = 0;
sys_sta.Reserve1 = 0;
DEBUG("sys_sta_t:lenght=%d",sizeof(sys_sta));
DEBUG("sys_sta_t=%#04X",*(uint16_t*)&sys_sta);
@ -243,26 +246,9 @@ void EXTI_IRQHandler(void)
}
}
// // PAD控制进入管理员模式
// bool PAD_Manager_Mode =0;
// // PAD控制进入游客模式
// bool PAD_User_Mode =0;
// // PAD控制LED开关
// bool PAD_LED_ONOFF =0;
// // 系统自动刹车
// bool SYS_AUTO_brake =0;
// // 系统自动减速
// bool SYS_AUTO_Speed_Cut =0;
// uint8_t Get_SYS_Status(void){
// return (PAD_Manager_Mode << 3) | (PAD_User_Mode << 2) | (PAD_LED_ONOFF << 1) | (SYS_AUTO_brake << 0) | (SYS_AUTO_Speed_Cut << 4);
// }
// 控制进程,定时调用
void Control_procedure(void){
//电门锁
// sys_sta.Smode = 0;
sys_sta.IOgps = Get_Status(IN_GPS); //更新GPS状态

View File

@ -57,28 +57,38 @@ typedef struct sys_sta{
// uint16_t Pmode:2;
union{
uint8_t Pmode:2;
uint8_t Smode:2;
struct{
uint8_t Tourist:1;
uint8_t Manager:1;
};
};
union{
uint8_t Smode:2;
struct{
uint8_t RES0 :2;
uint8_t IOgps:1;
uint8_t IOmanager:1;
uint8_t RES1 :2;
};
};
union{// 输入状态
uint8_t I_STA:8;
struct{
uint8_t I_01 :1; // 自定义输入状态
uint8_t I_brake :1; // 制动信号输入状态
uint8_t I_back :1; // 倒车信号输入状态
uint8_t A_brake :1; // 自动刹车状态
uint8_t A_Speed_Cut :1; // 自动减速状态
uint8_t O_lock :1; // 电门锁输出状态
uint8_t Reserve0:2;
};
};
union{// 输入输出状态
uint8_t IO_STA:8;
struct{
uint8_t IO_TX :1;
uint8_t IO_RX :1;
uint8_t O_12V :1; // 12V电源输出状态
uint8_t Reserve1:5;
};
};
uint16_t O_12V:1; // 12V电源输出状态
uint16_t O_lock:1; // 电门锁输出状态
uint16_t I_01:1; // 自定义输入状态
uint16_t I_brake:1;// 制动信号输入状态
uint16_t I_back:1; // 倒车信号输入状态
uint16_t IO_TX :1;
uint16_t IO_RX :1;
uint16_t A_brake :1; // 自动刹车状态
uint16_t A_Speed_Cut :1;// 自动减速状态
uint16_t Reserve:7;
} sys_sta_t;
extern sys_sta_t sys_sta;
@ -95,15 +105,6 @@ extern bool app_control_en[PA_MAX];
#define SYS_Back_STA Get_Status(IO_BACK) //倒车状态
#define SYS_Brake_STA Get_Status(IO_BRAKE) //制动状态
// // PAD控制进入管理员模式
// extern bool PAD_Manager_Mode;
// // PAD控制进入游客模式
// extern bool PAD_User_Mode;
// // 系统自动刹车
// extern bool SYS_AUTO_brake;
// // 系统自动减速
// extern bool SYS_AUTO_Speed_Cut;
//中控控制IO初始化
void app_control_init(void);

View File

@ -0,0 +1,493 @@
#include "b6x.h"
#include "drvs.h"
#include "dbg.h"
#include "sftmr.h"
#include "app_modbus.h"
#include "CRCxx.h"
#include "app_ota.h"
#include "sys_config.h"
#define ModbusCRC16_EN 0
#define DEBUG_MODBUS 1
#if DEBUG_MODBUS
#define DEBUG(fmt, args...) debug("[modbus]" fmt, ##args)
#else
#define DEBUG(fmt, args...)
#endif
#define MODBUS_MAX_LEN 64
static uint8_t MODBUS_ReceCount =0;
static uint8_t MODBUS_Rece_BUF[MODBUS_MAX_LEN];
static uint8_t MODBUS_Sent_BUF[MODBUS_MAX_LEN];
// 需掉电不丢失数据12*2字节//40027-40030//40514-40520
uint16_t MODBUS_FLASH_DAT[12] ={
[0]=1,//MODBUS从机地址
[1]=1,// 出厂模式状态 //写入 1设备将重置进入出厂模式
[2]=100,// 固件版本
[3]=1,// 硬件版本
[4]=30,//30*100ms // 代码过期时间
[5]=30,//30*100ms// 输出继电器的关闭时间
[6]=100,//100*100ms// Led 激活时间
[7]=10,//10*10ms// 蜂鸣器激活时间
[8]=0x001f,// Led 键盘颜色//RGB565 格式
[9]=0xf800,// Led Mifare 读卡颜色//RGB565 格式
[10]=0x07E0,// Led 状态灯0颜色//RGB565 格式
[11]=0x07ff,// Led 状态灯1颜色//RGB565 格式
};
bool app_modbus_CheckData(uint8_t *dat , uint8_t len);
//发送数据并计算CRC
void app_modbus_SendData(uint8_t *dat ,uint8_t len){
if(0 == len){
return;
}
uint16_t CRC16=crc16_modbus(dat ,len);
dat[len++] =CRC16 & 0xff;// CRC低字节在前
dat[len++] =CRC16 >> 8;
uart_send(UART1_PORT ,len ,dat);
while(len){//清空发送数据缓存
dat[--len] =0;
}
}
// 01 功能码
void FunctionalCode_01(uint16_t reg_addr){//ID寄存器地址//返回7字节
uint8_t len_count=0;
// DEBUG("FuncCode_01:0x%X\n",reg_addr);
MODBUS_Sent_BUF[len_count++] =MODBUS_ADDR;
MODBUS_Sent_BUF[len_count++] =0x01;
switch(reg_addr){
case 0x0005:
break;
default:
len_count =0;
break;
}
}
// 03 功能码 # 读 - 保持寄存器
// 06 功能码 # 写 - 单个寄存器
void FunctionalCode_03_06(uint8_t CMDCode, uint16_t reg_addr , uint16_t reg_val_num){//寄存器地址//返回8字节或15字节
uint8_t len_count=0;
// DEBUG("FuncCode_03:0x%X\n",reg_addr);
MODBUS_Sent_BUF[len_count++] =MODBUS_ADDR;
MODBUS_Sent_BUF[len_count++] =CMDCode;
if(CMDCode == 0x03){
len_count++;
}else if(CMDCode == 0x06){
MODBUS_Sent_BUF[len_count++] =(reg_addr >> 8) & 0xff;
MODBUS_Sent_BUF[len_count++] =reg_addr & 0xff;
}
switch(reg_addr){
case 0x0001: // 设备的 Modbus地址
if(CMDCode == 0x03){
MODBUS_Sent_BUF[len_count++] =0x00;
MODBUS_Sent_BUF[len_count++] =MODBUS_ADDR & 0xff;
MODBUS_Sent_BUF[2] +=2;
if(0 == --reg_val_num){
break;
}
}else if(CMDCode == 0x06){
MODBUS_ADDR =reg_val_num & 0xff;
MODBUS_Sent_BUF[len_count++] =MODBUS_ADDR >> 8;
MODBUS_Sent_BUF[len_count++] =MODBUS_ADDR & 0xff;
break;
}
{ // 0x0101-0x0002
case 0x0101: // // 读写系统配置
if(CMDCode == 0x03){ // # 读 - 保持寄存器
break;
}else if(CMDCode == 0x06){ // # 写 - 单个寄存器
write_cfg(&sys_conf); //保存写入配置
break;
}
case 0x0102: // 管理员模式油门极限寄存器(Unit:%)
if(CMDCode == 0x03){
MODBUS_Sent_BUF[len_count++] =sys_conf.Manager_sLim >> 8;
MODBUS_Sent_BUF[len_count++] =sys_conf.Manager_sLim & 0xff;
MODBUS_Sent_BUF[2] +=2;
if(0 == --reg_val_num){
break;
}
}else if(CMDCode == 0x06){
sys_conf.Manager_sLim =reg_val_num & 0xff;
MODBUS_Sent_BUF[len_count++] =sys_conf.Manager_sLim >> 8;
MODBUS_Sent_BUF[len_count++] =sys_conf.Manager_sLim & 0xff;
break;
}
case 0x0103: // 游客模式油门极限寄存器(Unit:%)
if(CMDCode == 0x03){
MODBUS_Sent_BUF[len_count++] =sys_conf.Tourist_sLim >> 8;
MODBUS_Sent_BUF[len_count++] =sys_conf.Tourist_sLim & 0xff;
MODBUS_Sent_BUF[2] +=2;
if(0 == --reg_val_num){
break;
}
}else if(CMDCode == 0x06){
sys_conf.Tourist_sLim =reg_val_num & 0xff;
MODBUS_Sent_BUF[len_count++] =sys_conf.Tourist_sLim >> 8;
MODBUS_Sent_BUF[len_count++] =sys_conf.Tourist_sLim & 0xff;
break;
}
case 0x0104: // 减速油门极限寄存器(Unit:%)(自动减速时油门极限)
if(CMDCode == 0x03){
MODBUS_Sent_BUF[len_count++] =sys_conf.Speed_Cut_sLim >> 8;
MODBUS_Sent_BUF[len_count++] =sys_conf.Speed_Cut_sLim & 0xff;
MODBUS_Sent_BUF[2] +=2;
if(0 == --reg_val_num){
break;
}
}else if(CMDCode == 0x06){
sys_conf.Speed_Cut_sLim =reg_val_num & 0xff;
MODBUS_Sent_BUF[len_count++] =sys_conf.Speed_Cut_sLim >> 8;
MODBUS_Sent_BUF[len_count++] =sys_conf.Speed_Cut_sLim & 0xff;
break;
}
case 0x0105: // 刹车距离寄存器(前进)(Unit:mm)
if(CMDCode == 0x03){
MODBUS_Sent_BUF[len_count++] =sys_conf.Brake_DLimit >> 8;
MODBUS_Sent_BUF[len_count++] =sys_conf.Brake_DLimit & 0xff;
MODBUS_Sent_BUF[2] +=2;
if(0 == --reg_val_num){
break;
}
}else if(CMDCode == 0x06){
sys_conf.Brake_DLimit =reg_val_num;
MODBUS_Sent_BUF[len_count++] =sys_conf.Brake_DLimit >> 8;
MODBUS_Sent_BUF[len_count++] =sys_conf.Brake_DLimit & 0xff;
break;
}
case 0x0106: // 减速距离寄存器(Unit:mm)
if(CMDCode == 0x03){
MODBUS_Sent_BUF[len_count++] =sys_conf.Speed_Cut_DLimit >> 8;
MODBUS_Sent_BUF[len_count++] =sys_conf.Speed_Cut_DLimit & 0xff;
MODBUS_Sent_BUF[2] +=2;
if(0 == --reg_val_num){
break;
}
}else if(CMDCode == 0x06){
sys_conf.Speed_Cut_DLimit =reg_val_num;
MODBUS_Sent_BUF[len_count++] =sys_conf.Speed_Cut_DLimit >> 8;
MODBUS_Sent_BUF[len_count++] =sys_conf.Speed_Cut_DLimit & 0xff;
break;
}
case 0x0107: // 刹车距离极限寄存器(后退)(Unit:mm)
if(CMDCode == 0x03){
MODBUS_Sent_BUF[len_count++] =sys_conf.Brake_DLimit_B >> 8;
MODBUS_Sent_BUF[len_count++] =sys_conf.Brake_DLimit_B & 0xff;
MODBUS_Sent_BUF[2] +=2;
if(0 == --reg_val_num){
break;
}
}else if(CMDCode == 0x06){
sys_conf.Brake_DLimit_B =reg_val_num;
MODBUS_Sent_BUF[len_count++] =sys_conf.Brake_DLimit_B >> 8;
MODBUS_Sent_BUF[len_count++] =sys_conf.Brake_DLimit_B & 0xff;
break;
}
case 0x0108: // 减速距离极限寄存器(Unit:mm)
if(CMDCode == 0x03){
MODBUS_Sent_BUF[len_count++] =sys_conf.Speed_Cut_DLimit_B >> 8;
MODBUS_Sent_BUF[len_count++] =sys_conf.Speed_Cut_DLimit_B & 0xff;
MODBUS_Sent_BUF[2] +=2;
if(0 == --reg_val_num){
break;
}
}else if(CMDCode == 0x06){
sys_conf.Speed_Cut_DLimit_B =reg_val_num;
MODBUS_Sent_BUF[len_count++] =sys_conf.Speed_Cut_DLimit_B >> 8;
MODBUS_Sent_BUF[len_count++] =sys_conf.Speed_Cut_DLimit_B & 0xff;
break;
}
}
{ // 0x0109-0x010D
case 0x0201: //PAD模式寄存器
if(CMDCode == 0x03){
MODBUS_Sent_BUF[len_count++] =sys_sta.Pmode >> 8;
MODBUS_Sent_BUF[len_count++] =sys_sta.Pmode & 0xff;
MODBUS_Sent_BUF[2] +=2;
if(0 == --reg_val_num){
break;
}
}else if(CMDCode == 0x06){
sys_sta.Pmode =reg_val_num & 0xff;
MODBUS_Sent_BUF[len_count++] =sys_sta.Pmode >> 8;
MODBUS_Sent_BUF[len_count++] =sys_sta.Pmode & 0xff;
break;
}
case 0x0202: //系统模式寄存器(只读)
if(CMDCode == 0x03){
MODBUS_Sent_BUF[len_count++] =sys_sta.Smode >> 8;
MODBUS_Sent_BUF[len_count++] =sys_sta.Smode & 0xff;
MODBUS_Sent_BUF[2] +=2;
if(0 == --reg_val_num){
break;
}
}else if(CMDCode == 0x06){
// sys_sta.Smode =reg_val_num & 0xff;
// MODBUS_Sent_BUF[len_count++] =sys_sta.Smode >> 8;
// MODBUS_Sent_BUF[len_count++] =sys_sta.Smode & 0xff;
break;
}
case 0x0203: //输入输出状态寄存器
if(CMDCode == 0x03){
MODBUS_Sent_BUF[len_count++] =sys_sta.IO_STA >> 8;
MODBUS_Sent_BUF[len_count++] =sys_sta.IO_STA & 0xff;
MODBUS_Sent_BUF[2] +=2;
if(0 == --reg_val_num){
break;
}
}else if(CMDCode == 0x06){// 输入输出状态寄存器可写
// sys_sta.I_STA =reg_val_num & 0xff;//输入寄存器不可写
sys_sta.IO_STA =reg_val_num & 0xff;
MODBUS_Sent_BUF[len_count++] =sys_sta.IO_STA >> 8;
MODBUS_Sent_BUF[len_count++] =sys_sta.IO_STA & 0xff;
break;
}
case 0x0204: //输入状态寄存器
if(CMDCode == 0x03){
MODBUS_Sent_BUF[len_count++] =sys_sta.I_STA >> 8;
MODBUS_Sent_BUF[len_count++] =sys_sta.I_STA & 0xff;
MODBUS_Sent_BUF[2] +=2;
if(0 == --reg_val_num){
break;
}
}else if(CMDCode == 0x06){
// sys_sta.I_STA =reg_val_num & 0xff;//输入寄存器不可写
MODBUS_Sent_BUF[len_count++] =sys_sta.I_STA >> 8;
MODBUS_Sent_BUF[len_count++] =sys_sta.I_STA & 0xff;
break;
}
case 0x0205: //0 关闭12V输出//1 开启12V输出
if(CMDCode == 0x03){
MODBUS_Sent_BUF[len_count++] =sys_sta.O_12V >> 8;
MODBUS_Sent_BUF[len_count++] =sys_sta.O_12V & 0xff;
MODBUS_Sent_BUF[2] +=2;
if(0 == --reg_val_num){
break;
}
}else if(CMDCode == 0x06){
sys_sta.O_12V =reg_val_num & 0xff;
MODBUS_Sent_BUF[len_count++] =sys_sta.O_12V >> 8;
MODBUS_Sent_BUF[len_count++] =sys_sta.O_12V & 0xff;
break;
}
}
{ // 0x0201-0x0203
case 0x0301: // 电池状态
if(CMDCode == 0x03){
MODBUS_Sent_BUF[len_count++] =BAT_Message.Bat_STA >> 8;
MODBUS_Sent_BUF[len_count++] =BAT_Message.Bat_STA & 0xff;
MODBUS_Sent_BUF[2] +=2;
if(0 == --reg_val_num){
break;
}
}else if(CMDCode == 0x06){
break;
}
case 0x0302: // 电池电压
if(CMDCode == 0x03){
MODBUS_Sent_BUF[len_count++] =BAT_Message.Bat_Voltage >> 8;
MODBUS_Sent_BUF[len_count++] =BAT_Message.Bat_Voltage & 0xff;
MODBUS_Sent_BUF[2] +=2;
if(0 == --reg_val_num){
break;
}
}else if(CMDCode == 0x06){
break;
}
case 0x0303: // 电池电量
if(CMDCode == 0x03){
MODBUS_Sent_BUF[len_count++] =BAT_Message.Bat_Percent >> 8;
MODBUS_Sent_BUF[len_count++] =BAT_Message.Bat_Percent & 0xff;
MODBUS_Sent_BUF[2] +=2;
if(0 == --reg_val_num){
break;
}
}else if(CMDCode == 0x06){
break;
}
case 0x0304: // 剩余充电时间
if(CMDCode == 0x03){
MODBUS_Sent_BUF[len_count++] =BAT_Message.Bat_Remain_Time >> 8;
MODBUS_Sent_BUF[len_count++] =BAT_Message.Bat_Remain_Time & 0xff;
MODBUS_Sent_BUF[2] +=2;
if(0 == --reg_val_num){
break;
}
}else if(CMDCode == 0x06){
break;
}
case 0x0305: // 雷达距离信息
if(CMDCode == 0x03){
MODBUS_Sent_BUF[len_count++] =radar_data.distance >> 8;
MODBUS_Sent_BUF[len_count++] =radar_data.distance & 0xff;
MODBUS_Sent_BUF[2] +=2;
if(0 == --reg_val_num){
break;
}
}else if(CMDCode == 0x06){
break;
}
}
default:
len_count =0;
break;
}
app_modbus_SendData(MODBUS_Sent_BUF ,len_count);
}
bool app_modbus_CheckData(uint8_t *dat , uint8_t len){//检查数据
uint16_t CRC16;
// DEBUG("len:%d\n",len);
if(len > 8){
len = 8;
}
if(dat[0] ==MODBUS_ADDR){//验证从机地址
CRC16 =crc16_modbus(dat ,len-2);//计算CRC
DEBUG("CRC16:0x%X\n",CRC16);
#if !ModbusCRC16_EN
CRC16 =((uint16_t)(dat[len-1])<<8) + dat[len-2];
#endif
if(CRC16 ==((uint16_t)(dat[len-1])<<8) + dat[len-2]){//CRC低字节在前
switch(dat[1]){//功能码
case 0x01:// 功能码 01
FunctionalCode_01(((uint16_t)dat[2]<<8) + dat[3]);
break;
case 0x03:// 功能码03 # 读 - 保持寄存器
FunctionalCode_03_06(0x03,((uint16_t)dat[2]<<8) + dat[3] ,((uint16_t)dat[4]<<8) + dat[5]);
// FunctionalCode_03(((uint16_t)dat[2]<<8) + dat[3] ,((uint16_t)dat[4]<<8) + dat[5]);
break;
case 0x06:// 功能码06 # 写 - 单个寄存器
FunctionalCode_03_06(0x06,((uint16_t)dat[2]<<8) + dat[3] ,((uint16_t)dat[4]<<8) + dat[5]);
// FunctionalCode_06(((uint16_t)dat[2]<<8) + dat[3] ,((uint16_t)dat[4]<<8) + dat[5]);
break;
default:
break;
}
return true;
}
}
return false;
}
#if !defined(Modbus_RBUF_SIZE)
#define Modbus_RBUF_SIZE 0x100
#endif
#define Modbus_FIFO_RXTL 8
#undef RBUF_SIZE
#define RBUF_SIZE Modbus_RBUF_SIZE
#include "rbuf.h"
/// RingBuffer for modbus1
static rbuf_t ModbusRbRx;
void app_modbus_Rb_Reset(void){
rbuf_init(&ModbusRbRx);
}
uint16_t app_modbus_Rb_Len(void){
return rbuf_len(&ModbusRbRx);
}
uint16_t app_modbus_Rb_Read(uint8_t *buff, uint16_t max){
return rbuf_gets(&ModbusRbRx, buff, max);
}
#define Rx_timeout _MS(20) // 接收超时时间
static tmr_tk_t Rx_timeout_id=0;
static tmr_tk_t Rx_timeout_handler(tmr_id_t id){
(void)(id);
MODBUS_ReceCount = app_modbus_Rb_Read(&MODBUS_Rece_BUF[0], MODBUS_MAX_LEN);
DEBUG("RC:%d\n",MODBUS_ReceCount);
// uart_send(UART1_PORT ,MODBUS_ReceCount ,MODBUS_Rece_BUF);
app_modbus_CheckData(MODBUS_Rece_BUF, MODBUS_ReceCount);//modbus数据解析
app_otas_rxd(MODBUS_ReceCount ,MODBUS_Rece_BUF);//otas数据解析
while(MODBUS_ReceCount){
MODBUS_Rece_BUF[--MODBUS_ReceCount] = 0;
}
return 0;
}
void app_modbus_Init(uint32_t baudrate, uint8_t io_tx, uint8_t io_rx){
uart_init(UART1_PORT, io_tx, io_rx);
uart_conf(UART1_PORT, BRR_BAUD(baudrate), LCR_BITS(8, 1, none));
// 使能FIFO 接收8字节时触发、使能超过20字节触发超时中断
uart_fctl(UART1_PORT, FCR_FIFOEN_BIT | FCR_RXTL_8BYTE,
20/*bits_rto*/, UART_IR_RXRD_BIT | UART_IR_RTO_BIT);
// empty buffer
rbuf_init(&ModbusRbRx);
DEBUG("MODBUS init success!\n");
NVIC_EnableIRQ(UART1_IRQn);
Rx_timeout_id =sftmr_start(10, Rx_timeout_handler);
}
void UART1_IRQHandler(void){
uint32_t state = UART1->IFM.Word; // UART1->RIF.Word;
if (state & 0x01){ //(BIT_RXRD)
UART1->IDR.RXRD = 1; // Disable RXRD Interrupt
for (uint8_t i = 0; i < Modbus_FIFO_RXTL; i++){
rbuf_putc(&ModbusRbRx, UART1->RBR);
}
sftmr_Refresh(Rx_timeout_id ,Rx_timeout);
UART1->ICR.RXRD = 1; // Clear RXRD Interrupt Flag
UART1->IER.RXRD = 1; // Enable RXRD Interrupt
}
if (state & 0x10){ //(BIT_RTO)
UART1->IDR.RTO = 1; // Disable RTO Interrupt
while (UART1->SR.RFNE){
rbuf_putc(&ModbusRbRx, UART1->RBR);
if(0 ==UART1->SR.RFNE){
sftmr_Refresh(Rx_timeout_id ,Rx_timeout);
}
}
UART1->ICR.RTO = 1; // Clear RTO Interrupt Flag
UART1->IER.RTO = 1; // Enable RTO Interrupt
}
}

View File

@ -0,0 +1,25 @@
#ifndef _APP_MODBUS_H_
#define _APP_MODBUS_H_
#include <stdint.h>
//MODBUS从机地址(广播地址0)
#define MODBUS_ADDR sys_conf.Modbus_addr
void app_modbus_Init(uint32_t baudrate, uint8_t io_tx, uint8_t io_rx);
// Empty RingBuffer to reset.
void app_modbus_Rb_Reset(void);
// Get Length of data in RB.
uint16_t app_modbus_Rb_Len(void);
// Read data from RB, return the Length of data copied.
uint16_t app_modbus_Rb_Read(uint8_t *buff, uint16_t max);
// Uart Data procedure
void app_modbus_procedure(void);
#endif

View File

@ -16,8 +16,8 @@
#include "utils.h"
#include "app_ota.h"
#include "sys_config.h"
// #include "app_led_control.h"
#include "app_modbus.h"
/*
@ -74,8 +74,6 @@
#define OTA_TIMER_TICK _MS(3000) // 3s
#define OTA_MAX_TIMEOUT (400) // 600s/20min
#define OTA_CRC_EN 0 // CRC校验使能/0:不检验/1:检验
enum ota_state{
OTA_IDLE,
OTA_START,
@ -96,7 +94,7 @@ enum ota_err_code{
OTA_ERR_FW = 0x5504,//固件过大
OTA_ERR_TIMEOUT = 0x5505,//升级超时
OTA_ERR_INDEX = 0x5506,//数据索引错误
OTA_ERR_DLEN = 0x5507,//数据长度错误
OTA_ERR_DLEN = 0x5507,//数据长度错误
};
typedef struct ota_env{
@ -164,7 +162,6 @@ static void flash_wr_protect(uint8_t val)
* Refout: True
* Xorout: 0x0000
*****************************************************************************/
#if (OTA_CRC_EN)
static uint16_t crc16_modbus(uint8_t *data, uint16_t length)
{
uint8_t i;
@ -189,34 +186,24 @@ static uint16_t crc16_modbus(uint8_t *data, uint16_t length)
return crc;
}
#endif
void app_otas_rxd(uint16_t len, const uint8_t *data)
{
#if (OTA_CRC_EN)
uint8_t OTA_pack_len =OTA_PKT_LEN;
#else
uint8_t OTA_pack_len = OTA_DATA_LEN - 2;//减去CRC16的两字节
#endif
// 接收20字节数据包
if (len > OTA_pack_len){
len = OTA_pack_len;
if (len > OTA_PKT_LEN){
len = OTA_PKT_LEN;
}
// memcpy(ota_recv_buf, data, ota_env.data_len);
for(uint16_t i = 0; i < len; i++){
for(uint16_t i = 0; i < OTA_PKT_LEN; i++){
ota_recv_buf[i] = data[i];
}
// uart_send(UART1_PORT ,len ,ota_recv_buf);
// debugHex(ota_recv_buf, len);
ota_env.new_data_flag = OTA_DATA_NEW;
app_ota_proc();
}
void app_otas_txd(uint16_t len, const uint8_t *data){
// uart_send(UART1_PORT ,len ,data);
app_PAD_Sendcmd(OTA_CMD_ID ,OTA_REG_ADDR ,data ,len);
uart_send(UART1_PORT ,len ,data);
}
tmr_tk_t ota_time_handle(uint8_t timeid){
@ -256,7 +243,6 @@ void app_ota_proc(void){
}
ota_env.new_data_flag = OTA_DATA_OLD;
if ((PEER_IDX == OTA_CMD_START) && (ota_env.err_info == OTA_ERR_NONE)){ //初始帧
#if (OTA_CRC_EN)
uint16_t local_crc16 = crc16_modbus(p_OTAData, OTA_PKT_LEN - 2);
if(local_crc16 != PEER_CRC){
DEBUG("CRC16:0x%X,local_crc16:0x%X", PEER_CRC, local_crc16);
@ -265,7 +251,6 @@ void app_ota_proc(void){
DEBUG("OTA_ERR_CRC");
return;
}
#endif
if((ota_env.bank != FLASH_ADDR_INVALID) && (ota_env.bank ==(0xFFF000 & OTA_read32(PEER_DAT)))){//检验数据包的是否有效
// Erase
uint32_t erase_offset = (ota_env.bank & 0xFFFFF000UL);
@ -303,7 +288,6 @@ void app_ota_proc(void){
}
ota_env.new_data_flag = OTA_DATA_OLD;
#if (OTA_CRC_EN)
uint16_t local_crc16 = crc16_modbus(p_OTAData, OTA_PKT_LEN - 2);
if(local_crc16 != PEER_CRC){
DEBUG("IDX:%d,CRC16:0x%X,local_crc16:0x%X",PEER_IDX, PEER_CRC, local_crc16);
@ -312,8 +296,6 @@ void app_ota_proc(void){
DEBUG("OTA_ERR_CRC");
return;
}
#endif
if(ota_env.data_idx == PEER_IDX && ota_env.data_idx < OTA_FW_MAX_SIZE){ //数据索引正确
uint8_t wr_data_pos = (ota_env.data_idx % OTA_DATA_LEN) * OTA_DATA_LEN;
uint32_t wr_addr = (ota_env.data_idx / OTA_DATA_LEN) * FLASH_PAGE_SIZE + ota_env.bank;
@ -402,13 +384,11 @@ void app_ota_proc(void){
}
}
bool app_is_ota_proc(void)
{
bool app_is_ota_proc(void){
return (ota_env.ota_sta != OTA_IDLE);
}
static void ota_env_init(void)
{
static void ota_env_init(void){
ota_env.bank = FLASH_ADDR_INVALID;
ota_env.ota_sta = OTA_IDLE;
ota_env.new_data_flag = OTA_DATA_OLD;
@ -418,8 +398,7 @@ static void ota_env_init(void)
ota_env.time_id = TMR_ID_NONE;
}
void app_ota_init(void)
{
void app_ota_init(void){
ota_env_init();
#if (CFG_USE_LOAD)

View File

@ -55,37 +55,6 @@ void radar_AUTO_BrakeORSpeedCut(uint8_t radar_id , uint16_t Car_Distance){ //距
// 定时处理数和获取数据
static tmr_tk_t radar_timer_handler(tmr_id_t id){
(void)(id);
// uint16_t Car_Distance=0;
// if(Get_Status(OUT_Door_lock)){
// // 定时发送状态信息
// if(radar_flag_cnt > 4){
// uint8_t ret_data[20]={0,0};
// radar_flag_cnt =0;
// ret_data[radar_flag_cnt++] =BAT_Message.Bat_STA; // 电池状态
// ret_data[radar_flag_cnt++] =BAT_Message.Bat_Voltage >> 8; //电池电压
// ret_data[radar_flag_cnt++] =BAT_Message.Bat_Voltage & 0xff;
// ret_data[radar_flag_cnt++] =get_in_acc_percent();// 当前油门百分比
// ret_data[radar_flag_cnt++] =radar_daraframe.Front_data /100;// 前雷达距离信息
// ret_data[radar_flag_cnt++] =radar_daraframe.Back_data/100;// 后雷达距离信息
// // 读取系统配置
// ret_data[radar_flag_cnt++]=sys_conf_info.M_mode_sLim;
// ret_data[radar_flag_cnt++]=sys_conf_info.U_mode_sLim;
// ret_data[radar_flag_cnt++]=sys_conf_info.AUTO_Brake_Distance;
// ret_data[radar_flag_cnt++]=sys_conf_info.AUTO_Speed_Cut_Distance;
// ret_data[radar_flag_cnt++]=sys_conf_info.AUTO_Brake_Distance_B;
// ret_data[radar_flag_cnt++]=sys_conf_info.AUTO_Speed_Cut_Distance_B;
// ret_data[radar_flag_cnt++] =(Get_Status(IN_GPS)<<0) | (SYS_Back_STA<<1) | (Get_Status(IO_BRAKE)<<2)
// | (SYS_Manager_STA<<3) | ((PAD_Manager_Mode)<<4)
// | ((PAD_User_Mode)<<5) | ((sys_sta.A_Speed_Cut)<<6) | ((sys_sta.A_brake)<<7);
// app_PAD_Sendcmd(0x10,0x01,ret_data,radar_flag_cnt);
// radar_flag_cnt =0;
// goto radar_end;
// }else {
// radar_flag_cnt++;
// }
// }
// DEBUG("RADAR...");
if(radar_NewData_flag == 1){
radar_NewData_flag =0; // 清空新数据标志位
radar_CMDSend_cnt =0; // 清空发送命令计数
@ -108,9 +77,6 @@ static tmr_tk_t radar_timer_handler(tmr_id_t id){
return _MS(160);//300ms
}
static uint8_t radar_buff[RADAR_BUFF_MAX];
// 数据接收

View File

@ -17,20 +17,20 @@ void app_uart_Init(uint8_t port, uint32_t baudrate, uint8_t io_tx, uint8_t io_rx
NVIC_EnableIRQ(port==UART1_PORT?UART1_IRQn:UART2_IRQn);
}
void UART1_IRQHandler(void)
{
uint32_t state = UART1->IFM.Word; // UART1->RIF.Word;
// void UART1_IRQHandler(void)
// {
// uint32_t state = UART1->IFM.Word; // UART1->RIF.Word;
if (state & 0x01) //(BIT_RXRD)
{
UART1->IDR.RXRD = 1; // Disable RXRD Interrupt
uint8_t data = UART1->RBR;
// if (state & 0x01) //(BIT_RXRD)
// {
// UART1->IDR.RXRD = 1; // Disable RXRD Interrupt
// uint8_t data = UART1->RBR;
app_PAD_Receive(data);
UART1->ICR.RXRD = 1; // Clear RXRD Interrupt Flag
UART1->IER.RXRD = 1; // Enable RXRD Interrupt
}
}
// app_PAD_Receive(data);
// UART1->ICR.RXRD = 1; // Clear RXRD Interrupt Flag
// UART1->IER.RXRD = 1; // Enable RXRD Interrupt
// }
// }
/*
***************************************UART2*****************************************************

View File

@ -49,7 +49,6 @@ void GRB_WS2812_Write_24Bits(uint32_t GRB888)
}
WS2812_DIN_L;
}
}
void GRB_WS2812_Write_GRBs(uint8_t len, uint32_t *GRB888)

View File

@ -8,6 +8,8 @@
#include "prf_sess.h"
#include "sys_config.h"
#include "app_modbus.h"
#define DBG_MAIN_EN 1
@ -196,40 +198,16 @@ int main(void)
}
*****************/
app_uart_Init(UART1_PORT,9600,PAD_TXD1,PAD_RXD1);//上位机PAD
app_modbus_Init(9600,PAD_TXD1,PAD_RXD1);//modbus
app_uart_Init(UART2_PORT,9600,RADAR_TXD0,RADAR_RXD0);//雷达
app_control_init();
conf_init();
app_radar_init();
Time_Event_Init();
GRB_WS2812_Init();
BAT_Message_Init();
app_ota_init();
// read config
uint8_t ret = read_cfg(&sys_conf);
if(ret || sys_conf.VERSION != SOFTWARE_ID){
DEBUG("Read Config ERROR!\r\n");//读取配置文件失败//使用默认配置
sys_conf.VERSION =SOFTWARE_ID;
sys_conf.Manager_sLim = D_Manager_sLim,
sys_conf.Tourist_sLim = D_Tourist_sLim,
sys_conf.Speed_Cut_sLim = D_Speed_Cut_sLim,
sys_conf.Brake_DLimit = D_Brake_DLimit,//自动刹车距离
sys_conf.Speed_Cut_DLimit = D_Speed_Cut_DLimit,//自动减速距离
sys_conf.Brake_DLimit_B = D_Brake_DLimit_B,//自动刹车距离
sys_conf.Speed_Cut_DLimit_B = D_Speed_Cut_DLimit_B,//自动减速距离
sys_conf.Reserve =0;
write_cfg(&sys_conf);
}
DEBUG("sys_conf:lenght=%d",sizeof(sys_conf));
DEBUG("VERSION:%#04X",sys_conf.VERSION);
DEBUG("Manager_sLim:%d",sys_conf.Manager_sLim);
DEBUG("Tourist_sLim:%d",sys_conf.Tourist_sLim);
DEBUG("Speed_Cut_sLim:%d",sys_conf.Speed_Cut_sLim);
DEBUG("Brake_DLimit:%d",sys_conf.Brake_DLimit);
DEBUG("Speed_Cut_DLimit:%d",sys_conf.Speed_Cut_DLimit);
DEBUG("Brake_DLimit_B:%d",sys_conf.Brake_DLimit_B);
DEBUG("Speed_Cut_DLimit_B:%d",sys_conf.Speed_Cut_DLimit_B);
#if (1 ==BLE_ENABLE)
// ADC初始化
sftmr_start(20, test_timer_handler);
@ -248,7 +226,7 @@ int main(void)
// app_ble_procedure();
// OTA Procedure
// app_ota_proc();
app_ota_proc();
Control_procedure();
iwdt_feed();//喂狗

View File

@ -60,22 +60,23 @@ uint8_t read_cfg(SYS_CONF_t *sys_config_info_t){
void conf_init(void){
// read config
if(read_cfg(&sys_conf)){
if( read_cfg(&sys_conf) || (sys_conf.VERSION != SOFTWARE_ID)){
DEBUG("Read Config :CRC_ERROR ");//读取配置文件失败//使用默认配置
sys_conf.VERSION =SOFTWARE_ID;
sys_conf.Manager_sLim = D_Manager_sLim,
sys_conf.Tourist_sLim = D_Tourist_sLim,
sys_conf.Speed_Cut_sLim = D_Speed_Cut_sLim,//(自动减速时油门极限)
sys_conf.Brake_DLimit = D_Brake_DLimit,//自动刹车距离(前进)
sys_conf.Speed_Cut_DLimit = D_Speed_Cut_DLimit,//自动减速距离
sys_conf.Brake_DLimit_B = D_Brake_DLimit_B,//自动刹车距离(后退)
sys_conf.Speed_Cut_DLimit_B = D_Speed_Cut_DLimit_B,//自动减速距离
sys_conf.Reserve =0;
sys_conf.Modbus_addr =D_Modbus_addr;
sys_conf.Manager_sLim = D_Manager_sLim;
sys_conf.Tourist_sLim = D_Tourist_sLim;
sys_conf.Speed_Cut_sLim = D_Speed_Cut_sLim;//(自动减速时油门极限)
sys_conf.Brake_DLimit = D_Brake_DLimit;//自动刹车距离(前进)
sys_conf.Speed_Cut_DLimit = D_Speed_Cut_DLimit;//自动减速距离
sys_conf.Brake_DLimit_B = D_Brake_DLimit_B;//自动刹车距离(后退)
sys_conf.Speed_Cut_DLimit_B = D_Speed_Cut_DLimit_B;//自动减速距离
DEBUG("write Default Config!!!");// 写入默认配置
write_cfg(&sys_conf);
}
DEBUG("\nsys_conf:lenght=%d",sizeof(sys_conf));
DEBUG("VERSION:%#04X",sys_conf.VERSION);
DEBUG("Modbus_addr:%#04X",sys_conf.Modbus_addr);
DEBUG("Manager_sLim:%d",sys_conf.Manager_sLim);
DEBUG("Tourist_sLim:%d",sys_conf.Tourist_sLim);
DEBUG("Speed_Cut_sLim:%d",sys_conf.Speed_Cut_sLim);

View File

@ -17,10 +17,10 @@
// 必须4字节对齐
typedef struct SYS_CONF{
uint16_t VERSION; // 软件版本号
uint8_t Modbus_addr; // MODBUS地址
uint8_t Manager_sLim; // 管理员模式油门极限(Unit:%)
uint8_t Tourist_sLim; // 游客模式油门极限
uint8_t Speed_Cut_sLim; // 减速油门极限(Unit:%)(自动减速时油门极限)
uint8_t Reserve; // 保留凑足4字节对齐
uint16_t Brake_DLimit; // 刹车距离极限(前进)(Unit:mm)
uint16_t Speed_Cut_DLimit; // 减速距离极限
uint16_t Brake_DLimit_B; // 刹车距离极限(后退)
@ -35,7 +35,8 @@ extern BAT_Message_t BAT_Message;
void write_cfg(SYS_CONF_t *sys_config_info_t);
// 读配置
uint8_t read_cfg(SYS_CONF_t *sys_config_info_t);
// 初始化配置
void conf_init(void);
// 油门ADC
@ -49,7 +50,8 @@ uint8_t read_cfg(SYS_CONF_t *sys_config_info_t);
/**************************系统版本**************************/
// 软件本号
#define SOFTWARE_ID 0x0101
#define SOFTWARE_ID 0x0102
#define D_Modbus_addr 0x01
/************************油门(Unit:%)************************/
// 管理员模式默认油门极限(0-100%)
#define D_Manager_sLim 100