增加重启以及修改接收BOOT ID为0x21

This commit is contained in:
2026-05-02 07:27:52 +08:00
parent 2153bfcd1b
commit 2f94a8ecae
5 changed files with 145 additions and 164 deletions

12
CAN.C
View File

@@ -324,11 +324,11 @@ void CAN_vInit(void)
/// - priority class 3; transmit acceptance filtering is based on the list /// - priority class 3; transmit acceptance filtering is based on the list
/// order (like class 1) /// order (like class 1)
/// - extended 29-bit identifier /// - extended 29-bit identifier
/// - identifier 29-bit: 0x00000003 /// - identifier 29-bit: 0x00000021
//--------------MOAR5 = 0xE0000003--------------------------------------- //--------------MOAR5 = 0xE0000021---------------------------------------
CAN_vWriteAMData(0xE0000003); // load MO5 arbitration register CAN_vWriteAMData(0xE0000021); // load MO5 arbitration register
// CAN Address pointing to the CAN_MODATAH5 // CAN Address pointing to the CAN_MODATAH5
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1) CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
@@ -633,11 +633,11 @@ void CAN_vInit(void)
/// - priority class 3; transmit acceptance filtering is based on the list /// - priority class 3; transmit acceptance filtering is based on the list
/// order (like class 1) /// order (like class 1)
/// - extended 29-bit identifier /// - extended 29-bit identifier
/// - identifier 29-bit: 0x1FFFFFF0 /// - identifier 29-bit: 0x1FFFFF21
//--------------MOAR9 = 0xFFFFFFF0--------------------------------------- //--------------MOAR9 = 0xFFFFFF21---------------------------------------
CAN_vWriteAMData(0xFFFFFFF0); // load MO9 arbitration register CAN_vWriteAMData(0xFFFFFF21); // load MO9 arbitration register
// CAN Address pointing to the CAN_MODATAH9 // CAN Address pointing to the CAN_MODATAH9
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1) CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)

4
MAIN.C
View File

@@ -225,7 +225,7 @@ void main(void)
SP = 0xC0; // Initialize Stack Pointer to 0xC0; SP = 0xC0; // Initialize Stack Pointer to 0xC0;
// CanTransmit(); // CanTransmit();
// FlgCan_1 = 1;//<2F><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>ʱһ<CAB1><D2BB>ʱ<EFBFBD><CAB1><EFBFBD>ٵ<EFBFBD><D9B5><EFBFBD>CAN<41><4E><EFBFBD><EFBFBD> // FlgCan_1 = 1;//<2F><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>ʱһ<CAB1><D2BB>ʱ<EFBFBD><CAB1><EFBFBD>ٵ<EFBFBD><D9B5><EFBFBD>CAN<41><4E><EFBFBD><EFBFBD>
// USER CODE END // USER CODE END
while(1) while(1)
@@ -243,6 +243,8 @@ void main(void)
WDT_vRefresh(); WDT_vRefresh();
// LedDr(); // LedDr();
BootMain(); BootMain();
RestartDataFlg1 = 0x55;
RestartDataFlg2 = 0x55;
// tmp[1] = (ubyte)CntCan_1; // tmp[1] = (ubyte)CntCan_1;
// tmp[0] = (ubyte)(CntCan_1>>8); // tmp[0] = (ubyte)(CntCan_1>>8);
// CAN_vLoadData(0x2, (ulong *)(tmp)); // Add this Line // CAN_vLoadData(0x2, (ulong *)(tmp)); // Add this Line

View File

@@ -314,6 +314,21 @@ ENDIF
RSEG ?C_C51STARTUP RSEG ?C_C51STARTUP
STARTUP1: STARTUP1:
MOV DPTR,#0xF5E7
MOVX A,@DPTR
CJNE A,#0x55,ClOCKINIT ;判断数据是否相等,不相等就初始化时钟表示为重新上电
AJMP Restart1
Restart1: MOV DPTR,#0xF600
MOVX A,@DPTR
CJNE A,#0x55,ClOCKINIT ;判断数据是否相等,不相等就初始化时钟表示为重新上电
AJMP STARECMAIN ;两次判断相等就直接跳转到main函数
STARECMAIN: MOV SP,#?STACK-1
LJMP ?C_START
ClOCKINIT:
IF (XTAL <> 0) IF (XTAL <> 0)
; switch to external XTAL ; switch to external XTAL

209
User.c
View File

