增加重启以及修改接收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
/// order (like class 1)
/// - 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_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
/// order (like class 1)
/// - 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_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;
// 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
while(1)
@@ -243,6 +243,8 @@ void main(void)
WDT_vRefresh();
// LedDr();
BootMain();
RestartDataFlg1 = 0x55;
RestartDataFlg2 = 0x55;
// tmp[1] = (ubyte)CntCan_1;
// tmp[0] = (ubyte)(CntCan_1>>8);
// CAN_vLoadData(0x2, (ulong *)(tmp)); // Add this Line

View File

@@ -314,6 +314,21 @@ ENDIF
RSEG ?C_C51STARTUP
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)
; switch to external XTAL

209
User.c
View File

@@ -1,43 +1,45 @@
#include "MAIN.H"
//can<EFBFBD><EFBFBD>Ϣ
//can消息
UnInfCan UnInfCan_1 = {0};
UnSwSample UnSwSample_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_2 = {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};//遥控器数据发送
SBusData sbus_data;
//CAN<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//CAN发送计数
uword CntCan_1 = 0;
bit FlgCan_1 = 0;
//<EFBFBD><EFBFBD>һ<EFBFBD>βɼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָʾ
//第一次采集数据有效标志
bit FlgOneTime = 0;
ubyte uart2RxFlag = 0;
uword RgCanPerid = 50;
ubyte can_error_cnt = 0;
ubyte can_error_flg = 0;
ubyte RestartDataFlg1 _at_ 0xF5E7;
ubyte RestartDataFlg2 _at_ 0xF600;
//PWM 20181227
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)
{
//************************************************************************
//////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;}
//************************************************************************
}
// SBus <EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// SBus 数据解析函数
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[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;
@@ -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[15] = (input_data[21] >> 5 | input_data[22] << 3) & 0x07FF;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD>ֽ<EFBFBD>
// 解析标志字节
sbus_data.flags = input_data[23];
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;
}
//can<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//can错误处理
void CanErrorProcess(void)
{
ubyte ubNSRL;
@@ -119,37 +115,37 @@ void CanTransmit(ubyte index,ubyte *buf)
CanTransmitbuf[4] = buf[6];
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_vLoadData(index, (ulong *)CanTransmitbuf);// װ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CAN_waitTransmit(index);//发送前等待上一帧发送完,不然会丢帧
CAN_vLoadData(index, (ulong *)CanTransmitbuf);// 装载数据
CAN_vTransmit(index);
}
typedef enum {
STT_INIT_LIGHT, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD>ʼ״̬
STT_STABLE, // <EFBFBD>ȶ<EFBFBD>̬
STT_BLINK_CHECK, // <EFBFBD><EFBFBD>˸<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
STT_BLINKING // <EFBFBD><EFBFBD>˸<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
STT_INIT_LIGHT, // 进入保持的初始状态
STT_STABLE, // 稳定态
STT_BLINK_CHECK, // 闪烁检测
STT_BLINKING // 闪烁确认
} BlinkState;
typedef struct {
BlinkState current_state;
uint8_t last_input;
uint16_t unified_timer; // ͳһ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>[7](@ref)
uint8_t trans_count; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint16_t unified_timer; // 统一定时器
uint8_t trans_count; // 翻转次数需要记录
uint8_t stable_type;
} BlinkDetector;
BlinkDetector blink_detector = {0};
/* LED״̬<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>
* ctx - ״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>豣֤<EFBFBD>ǿգ<EFBFBD>
* current_input- <EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><EFBFBD>0:<3A><> 1:<3A><><EFBFBD><EFBFBD>
* output - <EFBFBD><EFBFBD><EFBFBD><EFBFBD>״ָ̬<EFBFBD>루0:<3A><>Ч 1:<3A>ȶ<EFBFBD><C8B6><EFBFBD> 2:<3A>ȶ<EFBFBD><C8B6><EFBFBD> 3:<3A><>˸<EFBFBD><CBB8>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* 1. <EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD>[8](@ref)
* 2. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[1](@ref)
* 3. ״̬Ǩ<EFBFBD><EFBFBD>ԭ<EFBFBD>Ӳ<EFBFBD><EFBFBD><EFBFBD>[9](@ref)
/* LED状态检测函数(状态机+统一定时器优化版)
* 参数:
* ctx - 状态机上下文指针(需保证非空)
* current_input- 当前输入电平0:低 1:高)
* output - 输出状态指示0:无效 1:稳定高 2:稳定低 3:闪烁)
* 原理:
* 1. 统一定时器替代原多计时器
* 2. 简化状态转移逻辑
* 3. 状态迁移原子操作
*/
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)
{
/* <EFBFBD>ؼ<EFBFBD><EFBFBD><EFBFBD>ʼ״̬<EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD><EFBFBD>״<EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
/* 关键初始状态:确保首次状态正确建立 */
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->current_state = STT_STABLE; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȶ<EFBFBD>̬
ctx->unified_timer = 0; // <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>
ctx->current_state = STT_STABLE; // 进入稳定状态
ctx->unified_timer = 0; // 初始化计时器
*output = 0;
break;
}
@@ -176,13 +172,13 @@ void detectLedState(BlinkDetector* ctx, uint8_t current_input, uint8_t* output)
ctx->trans_count = 1;
ctx->unified_timer = 0;
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)
{
*output = ctx->stable_type;
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
{
@@ -191,54 +187,54 @@ void detectLedState(BlinkDetector* ctx, uint8_t current_input, uint8_t* output)
}
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:
{
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->unified_timer = 0; // <EFBFBD><EFBFBD><EFBFBD>ó<EFBFBD>ʱ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>
ctx->current_state = STT_BLINKING;// 进入闪烁确认状态
ctx->unified_timer = 0; // 重置超时计时
}
else // δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD><EFBFBD>ֵ
else // 未达闪烁阈值
{
ctx->current_state = STT_STABLE; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȶ<EFBFBD>̬
ctx->unified_timer = 0; // <EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD>ʱ<EFBFBD><EFBFBD>
ctx->current_state = STT_STABLE; // 返回稳定状态
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)
{
ctx->trans_count++; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ۼ<EFBFBD>
ctx->last_input = current_input; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
ctx->trans_count++; // 翻转次数累计
ctx->last_input = current_input; // 更新最后检测值
}
}
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:
{
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 检测电平变化计数
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;
*output = 3; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˸״̬
*output = 3; // 输出当前闪烁状态
}
else if(ctx->unified_timer >= BLINK_TIMEOUT)
{
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;
}
else
{
ctx->unified_timer ++; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȶ<EFBFBD>ʱ<EFBFBD>ۼƼ<EFBFBD>ʱ
*output = 3; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˸״̬
ctx->unified_timer ++; // 维持当前稳定时间累计计时
*output = 3; // 输出当前闪烁状态
}
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)
{
float SBUS2CANdecodeTemp = 0.0;
@@ -257,36 +253,18 @@ void sbusCanDecode(void)
{
uart2RxFlag = 0;
//ת<EFBFBD><EFBFBD>
SBUS2CANdecodeTemp = (float)(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;
}
//通道0 - 直接发送原始值
DF_Curvature = (int16_t)sbus_data.channels[0];
//ת<EFBFBD><EFBFBD>
SBUS2CANdecodeTemp = (float)(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;
}
//通道1 - 直接发送原始值
DF_Speed = (int16_t)sbus_data.channels[1];
//<2F><><EFBFBD><EFBFBD>
SBUS2CANdecodeTemp = (float)(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;
}
//通道7 - 直接发送原始值
DF_Reserve = (int16_t)sbus_data.channels[7];
//SwA
if(sbus_data.channels[1] >= 1700)//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(sbus_data.channels[1] >= 1700)//高位
{
DF_SwA = 1;
}
@@ -296,35 +274,35 @@ void sbusCanDecode(void)
}
//SwB
if(sbus_data.channels[6] >= 1700)//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(sbus_data.channels[6] >= 1700)//第三档
{
DF_SwB = 2;
}
else if(sbus_data.channels[6] <= 250)//<EFBFBD>ڶ<EFBFBD><EFBFBD><EFBFBD>
else if(sbus_data.channels[6] <= 250)//第二档
{
DF_SwB = 0;
}
else//<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>
else//第一档
{
DF_SwB = 1;
}
//SwC
if(sbus_data.channels[4] >= 1700)//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(sbus_data.channels[4] >= 1700)//第三档
{
DF_SwC = 2;
}
else if(sbus_data.channels[4] <= 250)//<EFBFBD>ڶ<EFBFBD><EFBFBD><EFBFBD>
else if(sbus_data.channels[4] <= 250)//第二档
{
DF_SwC = 0;
}
else//<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>
else//第一档
{
DF_SwC = 1;
}
//SwD
if(sbus_data.channels[5] >= 1700)//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(sbus_data.channels[5] >= 1700)//高位
{
DF_SwD = 1;
}
@@ -333,20 +311,20 @@ void sbusCanDecode(void)
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
{
DF_RCHSta = 0;//<EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DF_RCHSta = 0;//遥控器离线
}
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]);
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)
{
stCAN_SWObj StrCanRx = {0};
@@ -397,7 +375,7 @@ void CanRXTX(void)
// UnInfCan_1.ArrData.ArrRX[1][5] = StrCanRx.ulDATAH.ubDB[3];
// 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[1 ] = (ubyte)UnInfCan_1.BitData.Pwm_02;
//// PwmH[2 ] = (ubyte)UnInfCan_1.BitData.Pwm_03;
@@ -417,7 +395,7 @@ void CanRXTX(void)
}
//50ms<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ֡
//50ms发送一帧
if(!FlgCan_1)
{
FlgCan_1 = 1;
@@ -430,9 +408,9 @@ void CanRXTX(void)
// 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;
}
@@ -444,15 +422,15 @@ void CanRXTX(void)
switch(match_freq_sta)
{
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_cnt = 0;
}
else
{
SwOut01 = 1;//<EFBFBD><EFBFBD>Ƶָ<EFBFBD><EFBFBD>
SwOut01 = 1;//对频指令
match_freq_sta = 0;
match_freq_cnt ++;
}
@@ -461,14 +439,14 @@ void CanRXTX(void)
case 1:
if(match_freq_cnt >= MATCH_WAIT_TIME)//
{
SwOut01 = 0;//ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ
SwOut01 = 0;//取消对频
match_freq_sta = 0;
match_freq_cnt = 0;
UnInfCan_1.ArrData.ArrRX[0][0] = 0;
}
else
{
SwOut01 = 0;//<EFBFBD><EFBFBD>Ƶָ<EFBFBD><EFBFBD>
SwOut01 = 0;//对频指令
match_freq_sta = 1;
match_freq_cnt ++;
}
@@ -481,7 +459,7 @@ void CanRXTX(void)
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_vInit();
@@ -491,18 +469,3 @@ void CanRXTX(void)
}