@@ -1,43 +1,45 @@
#include "MAIN.H" #include "MAIN.H"
//can<EFBFBD><EFBFBD>Ϣ //can消息
UnInfCan UnInfCan_1 = {0}; UnInfCan UnInfCan_1 = {0};
UnSwSample UnSwSample_1 = {0}; UnSwSample UnSwSample_1 = {0};
UnSwOut UnSwOut_1 = {0}; UnSwOut UnSwOut_1 = {0};
UnRemoteControlOutput UnRemoteControlOutput_1 = {0,0,0,0,0,0,0,0};//ң<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><EFBFBD><EFBFBD> UnRemoteControlOutput UnRemoteControlOutput_1 = {0,0,0,0,0,0,0,0};//遥控器数据发送
UnRemoteControlOutput UnRemoteControlOutput_2 = {0,0,0,0,0,0,0,0};//ң<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><EFBFBD><EFBFBD> UnRemoteControlOutput UnRemoteControlOutput_2 = {0,0,0,0,0,0,0,0};//遥控器数据发送
SBusData sbus_data; SBusData sbus_data;
//CAN<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //CAN发送计数
uword CntCan_1 = 0; uword CntCan_1 = 0;
bit FlgCan_1 = 0; bit FlgCan_1 = 0;
//<EFBFBD><EFBFBD>һ<EFBFBD>βɼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָʾ //第一次采集数据有效标志
bit FlgOneTime = 0; bit FlgOneTime = 0;
ubyte uart2RxFlag = 0; ubyte uart2RxFlag = 0;
uword RgCanPerid = 50; uword RgCanPerid = 50;
ubyte can_error_cnt = 0; ubyte can_error_cnt = 0;
ubyte can_error_flg = 0; ubyte can_error_flg = 0;
ubyte RestartDataFlg1 _at_ 0xF5E7;
ubyte RestartDataFlg2 _at_ 0xF600;
//PWM 20181227 //PWM 20181227
ubyte PwmH[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; ubyte PwmH[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
//----------------------------------------------------------------------- //-----------------------------------------------------------------------
//RTC<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> //RTC定时器
//----------------------------------------------------------------------- //-----------------------------------------------------------------------
void RTCProcess(void) void RTCProcess(void)
{ {
//************************************************************************ //************************************************************************
//////CAN<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //////CAN发送计数
if(FlgCan_1){CntCan_1++;if(CntCan_1 >= RgCanPerid){FlgCan_1=0; CntCan_1=0;}}else{CntCan_1=0;} if(FlgCan_1){CntCan_1++;if(CntCan_1 >= RgCanPerid){FlgCan_1=0; CntCan_1=0;}}else{CntCan_1=0;}
//************************************************************************ //************************************************************************
} }
// SBus <EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // SBus 数据解析函数
SBusData* parseSBusData(const uint8_t *input_data) SBusData* parseSBusData(const uint8_t *input_data)
{ {
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>16<EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>ÿ<EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD>Ϊ11λ // 解析16个通道的数据每个通道为11
sbus_data.channels[0] = (input_data[1] | input_data[2] << 8) & 0x07FF; sbus_data.channels[0] = (input_data[1] | input_data[2] << 8) & 0x07FF;
sbus_data.channels[1] = (input_data[2] >> 3 | input_data[3] << 5) & 0x07FF; sbus_data.channels[1] = (input_data[2] >> 3 | input_data[3] << 5) & 0x07FF;
sbus_data.channels[2] = (input_data[3] >> 6 | input_data[4] << 2 | input_data[5] << 10) & 0x07FF; sbus_data.channels[2] = (input_data[3] >> 6 | input_data[4] << 2 | input_data[5] << 10) & 0x07FF;
@@ -56,20 +58,14 @@ SBusData* parseSBusData(const uint8_t *input_data)
sbus_data.channels[14] = (input_data[20] >> 2 | input_data[21] << 6) & 0x07FF; sbus_data.channels[14] = (input_data[20] >> 2 | input_data[21] << 6) & 0x07FF;
sbus_data.channels[15] = (input_data[21] >> 5 | input_data[22] << 3) & 0x07FF; sbus_data.channels[15] = (input_data[21] >> 5 | input_data[22] << 3) & 0x07FF;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD>ֽ<EFBFBD> // 解析标志字节
sbus_data.flags = input_data[23]; sbus_data.flags = input_data[23];
uart2RxFlag = 1; uart2RxFlag = 1;
// for(ubyte i=0;i<8;i++)
// {
// printf( "%d ",i);
// printf( "%04x\r\n",sbus_data.channels[i]);
// }
// printf("%d\r\n",sbus_data.channels[0]);
return &sbus_data; return &sbus_data;
} }
//can<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //can错误处理
void CanErrorProcess(void) void CanErrorProcess(void)
{ {
ubyte ubNSRL; ubyte ubNSRL;
@@ -119,37 +115,37 @@ void CanTransmit(ubyte index,ubyte *buf)
CanTransmitbuf[4] = buf[6]; CanTransmitbuf[4] = buf[6];
CanTransmitbuf[5] = buf[7]; CanTransmitbuf[5] = buf[7];
CAN_waitTransmit(index);//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD>һ֡<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ᶪ֡ CAN_waitTransmit(index);//发送前等待上一帧发送完,不然会丢帧
CAN_vLoadData(index, (ulong *)CanTransmitbuf);// װ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CAN_vLoadData(index, (ulong *)CanTransmitbuf);// 装载数据
CAN_vTransmit(index); CAN_vTransmit(index);
} }
typedef enum { typedef enum {
STT_INIT_LIGHT, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD>ʼ״̬ STT_INIT_LIGHT, // 进入保持的初始状态
STT_STABLE, // <EFBFBD>ȶ<EFBFBD>̬ STT_STABLE, // 稳定态
STT_BLINK_CHECK, // <EFBFBD><EFBFBD>˸<EFBFBD><EFBFBD><EFBFBD><EFBFBD> STT_BLINK_CHECK, // 闪烁检测
STT_BLINKING // <EFBFBD><EFBFBD>˸<EFBFBD><EFBFBD><EFBFBD><EFBFBD> STT_BLINKING // 闪烁确认
} BlinkState; } BlinkState;
typedef struct { typedef struct {
BlinkState current_state; BlinkState current_state;
uint8_t last_input; uint8_t last_input;
uint16_t unified_timer; // ͳһ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>[7](@ref) uint16_t unified_timer; // 统一定时器
uint8_t trans_count; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> uint8_t trans_count; // 翻转次数需要记录
uint8_t stable_type; uint8_t stable_type;
} BlinkDetector; } BlinkDetector;
BlinkDetector blink_detector = {0}; BlinkDetector blink_detector = {0};
/* LED״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͳһ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>Ż<EFBFBD><EFBFBD> /* LED状态检测函数(状态机+统一定时器优化版)
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> * 参数:
* ctx - ״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>豣֤<EFBFBD>ǿգ<EFBFBD> * ctx - 状态机上下文指针(需保证非空)
* current_input- <EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><EFBFBD>0:<3A><> 1:<3A><><EFBFBD><EFBFBD> * current_input- 当前输入电平0:低 1:高)
* output - <EFBFBD><EFBFBD><EFBFBD><EFBFBD>״ָ̬<EFBFBD>루0:<3A><>Ч 1:<3A>ȶ<EFBFBD><C8B6><EFBFBD> 2:<3A>ȶ<EFBFBD><C8B6><EFBFBD> 3:<3A><>˸<EFBFBD><CBB8> * output - 输出状态指示0:无效 1:稳定高 2:稳定低 3:闪烁)
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> * 原理:
* 1. <EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD>[8](@ref) * 1. 统一定时器替代原多计时器
* 2. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[1](@ref) * 2. 简化状态转移逻辑
* 3. ״̬Ǩ<EFBFBD><EFBFBD>ԭ<EFBFBD>Ӳ<EFBFBD><EFBFBD><EFBFBD>[9](@ref) * 3. 状态迁移原子操作
*/ */
void detectLedState(BlinkDetector* ctx, uint8_t current_input, uint8_t* output) void detectLedState(BlinkDetector* ctx, uint8_t current_input, uint8_t* output)
{ {
@@ -157,13 +153,13 @@ void detectLedState(BlinkDetector* ctx, uint8_t current_input, uint8_t* output)
switch(ctx->current_state) switch(ctx->current_state)
{ {
/* <EFBFBD>ؼ<EFBFBD><EFBFBD><EFBFBD>ʼ״̬<EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD><EFBFBD>״<EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */ /* 关键初始状态:确保首次状态正确建立 */
case STT_INIT_LIGHT: case STT_INIT_LIGHT:
{ {
ctx->last_input = current_input; // ǿ<EFBFBD>Ƽ<EFBFBD>¼<EFBFBD><EFBFBD>ʼֵ ctx->last_input = current_input; // 强制记录初始值
ctx->stable_type = current_input ? 1 : 2; ctx->stable_type = current_input ? 1 : 2;
ctx->current_state = STT_STABLE; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȶ<EFBFBD>̬ ctx->current_state = STT_STABLE; // 进入稳定状态
ctx->unified_timer = 0; // <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> ctx->unified_timer = 0; // 初始化计时器
*output = 0; *output = 0;
break; break;
} }
@@ -176,13 +172,13 @@ void detectLedState(BlinkDetector* ctx, uint8_t current_input, uint8_t* output)
ctx->trans_count = 1; ctx->trans_count = 1;
ctx->unified_timer = 0; ctx->unified_timer = 0;
ctx->last_input = current_input; ctx->last_input = current_input;
ctx->stable_type = current_input ? 1 : 2; // ͬ<EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD>[4](@ref) ctx->stable_type = current_input ? 1 : 2; // 同步状态变量
} }
else if(ctx->unified_timer >= STABLE_CONFIRM_TIME) else if(ctx->unified_timer >= STABLE_CONFIRM_TIME)
{ {
*output = ctx->stable_type; *output = ctx->stable_type;
ctx->unified_timer = 0; ctx->unified_timer = 0;
ctx->stable_type = current_input ? 1 : 2; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD>[10](@ref) ctx->stable_type = current_input ? 1 : 2; // 确认状态
} }
else else
{ {
@@ -191,54 +187,54 @@ void detectLedState(BlinkDetector* ctx, uint8_t current_input, uint8_t* output)
} }
break; break;
} }
/* <EFBFBD><EFBFBD>˸<EFBFBD><EFBFBD><EFBFBD><EFBFBD>̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͳ<EFBFBD>Ƶ<EFBFBD>ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */ /* 闪烁状态:时间窗口内统计电平翻转次数 */
case STT_BLINK_CHECK: case STT_BLINK_CHECK:
{ {
if(ctx->unified_timer >= BLINK_WINDOW) // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>[8](@ref) if(ctx->unified_timer >= BLINK_WINDOW) // 到达检测窗口时间
{ {
if(ctx->trans_count >= MIN_BLINKS) // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><EFBFBD>˸<EFBFBD><EFBFBD><EFBFBD><EFBFBD> if(ctx->trans_count >= MIN_BLINKS) // 达到最小闪烁次数
{ {
ctx->current_state = STT_BLINKING;// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD><EFBFBD><EFBFBD><EFBFBD>̬ ctx->current_state = STT_BLINKING;// 进入闪烁确认状态
ctx->unified_timer = 0; // <EFBFBD><EFBFBD><EFBFBD>ó<EFBFBD>ʱ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> ctx->unified_timer = 0; // 重置超时计时
} }
else // δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD><EFBFBD>ֵ else // 未达闪烁阈值
{ {
ctx->current_state = STT_STABLE; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȶ<EFBFBD>̬ ctx->current_state = STT_STABLE; // 返回稳定状态
ctx->unified_timer = 0; // <EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD>ʱ<EFBFBD><EFBFBD> ctx->unified_timer = 0; // 重置状态计时器
} }
} }
else // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><EFBFBD><EFBFBD> else // 检测期内
{ {
ctx->unified_timer++; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD>ʱ<EFBFBD>ۼ<EFBFBD> ctx->unified_timer++; // 统一计时累计
if(current_input != ctx->last_input) if(current_input != ctx->last_input)
{ {
ctx->trans_count++; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ۼ<EFBFBD> ctx->trans_count++; // 翻转次数累计
ctx->last_input = current_input; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ ctx->last_input = current_input; // 更新最后检测值
} }
} }
break; break;
} }
/* <EFBFBD><EFBFBD>˸<EFBFBD><EFBFBD><EFBFBD><EFBFBD>̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */ /* 闪烁确认状态:维持闪烁活动判断 */
case STT_BLINKING: case STT_BLINKING:
{ {
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // 检测电平变化计数
if(current_input != ctx->last_input) if(current_input != ctx->last_input)
{ {
ctx->unified_timer = 0; // <EFBFBD><EFBFBD><EFBFBD>ó<EFBFBD>ʱ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> ctx->unified_timer = 0; // 重置超时计时
ctx->last_input = current_input; ctx->last_input = current_input;
*output = 3; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˸״̬ *output = 3; // 输出当前闪烁状态
} }
else if(ctx->unified_timer >= BLINK_TIMEOUT) else if(ctx->unified_timer >= BLINK_TIMEOUT)
{ {
ctx->current_state = STT_STABLE; ctx->current_state = STT_STABLE;
ctx->stable_type = current_input ? 1 : 2; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[4](@ref) ctx->stable_type = current_input ? 1 : 2; // 更新当前稳定状态变量
ctx->unified_timer = 0; ctx->unified_timer = 0;
} }
else else
{ {
ctx->unified_timer ++; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȶ<EFBFBD>ʱ<EFBFBD>ۼƼ<EFBFBD>ʱ ctx->unified_timer ++; // 维持当前稳定时间累计计时
*output = 3; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˸״̬ *output = 3; // 输出当前闪烁状态
} }
break; break;
} }
@@ -247,7 +243,7 @@ void detectLedState(BlinkDetector* ctx, uint8_t current_input, uint8_t* output)
} }
} }
//SBUS<EFBFBD><EFBFBD>CAN<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD> //SBUSCAN数据解析
void sbusCanDecode(void) void sbusCanDecode(void)
{ {
float SBUS2CANdecodeTemp = 0.0; float SBUS2CANdecodeTemp = 0.0;
@@ -257,36 +253,18 @@ void sbusCanDecode(void)
{ {
uart2RxFlag = 0; uart2RxFlag = 0;
//ת<EFBFBD><EFBFBD> //通道0 - 直接发送原始值
SBUS2CANdecodeTemp = (float)(sbus_data.channels[0]); DF_Curvature = (int16_t)sbus_data.channels[0];
SBUS2CANdecodeTemp = (DF_ZeroValue - SBUS2CANdecodeTemp)*23;//<2F><>Ҫ<EFBFBD>һ<E4BBBB>·<EFBFBD><C2B7>ţ<EFBFBD><C5A3><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DF_Curvature = (int16_t)SBUS2CANdecodeTemp;//<2F><><EFBFBD><EFBFBD>
if( (DF_Curvature > (-50)) && (DF_Curvature < 50) ) //<2F><><EFBFBD>ӻ<EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
DF_Curvature = 0;
}
//ת<EFBFBD><EFBFBD> //通道1 - 直接发送原始值
SBUS2CANdecodeTemp = (float)(sbus_data.channels[1]); DF_Speed = (int16_t)sbus_data.channels[1];
SBUS2CANdecodeTemp = (DF_ZeroValue - SBUS2CANdecodeTemp)*2.3;//<2F><>Ҫ<EFBFBD>һ<E4BBBB>·<EFBFBD><C2B7>ţ<EFBFBD><C5A3><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DF_Speed = (int16_t)SBUS2CANdecodeTemp;//ת<><D7AA>
if( (DF_Speed > (-50)) && (DF_Speed < 50) ) //<2F><><EFBFBD>ӻ<EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
DF_Speed = 0;
}
//<2F><><EFBFBD><EFBFBD> //通道7 - 直接发送原始值
SBUS2CANdecodeTemp = (float)(sbus_data.channels[7]); DF_Reserve = (int16_t)sbus_data.channels[7];
SBUS2CANdecodeTemp = (DF_ZeroValue - SBUS2CANdecodeTemp);//<2F><>Ҫ<EFBFBD>һ<E4BBBB>·<EFBFBD><C2B7>ţ<EFBFBD><C5A3><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DF_Reserve = (int16_t)SBUS2CANdecodeTemp;//ת<><D7AA>
if( (DF_Reserve > (-50)) && (DF_Reserve < 50) ) //<2F><><EFBFBD>ӻ<EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
DF_Reserve = 0;
}
//SwA //SwA
if(sbus_data.channels[1] >= 1700)//<EFBFBD><EFBFBD><EFBFBD><EFBFBD> if(sbus_data.channels[1] >= 1700)//高位
{ {
DF_SwA = 1; DF_SwA = 1;
} }
@@ -296,35 +274,35 @@ void sbusCanDecode(void)
} }
//SwB //SwB
if(sbus_data.channels[6] >= 1700)//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> if(sbus_data.channels[6] >= 1700)//第三档
{ {
DF_SwB = 2; DF_SwB = 2;
} }
else if(sbus_data.channels[6] <= 250)//<EFBFBD>ڶ<EFBFBD><EFBFBD><EFBFBD> else if(sbus_data.channels[6] <= 250)//第二档
{ {
DF_SwB = 0; DF_SwB = 0;
} }
else//<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD> else//第一档
{ {
DF_SwB = 1; DF_SwB = 1;
} }
//SwC //SwC
if(sbus_data.channels[4] >= 1700)//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> if(sbus_data.channels[4] >= 1700)//第三档
{ {
DF_SwC = 2; DF_SwC = 2;
} }
else if(sbus_data.channels[4] <= 250)//<EFBFBD>ڶ<EFBFBD><EFBFBD><EFBFBD> else if(sbus_data.channels[4] <= 250)//第二档
{ {
DF_SwC = 0; DF_SwC = 0;
} }
else//<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD> else//第一档
{ {
DF_SwC = 1; DF_SwC = 1;
} }
//SwD //SwD
if(sbus_data.channels[5] >= 1700)//<EFBFBD><EFBFBD><EFBFBD><EFBFBD> if(sbus_data.channels[5] >= 1700)//高位
{ {
DF_SwD = 1; DF_SwD = 1;
} }
@@ -333,20 +311,20 @@ void sbusCanDecode(void)
DF_SwD = 0; DF_SwD = 0;
} }
if(0 == sbus_data.flags)//23ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ϊ0<CEAA><30>־<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> if(0 == sbus_data.flags)//23通道状态 为0标志位表示遥控器
{ {
DF_RCHSta = 1;//<EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DF_RCHSta = 1;//遥控器在线
} }
else else
{ {
DF_RCHSta = 0;//<EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DF_RCHSta = 0;//遥控器离线
} }
SBUS2CANdecodeTemp = (float)(sbus_data.channels[2]); SBUS2CANdecodeTemp = (float)(sbus_data.channels[2]);
UnRemoteControlOutput_2.bit_data.speed = (int16_t)SBUS2CANdecodeTemp;//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UnRemoteControlOutput_2.bit_data.speed = (int16_t)SBUS2CANdecodeTemp;//数据
SBUS2CANdecodeTemp = (float)(sbus_data.channels[3]); SBUS2CANdecodeTemp = (float)(sbus_data.channels[3]);
UnRemoteControlOutput_2.bit_data.curvature = (int16_t)SBUS2CANdecodeTemp;//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UnRemoteControlOutput_2.bit_data.curvature = (int16_t)SBUS2CANdecodeTemp;//数据
} }
@@ -355,7 +333,7 @@ void sbusCanDecode(void)
} }
//CAN<EFBFBD><EFBFBD><EFBFBD>ͽ<EFBFBD><EFBFBD><EFBFBD> //CAN发送接收
void CanRXTX(void) void CanRXTX(void)
{ {
stCAN_SWObj StrCanRx = {0}; stCAN_SWObj StrCanRx = {0};
@@ -397,7 +375,7 @@ void CanRXTX(void)
// UnInfCan_1.ArrData.ArrRX[1][5] = StrCanRx.ulDATAH.ubDB[3]; // UnInfCan_1.ArrData.ArrRX[1][5] = StrCanRx.ulDATAH.ubDB[3];
// CAN_vReleaseObj(DF_SwRxPwm); // CAN_vReleaseObj(DF_SwRxPwm);
//// //<EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD><EFBFBD>浽PWM<EFBFBD><EFBFBD><EFBFBD>ݽṹ<EFBFBD><EFBFBD>20181227 //// //接收到的数据保存到PWM数据结构体20181227
//// PwmH[0 ] = (ubyte)UnInfCan_1.BitData.Pwm_01; //// PwmH[0 ] = (ubyte)UnInfCan_1.BitData.Pwm_01;
//// PwmH[1 ] = (ubyte)UnInfCan_1.BitData.Pwm_02; //// PwmH[1 ] = (ubyte)UnInfCan_1.BitData.Pwm_02;
//// PwmH[2 ] = (ubyte)UnInfCan_1.BitData.Pwm_03; //// PwmH[2 ] = (ubyte)UnInfCan_1.BitData.Pwm_03;
@@ -417,7 +395,7 @@ void CanRXTX(void)
} }
//50ms<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ֡ //50ms发送一帧
if(!FlgCan_1) if(!FlgCan_1)
{ {
FlgCan_1 = 1; FlgCan_1 = 1;
@@ -430,9 +408,9 @@ void CanRXTX(void)
// UnRemoteControlOutput_2.bit_data.reserve1 = sbus_temp[1]; // UnRemoteControlOutput_2.bit_data.reserve1 = sbus_temp[1];
if( (MATCH_CMD == UnInfCan_1.ArrData.ArrRX[0][0]) || (CHANGE_CMD == UnInfCan_1.ArrData.ArrRX[0][0]) )//<EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD> if( (MATCH_CMD == UnInfCan_1.ArrData.ArrRX[0][0]) || (CHANGE_CMD == UnInfCan_1.ArrData.ArrRX[0][0]) )//对频命令或切换
{ {
if(MATCH_CMD == UnInfCan_1.ArrData.ArrRX[0][0])//<EFBFBD><EFBFBD>Ƶ if(MATCH_CMD == UnInfCan_1.ArrData.ArrRX[0][0])//对频
{ {
match_freq_time = MATCH_TIME; match_freq_time = MATCH_TIME;
} }
@@ -444,15 +422,15 @@ void CanRXTX(void)
switch(match_freq_sta) switch(match_freq_sta)
{ {
case 0: case 0:
if(match_freq_cnt >= match_freq_time)//ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD> if(match_freq_cnt >= match_freq_time)//时间到了就发送确认
{ {
SwOut01 = 0;//ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ SwOut01 = 0;//取消对频
match_freq_sta = 1; match_freq_sta = 1;
match_freq_cnt = 0; match_freq_cnt = 0;
} }
else else
{ {
SwOut01 = 1;//<EFBFBD><EFBFBD>Ƶָ<EFBFBD><EFBFBD> SwOut01 = 1;//对频指令
match_freq_sta = 0; match_freq_sta = 0;
match_freq_cnt ++; match_freq_cnt ++;
} }
@@ -461,14 +439,14 @@ void CanRXTX(void)
case 1: case 1:
if(match_freq_cnt >= MATCH_WAIT_TIME)// if(match_freq_cnt >= MATCH_WAIT_TIME)//
{ {
SwOut01 = 0;//ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ SwOut01 = 0;//取消对频
match_freq_sta = 0; match_freq_sta = 0;
match_freq_cnt = 0; match_freq_cnt = 0;
UnInfCan_1.ArrData.ArrRX[0][0] = 0; UnInfCan_1.ArrData.ArrRX[0][0] = 0;
} }
else else
{ {
SwOut01 = 0;//<EFBFBD><EFBFBD>Ƶָ<EFBFBD><EFBFBD> SwOut01 = 0;//对频指令
match_freq_sta = 1; match_freq_sta = 1;
match_freq_cnt ++; match_freq_cnt ++;
} }
@@ -481,7 +459,7 @@ void CanRXTX(void)
CanTransmit(DF_SwTx1,(ubyte *)&UnRemoteControlOutput_2.arr[0]); CanTransmit(DF_SwTx1,(ubyte *)&UnRemoteControlOutput_2.arr[0]);
} }
if( (0x40 == can_error_cnt) || (0x80 == can_error_cnt) )//20250625<EFBFBD>ж<EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD><EFBFBD><EFBFBD> if( (0x40 == can_error_cnt) || (0x80 == can_error_cnt) )//20250625判断是否发生总线错误
{ {
can_error_flg = can_error_cnt; can_error_flg = can_error_cnt;
CAN_vInit(); CAN_vInit();
@@ -491,18 +469,3 @@ void CanRXTX(void)
} }

69
user.H
View File

@@ -2,19 +2,19 @@
#define _user_H_ #define _user_H_
#define SAMPLE_INTERVAL 50 // 50ms<6D><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> #define SAMPLE_INTERVAL 50 // 50ms<6D><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define BLINK_TIMEOUT (1000 / SAMPLE_INTERVAL) // 1<><31><EFBFBD>ȶ<EFBFBD>ȷ<EFBFBD><C8B7> #define BLINK_TIMEOUT (1000 / SAMPLE_INTERVAL) // 1<><31><EFBFBD>ȶ<EFBFBD>ȷ<EFBFBD><C8B7>
#define BLINK_WINDOW (1000 / SAMPLE_INTERVAL) // 1<><31><EFBFBD><EFBFBD>˸<EFBFBD><CBB8><EFBFBD><EFBFBD><EFBFBD> #define BLINK_WINDOW (1000 / SAMPLE_INTERVAL) // 1<><31><EFBFBD><EFBFBD>˸<EFBFBD><CBB8><EFBFBD><E2B4B0>
#define STABLE_CONFIRM_TIME (1000 / SAMPLE_INTERVAL) // 1<><31><EFBFBD><EFBFBD>˸<EFBFBD><CBB8><EFBFBD><EFBFBD><EFBFBD> #define STABLE_CONFIRM_TIME (1000 / SAMPLE_INTERVAL) // 1<><31><EFBFBD><EFBFBD>˸<EFBFBD><CBB8><EFBFBD><E2B4B0>
#define MIN_BLINKS 2 #define MIN_BLINKS 2
#define MATCH_TIME (2000 / SAMPLE_INTERVAL)//<2F><>Ƶʱ<C6B5><CAB1> #define MATCH_TIME (2000 / SAMPLE_INTERVAL)//<2F><>Ƶʱ<C6B5><CAB1>
#define MATCH_WAIT_TIME (1000 / SAMPLE_INTERVAL)//<2F><>Ƶ<EFBFBD><EFBFBD>ȴ<EFBFBD>ʱ<EFBFBD><CAB1> #define MATCH_WAIT_TIME (1000 / SAMPLE_INTERVAL)//<2F><>Ƶ<EFBFBD><EFBFBD>ȴ<EFBFBD>ʱ<EFBFBD><CAB1>
#define CHANGE_TIME (200 / SAMPLE_INTERVAL)//<2F><>Ƶʱ<C6B5><CAB1> #define CHANGE_TIME (200 / SAMPLE_INTERVAL)//<2F><>Ƶʱ<C6B5><CAB1>
#define MATCH_CMD 0xDB//<2F><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD> #define MATCH_CMD 0xDB//<2F><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>
#define CHANGE_CMD 0xBD//<2F>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD> #define CHANGE_CMD 0xBD//<2F>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD>
#define uint32_t ulong #define uint32_t ulong
@@ -64,25 +64,25 @@
#define dfOut_15 SwOut11 //KGF15 #define dfOut_15 SwOut11 //KGF15
#define dfOut_16 SwOut12 //KGF16 #define dfOut_16 SwOut12 //KGF16
#define dfPwmH 10 //PWM<57><4D>???<3F><>???<3F><><EFBFBD><EFBFBD>??<3F><>?10<31><30>?10ms<6D><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>???<3F><>?D<><44><EFBFBD><EFBFBD>a2a<32><61>?20181227 #define dfPwmH 10 //PWM<57><4D>???<3F><>???<3F><><EFBFBD><EFBFBD>??<3F><>?10<31><30>?10ms<6D><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>???<3F><>?D<><44><EFBFBD><EFBFBD>a2a<32><61>?20181227
#define DF_ZeroValue 1000//?<3F><>?Y<><59><EFBFBD><EFBFBD>???<3F>¡<EFBFBD>???0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>y?Y?a1022 #define DF_ZeroValue 1000//?<3F><>?Y<><59><EFBFBD><EFBFBD>???<3F>¡<EFBFBD>???0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>y?Y?a1022
#define DF_Speed UnRemoteControlOutput_1.bit_data.speed//?<3F><>?<3F><> #define DF_Speed UnRemoteControlOutput_1.bit_data.speed//?<3F><>?<3F><>
#define DF_Curvature UnRemoteControlOutput_1.bit_data.curvature//<2F><>a<EFBFBD><61>? #define DF_Curvature UnRemoteControlOutput_1.bit_data.curvature//<2F><>a<EFBFBD><61>?
#define DF_Reserve UnRemoteControlOutput_1.bit_data.reserve1//<2F><><EFBFBD>ꨢ? #define DF_Reserve UnRemoteControlOutput_1.bit_data.reserve1//<2F><><EFBFBD>ꨢ?
#define DF_SwA UnRemoteControlOutput_1.bit_data.switch_a//DF_SwA #define DF_SwA UnRemoteControlOutput_1.bit_data.switch_a//DF_SwA
#define DF_SwB UnRemoteControlOutput_1.bit_data.switch_b//DF_SwB #define DF_SwB UnRemoteControlOutput_1.bit_data.switch_b//DF_SwB
#define DF_SwC UnRemoteControlOutput_1.bit_data.switch_c//DF_SwC #define DF_SwC UnRemoteControlOutput_1.bit_data.switch_c//DF_SwC
#define DF_SwD UnRemoteControlOutput_1.bit_data.switch_d//DF_SwD #define DF_SwD UnRemoteControlOutput_1.bit_data.switch_d//DF_SwD
#define DF_RCHSta UnRemoteControlOutput_1.bit_data.enable//<2F><>?<3F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1?<3F><><EFBFBD><EFBFBD><EFBFBD>䨬? #define DF_RCHSta UnRemoteControlOutput_1.bit_data.enable//<2F><>?<3F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1?<3F><><EFBFBD><EFBFBD><EFBFBD>䨬?
//#define DF_RCHEmSwSta UnRCH_1.BitData.RCHBit07//?<3F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?a1?<3F><><EFBFBD>䨬?<3F><>1?<3F><><EFBFBD><EFBFBD><EFBFBD>䨬? //#define DF_RCHEmSwSta UnRCH_1.BitData.RCHBit07//?<3F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?a1?<3F><><EFBFBD>䨬?<3F><>1?<3F><><EFBFBD><EFBFBD><EFBFBD>䨬?
@@ -98,10 +98,10 @@
// ?<3F><><EFBFBD><EFBFBD>?2<><32>3?<3F><>??<3F><> SBus ?a???<3F><>11<31><31>? // ?<3F><><EFBFBD><EFBFBD>?2<><32>3?<3F><>??<3F><> SBus ?a???<3F><>11<31><31>?
typedef struct { typedef struct {
uint16_t channels[16]; // <20><>?<3F><><EFBFBD><EFBFBD>16??<3F><><EFBFBD><EFBFBD><EFBFBD>̨<EFBFBD><CCA8><EFBFBD>??a???<3F><>1? uint16_t channels[16]; // <20><>?<3F><><EFBFBD>16??<3F><><EFBFBD><EFBFBD><EFBFBD>̨<EFBFBD><CCA8><EFBFBD>??a???<3F><>1?
uint8_t flags; // <20><><EFBFBD><EFBFBD>??<3F><>??<3F><> uint8_t flags; // <20><><EFBFBD><EFBFBD>??<3F><>??<3F><>
} SBusData; } SBusData;
@@ -109,30 +109,30 @@ typedef struct {
// ?<3F><><EFBFBD><EFBFBD>?<3F><><EFBFBD><EFBFBD>???<3F>¨<EFBFBD>?<3F><>? // ?<3F><><EFBFBD><EFBFBD>?<3F><><EFBFBD><EFBFBD>???<3F>¨<EFBFBD>?<3F><>?
typedef struct _StrRemoteControlOutput typedef struct _StrRemoteControlOutput
{ {
//-----<2D><><EFBFBD><EFBFBD>?<3F><><EFBFBD><EFBFBD>y?Y0x12000023---------------------------------------------- //-----<2D><><EFBFBD><EFBFBD>?<3F><><EFBFBD><EFBFBD>y?Y0x12000023----------------------------------------------
signed int speed : 16; // ?<3F><>?<3F><> signed int speed : 16; // ?<3F><>?<3F><>
signed int curvature : 16; // ?<3F><>?<3F><> signed int curvature : 16; // ?<3F><>?<3F><>
unsigned int reserve1 : 16; // <20><><EFBFBD><EFBFBD>???<3F><> unsigned int reserve1 : 16; // <20><><EFBFBD><EFBFBD>???<3F><>
unsigned int switch_a : 1; // SwA unsigned int switch_a : 1; // SwA
unsigned int switch_b : 2; // SwB ?<3F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?a1? 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? 0/2<><32>??<3F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> unsigned int switch_b : 2; // SwB ?<3F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?a1? 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? 0/2<><32>??<3F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
unsigned int switch_c : 2; // SwC ?<3F>꨺??a1? 1<><31>??<3F><> 0/2<><32>?<3F><>??<3F><> unsigned int switch_c : 2; // SwC ?<3F>꨺??a1? 1<><31>??<3F><> 0/2<><32>?<3F><>??<3F><>
unsigned int switch_d : 1; // SwD <20><>?<3F><>??a1? ?<3F><>?<3F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<3F><>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD> unsigned int switch_d : 1; // SwD <20><>?<3F><>??a1? ?<3F><>?<3F><><EFBFBD><EFBFBD><EFBFBD>?<3F><>3<EFBFBD><33><EFBFBD><EFBFBD>
unsigned int reserve2 : 1; // <20><><EFBFBD>ꨢ? unsigned int reserve2 : 1; // <20><><EFBFBD>ꨢ?
unsigned int reserve3 : 1; // <20><><EFBFBD>ꨢ? unsigned int reserve3 : 1; // <20><><EFBFBD>ꨢ?
unsigned int enable : 8; // <20><>1?<3F><> unsigned int enable : 8; // <20><>1?<3F><>
} StrRemoteControlInput; } StrRemoteControlInput;
typedef union _UnRemoteControlInput typedef union _UnRemoteControlInput
{ {
StrRemoteControlInput bit_data; // <20><>1<EFBFBD><31>??<3F><><EFBFBD><EFBFBD>?<3F><>??<3F><>11<31><31>?<3F><>?<3F><>??? StrRemoteControlInput bit_data; // <20><>1<EFBFBD><31>??<3F><><EFBFBD><EFBFBD>?<3F><>??<3F><>11<31><31>?<3F><>?<3F><>???
uint8_t arr[sizeof(StrRemoteControlInput)]; // <20><><EFBFBD><EFBFBD>1y?<3F><>11<31><31>?<3F><><EFBFBD><EFBFBD>D<EFBFBD><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<3F><><EFBFBD>䨮D? uint8_t arr[sizeof(StrRemoteControlInput)]; // <20><><EFBFBD><EFBFBD>1y?<3F><>11<31><31>?<3F><><EFBFBD><EFBFBD>D<EFBFBD><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<3F><><EFBFBD>䨮D?
} UnRemoteControlOutput; } UnRemoteControlOutput;
@@ -141,7 +141,7 @@ typedef union _UnRemoteControlInput
//---<2D><>a2?<3F><>a<EFBFBD><61>1<EFBFBD><31>?<3F><>?<3F><>?<3F><><EFBFBD><EFBFBD>?<3F><>--------------------------------------------------------------------- //---<2D><>a2?<3F><>a<EFBFBD><61>1<EFBFBD><31>?<3F><>?<3F><>?<3F><><EFBFBD><EFBFBD>?<3F><>---------------------------------------------------------------------
extern UnSwOut UnSwOut_1; extern UnSwOut UnSwOut_1;
extern UnInfCan UnInfCan_1; extern UnInfCan UnInfCan_1;
extern uword CntCan_1; extern uword CntCan_1;
@@ -150,7 +150,8 @@ extern bit FlgCan_1;
extern ubyte rxbuf[25]; extern ubyte rxbuf[25];
extern ubyte uart2RxFlag; extern ubyte uart2RxFlag;
extern ubyte can_error_cnt; extern ubyte can_error_cnt;
extern ubyte RestartDataFlg1;
extern ubyte RestartDataFlg2;
void CanRXTX(void); void CanRXTX(void);
void SwSample(void); void SwSample(void);