69
user.H
View File

@@ -2,19 +2,19 @@
#define _user_H_
#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_WINDOW (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><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_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><E2B4B0>
#define MIN_BLINKS 2
#define MATCH_TIME (2000 / SAMPLE_INTERVAL)//<2F><>Ƶʱ<C6B5><CAB1>
#define MATCH_WAIT_TIME (1000 / SAMPLE_INTERVAL)//<2F><>Ƶ<EFBFBD><EFBFBD>ȴ<EFBFBD>ʱ<EFBFBD><CAB1>
#define MATCH_TIME (2000 / SAMPLE_INTERVAL)//<2F><>Ƶʱ<C6B5><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 CHANGE_CMD 0xBD//<2F>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD>
#define MATCH_CMD 0xDB//<2F><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>
#define CHANGE_CMD 0xBD//<2F>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD>
#define uint32_t ulong
@@ -64,25 +64,25 @@
#define dfOut_15 SwOut11 //KGF15
#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_Curvature UnRemoteControlOutput_1.bit_data.curvature//<2F><>a<EFBFBD><61>?
#define DF_Reserve UnRemoteControlOutput_1.bit_data.reserve1//<2F><><EFBFBD>ꨢ?
#define DF_Speed UnRemoteControlOutput_1.bit_data.speed//?<3F><>?<3F><>
#define DF_Curvature UnRemoteControlOutput_1.bit_data.curvature//<2F><>a<EFBFBD><61>?
#define DF_Reserve UnRemoteControlOutput_1.bit_data.reserve1//<2F><><EFBFBD>ꨢ?
#define DF_SwA UnRemoteControlOutput_1.bit_data.switch_a//DF_SwA
#define DF_SwB UnRemoteControlOutput_1.bit_data.switch_b//DF_SwB
#define DF_SwC UnRemoteControlOutput_1.bit_data.switch_c//DF_SwC
#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 {
uint16_t channels[16]; // <20><>?<3F><><EFBFBD><EFBFBD>16??<3F><><EFBFBD><EFBFBD><EFBFBD>̨<EFBFBD><CCA8><EFBFBD>??a???<3F><>1?
uint8_t flags; // <20><><EFBFBD><EFBFBD>??<3F><>??<3F><>
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><>
} 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
{
//-----<2D><><EFBFBD><EFBFBD>?<3F><><EFBFBD><EFBFBD>y?Y0x12000023----------------------------------------------
signed int speed : 16; // ?<3F><>?<3F><>
signed int curvature : 16; // ?<3F><>?<3F><>
//-----<2D><><EFBFBD><EFBFBD>?<3F><><EFBFBD><EFBFBD>y?Y0x12000023----------------------------------------------
signed int speed : 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_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_d : 1; // SwD <20><>?<3F><>??a1? ?<3F><>?<3F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<3F><>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
unsigned int reserve2 : 1; // <20><><EFBFBD>ꨢ?
unsigned int reserve3 : 1; // <20><><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_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 reserve3 : 1; // <20><><EFBFBD>ꨢ?
unsigned int enable : 8; // <20><>1?<3F><>
unsigned int enable : 8; // <20><>1?<3F><>
} StrRemoteControlInput;
typedef union _UnRemoteControlInput
{
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?
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?
} 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 UnInfCan UnInfCan_1;
extern uword CntCan_1;
@@ -150,7 +150,8 @@ extern bit FlgCan_1;
extern ubyte rxbuf[25];
extern ubyte uart2RxFlag;
extern ubyte can_error_cnt;
extern ubyte RestartDataFlg1;
extern ubyte RestartDataFlg2;
void CanRXTX(void);
void SwSample(void);