feat: 按DLD154Pro硬件资源文档调整代码

变更摘要:
- LED.h: PB15→PB22(LEDA绿)+PB23(LEDB红呼吸灯)
- cmcng.h: 型号DLD110S→DLD154Pro, 版本v4.01/hw1.00
- peripheral.c: BLE广播名/设备名→DLD154Pro
- peripheral_main.c: 删RLY2/KEY_SA1_SA2/FLEVEL_L/DEBUG_UART
- peripheral_main.c: 新增RS485预留(PA14/15/13)+光耦预留(PB10)
- peripheral_main.c: 简化继电器为单路(PA8), 一级调频(PA12)
- peripheral_main.c: 删poll_sens_key(), g_freq_sens默认值=2
- IDE工程文件: DLD110S→DLD154Pro
This commit is contained in:
wangfq
2026-07-21 10:43:45 +08:00
parent 5f5f697992
commit 91ba84495d
6 changed files with 104 additions and 189 deletions
@@ -12,17 +12,21 @@
#include <stdint.h>
#define PRODUCT_MODEL "DLD110S"
#define FIRMWARE_VER "4.30"
#define HARDWARE_VER "4.01"
#define FIRMWARE_VER_MAIN 4
#define FIRMWARE_VER_SUB 30
#define HARDWARE_VER_MAIN 4
#define HARDWARE_VER_SUB 1
/*********************************************************************
* GLOBAL TYPEDEFS
*/
/* 功能模å¼ä½? (direction_mode é«?4ä½?, åè®®ä¿ç•™; 新算法ä¸å†æ¶ˆè´?) */
#define FUNCTION_A 0x01 // 二次判断 (已废�)
#define FUNCTION_B 0x02 // 二次判断增强æ¡ä»¶åˆ¤æ–­ (已废å¼?)
#define PRODUCT_MODEL "DLD154Pro"
#define FIRMWARE_VER "4.01"
#define HARDWARE_VER "1.00"
#define FIRMWARE_VER_MAIN 4
#define FIRMWARE_VER_SUB 1
#define HARDWARE_VER_MAIN 1
#define HARDWARE_VER_SUB 0
/* 功能模式? (direction_mode ?4?, 协议保留; 新算法不再消?) */
#define FUNCTION_A 0x01 // 二次判断 (已废?)
#define FUNCTION_B 0x02 // 二次判断增强条件判断 (已废?)
#define FUNCTION_C 0x04 //
#define FUNCTION_D 0x08 //
@@ -38,9 +42,9 @@ extern uint8_t g_loop_power_up_state;
extern uint8_t g_function_mode;
/* 新算法状æ€? (DLD154V4B ç§»æ¤) */
extern uint8_t g_loop_stable; // ç¨³å®šæœŸç»“æŸæ ‡å¿? (0=æ”¶æ•›ä¸?, 1=稳定)
extern uint8_t g_env_activity; // 环境活跃åº? (BLE condition å­—æ®µæ¥æº)
/* 新算法状? (DLD154V4B 移植) */
extern uint8_t g_loop_stable; // 稳定期结束标? (0=收敛?, 1=稳定)
extern uint8_t g_env_activity; // 环境活跃? (BLE condition 字段来源)
uint32_t mstick(void);
@@ -102,7 +102,7 @@ static uint8_t scanRspData[] = {
// 'r',
// 'a',
// 'l',
'D','L','D','1','1','0','S',
'D','L','D','1','5','4','P',
// connection interval range
0x05, // length of this data
GAP_ADTYPE_SLAVE_CONN_INTERVAL_RANGE,
@@ -136,7 +136,7 @@ static uint8_t advertData[] = {
};
// GAP GATT Attributes
static uint8_t attDeviceName[GAP_DEVICE_NAME_LEN] = "DLD110S";// "Simple Peripheral";
static uint8_t attDeviceName[GAP_DEVICE_NAME_LEN] = "DLD154Pro";// "Simple Peripheral";
// Connection item list
static peripheralConnItem_t peripheralConnList;
@@ -3,7 +3,7 @@
* Author : WCH / wangfq
* Version : V2.0 (algorithm ported from DLD154V4B)
* Date : 2026/07/18
* Description : DLD110SV4 单线圈蓝牙车检器 主函数
* Description : DLD154Pro 单线圈蓝牙车检器 主函数
*
* 算法说明 (移植自 DLD154V4B TaskLoop V2.0, M1H 精简系):
* - 自适应测量窗: LPCNT = MEASUREMENT_BASE / Xn, 测量窗时长与线圈频率无关
@@ -31,25 +31,43 @@
uint8_t g_flag_bt_state = 0; // 0 蓝牙没有连接,1 有蓝牙连接
uint8_t g_flag_output = 0;
uint32_t g_xn_counter = 0;
uint8_t g_function_mode = 0;
uint32_t g_sys_freq = 0;
/*===========================================================================
* IO 宏定义 -- DLD154Pro 硬件资源
*
* PA8 : RLY1 存在继电器 (单刀双掷, 低电平有效)
* PB22 : LEDA 绿色指示灯 (有车亮/无车灭, 低电平有效)
* PB23 : LEDB 红色指示灯 (呼吸灯, 低电平有效)
* PA12 : FLEVEL 线圈调频 (一级, 0=33nF, 1=0nF)
* PA14 : UART0_Tx RS485发送 (协议待定)
* PA15 : UART0_Rx RS485接收 (协议待定)
* PA13 : UART0_RE RS485方向控制 (协议待定)
* PB10 : IN_1 光耦输入 (逻辑待定)
*===========================================================================*/
#define RLY1_ON (R32_PA_OUT |= BV(8))
#define RLY1_OFF (R32_PA_OUT &= ~BV(8))
#define RLY2_ON (R32_PB_OUT |= BV(23))
#define RLY2_OFF (R32_PB_OUT &= ~BV(23))
#define LEDA_ON (R32_PB_OUT &= ~BV(22))
#define LEDA_OFF (R32_PB_OUT |= BV(22))
#define LEDA_ON_OFF() (GPIOB_ReadPortPin(GPIO_Pin_22) ? GPIOB_ResetBits(GPIO_Pin_22) : GPIOB_SetBits(GPIO_Pin_22))
#define FLEVEL_H_LOW (R32_PA_OUT &= ~BV(12))
#define FLEVEL_H_HIGH (R32_PA_OUT |= BV(12))
#define FLEVEL_L_LOW (R32_PA_OUT &= ~BV(13))
#define FLEVEL_L_HIGH (R32_PA_OUT |= BV(13))
#define KEY_SA1 (GPIOA_ReadPortPin(GPIO_Pin_14))
#define KEY_SA2 (GPIOA_ReadPortPin(GPIO_Pin_15))
#define LEDB_ON (R32_PB_OUT &= ~BV(23))
#define LEDB_OFF (R32_PB_OUT |= BV(23))
#define FLEVEL_LOW (R32_PA_OUT &= ~BV(12))
#define FLEVEL_HIGH (R32_PA_OUT |= BV(12))
/* RS485 预留 (协议待定) */
#define RS485_TX_PIN GPIO_Pin_14
#define RS485_RX_PIN GPIO_Pin_15
#define RS485_RE_PIN GPIO_Pin_13
#define RS485_RE_TX (GPIOA_SetBits(RS485_RE_PIN)) // RE=1 发送模式
#define RS485_RE_RX (GPIOA_ResetBits(RS485_RE_PIN)) // RE=0 接收模式
/* 光耦输入预留 (逻辑待定) */
#define OPT_IN1 (GPIOB_ReadPortPin(GPIO_Pin_10))
const uint8_t MAX_Store_Size = 80;
uint8_t g_loop_power_up_state = 0; // 开机启动时线圈是否连接
@@ -260,40 +278,6 @@ void factory_dev(void){
}
void poll_sens_key(void)
{
static uint8_t _last_sens = 3;
#if DEBUG
g_freq_sens = 2; // 默认最高灵敏度
#else
if(KEY_SA1){
if(KEY_SA2){
g_freq_sens = 0;
}
else {
g_freq_sens = 2;
}
}
else{
if (KEY_SA2) {
g_freq_sens = 1;
}
}
#endif
if(_last_sens == 3){
_last_sens = g_freq_sens;
}
if(_last_sens != g_freq_sens){
/* 灵敏度阈值每周期由 g_loop_sens_list 实时计算, 无需重载 */
_last_sens = g_freq_sens;
}
}
void para_store_init(void)
{
uint8_t *rBuf = (uint8_t *)malloc(MAX_Store_Size);
@@ -309,8 +293,6 @@ void para_store_init(void)
memcpy(&g_loop_cng_unit, &rBuf[4], sizeof(g_loop_cng_unit));
memcpy(&g_loop_sens_list, &rBuf[Addr_Loop_Sens_List_Offset], sizeof(g_loop_sens_list));
poll_sens_key();
g_loop_out_delay = g_loop_cng_unit.delay_time * 2; // 定时器以 50ms 为单位, 延时以100ms为单位
g_hold_time = g_loop_cng_unit.exist_mode * 20 * 5; //50ms/per, period: 5s
g_safe_max_cnt = g_loop_cng_unit.loopSafe_Timeout * 10 * (1000 / 50);
@@ -321,29 +303,11 @@ void para_store_init(void)
g_freq_level = 0;
#endif
switch(g_freq_level)
{
case 0: {
// 高频
FLEVEL_H_LOW; FLEVEL_L_LOW;
} break;
case 1: {
// 中高
FLEVEL_H_LOW; FLEVEL_L_HIGH;
} break;
case 2: {
// 中低
FLEVEL_H_HIGH; FLEVEL_L_LOW;
} break;
case 3: {
// 低频
FLEVEL_H_HIGH; FLEVEL_L_HIGH;
} break;
default:{
// 默认低频
g_freq_level = 3;
FLEVEL_H_HIGH; FLEVEL_L_HIGH;
} break;
// DLD154Pro: 一级调频, 0=33nF(低频), 1=0nF(高频)
if (g_freq_level == 0) {
FLEVEL_LOW;
} else {
FLEVEL_HIGH;
}
free(rBuf);
}
@@ -381,36 +345,33 @@ void tm_init(void){
void gpio_uart_init(void)
{
/* 配置串口0:先配置IO口模式,再配置串口 */
#ifdef DEBUG
GPIOPinRemap(ENABLE, RB_PIN_UART0);
/*--- RS485 通信 (PA14=TX, PA15=RX, PA13=RE) ---*/
/* 协议待定, 仅初始化引脚, 暂不配置 UART0 */
GPIOA_SetBits(GPIO_Pin_14);
GPIOA_ModeCfg(GPIO_Pin_14, GPIO_ModeOut_PP_5mA); // TXD-配置推挽输出,注意先让IO口输出高电平
GPIOA_ModeCfg(GPIO_Pin_14, GPIO_ModeOut_PP_5mA); // RS485 TX
GPIOA_ModeCfg(GPIO_Pin_15, GPIO_ModeIN_PU); // RS485 RX
GPIOA_SetBits(GPIO_Pin_13);
GPIOA_ModeCfg(GPIO_Pin_13, GPIO_ModeOut_PP_5mA); // RS485 RE (默认接收模式)
UART0_BaudRateCfg(230400); //115200
R8_UART0_FCR = (2 << 6) | RB_FCR_TX_FIFO_CLR | RB_FCR_RX_FIFO_CLR | RB_FCR_FIFO_EN; // FIFO打开,触发点4字节
R8_UART0_LCR = RB_LCR_WORD_SZ;
R8_UART0_IER = RB_IER_TXD_EN;
R8_UART0_DIV = 1;
/*--- 光耦输入 (PB10=IN_1) ---*/
/* 逻辑待定, 仅初始化引脚为输入上拉 */
GPIOB_ModeCfg(GPIO_Pin_10, GPIO_ModeIN_PU);
GPIOA_ModeCfg(GPIO_Pin_15, GPIO_ModeIN_PU); // 拨动开关,调节灵敏度
#else
GPIOA_ModeCfg(GPIO_Pin_15|GPIO_Pin_14, GPIO_ModeIN_PU); // 拨动开关,调节灵敏度
#endif
GPIOA_SetBits(GPIO_Pin_12|GPIO_Pin_13);
GPIOA_ModeCfg(GPIO_Pin_12|GPIO_Pin_13, GPIO_ModeOut_PP_5mA);
FLEVEL_H_LOW; FLEVEL_L_LOW;
/*--- 线圈调频 (PA12=FLEVEL, 一级) ---*/
GPIOA_SetBits(GPIO_Pin_12);
GPIOA_ModeCfg(GPIO_Pin_12, GPIO_ModeOut_PP_5mA);
FLEVEL_LOW; // 默认接入 33nF
/*--- 继电器 (PA8=RLY1) ---*/
GPIOA_SetBits(GPIO_Pin_8);
GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeOut_PP_5mA);
GPIOB_SetBits(GPIO_Pin_22|GPIO_Pin_23);
GPIOB_ModeCfg(GPIO_Pin_22|GPIO_Pin_23, GPIO_ModeOut_PP_5mA);
RLY1_OFF; RLY2_OFF; LEDA_OFF;
RLY1_OFF;
/*--- 指示灯 (PB22=LEDA绿, PB23=LEDB红, 低电平有效) ---*/
GPIOB_SetBits(GPIO_Pin_22 | GPIO_Pin_23);
GPIOB_ModeCfg(GPIO_Pin_22 | GPIO_Pin_23, GPIO_ModeOut_PP_5mA);
LEDA_OFF;
LEDB_OFF;
}
@@ -478,6 +439,8 @@ void INIT_VD(void)
loop1_SensLevel = 2;
Flt_Reg = ALFA_CAP1; //79
g_freq_sens = 2; // DLD154Pro: 灵敏度默认最高, 小程序可调
loop1_ORG_CNT = 0;
loop1_ORG_SUM = 0;
@@ -797,7 +760,6 @@ void cjq_srv(void){
g_loop_power_up_state = 1; // 表示连接了线圈
}
vd1_task();
poll_sens_key();
}
}// end if loop1_LOOP_OK
else{
@@ -811,9 +773,8 @@ void cjq_srv(void){
loop1_FLAG_PLUSE_IN = 0;
// 线圈断开: 继电器释放
RLY1_OFF; RLY2_OFF;
RLY1_OFF;
g_loop_acs_info.relay1_state = 0;
g_loop_acs_info.relay2_state = 0;
g_loop_acs_info.car_state = 0;
if(g_loop_cut_last != loop1_FLAG_CUT){
@@ -847,9 +808,7 @@ void Main_Circulation()
while(1)
{
TMOS_SystemProcess();
#ifndef DEBUG
poll_dbn_ble();
#endif
cjq_srv();
@@ -859,18 +818,6 @@ void Main_Circulation()
g_dbn_ble_state_acs_enable.enable = 0;
}
}
#ifdef DEBUG
if(g_flag_output){
uint32_t tmp;
g_flag_output = 0;
tmp = (loop1_Xn) ? (g_sys_freq / loop1_Xn) : 0;
PRINT("Xn:%d, LPCNT:%d, edges:%d, CAPVD:%d, Origin:%d, VD:%d, freq:%d\n",
loop1_Xn, loop1_LPCNT, g_xn_counter, loop1_CAPVD, loop1_Origin, loop1_VD_FLAG, tmp);
g_xn_counter = 0;
}
#endif
}
}
@@ -931,10 +878,6 @@ void TMR0_IRQHandler(void) // TMR0 捕获中断
if(TMR0_GetITFlag(TMR0_3_IT_DATA_ACT)){
loop1_Xn = (uint16_t)TMR0_CAPGetData();
#ifdef DEBUG
g_xn_counter++;
#endif
if(loop1_Xn == 0){
R8_TMR0_INT_FLAG |= 0xff;
return;
@@ -1010,20 +953,9 @@ __HIGH_CODE
void TMR1_IRQHandler(void)
{
static uint16_t _counter1_init = 0;
#ifdef DEBUG
static uint16_t _cnt = 0;
#endif
if(TMR1_GetITFlag(TMR0_3_IT_CYC_END))
{
#ifdef DEBUG
_cnt++;
if(_cnt >= 400){
g_flag_output = 1;
_cnt = 0;
}
#endif
if(g_dbn_ble_state_acs_enable.enable && g_flag_bt_state){
g_loop_acs_info.report_counter++;
}
@@ -1126,9 +1058,8 @@ void TMR1_IRQHandler(void)
{
/* 有限存在超时: 释放继电器, 主循环全复位重建基线 */
loop1_FLAG_HOLD_TIMEOUT = 1;
RLY1_OFF; RLY2_OFF;
RLY1_OFF;
g_loop_acs_info.relay1_state = 0;
g_loop_acs_info.relay2_state = 0;
}
}
}
@@ -1174,30 +1105,15 @@ void TMR1_IRQHandler(void)
{
RLY1_ON;
g_loop_acs_info.relay1_state = 1;
RLY2_ON;
g_loop_acs_info.relay2_state = 1;
}
else
{
RLY1_OFF;
g_loop_acs_info.relay1_state = 0;
RLY2_OFF;
g_loop_acs_info.relay2_state = 0;
RLY1_OFF;
g_loop_acs_info.relay1_state = 0;
}
} break;
case 1: // 进入脉冲
{
if(loop1_VD_FLAG) // 继电器2存在信号
{
RLY2_ON;
g_loop_acs_info.relay2_state = 1;
}
else
{
RLY2_OFF;
g_loop_acs_info.relay2_state = 0;
}
if(loop1_FLAG_PLUSE_IN)
{
RLY1_ON;
@@ -1211,17 +1127,6 @@ void TMR1_IRQHandler(void)
} break;
case 2: // 离开脉冲
{
if(loop1_VD_FLAG) // 继电器2存在信号
{
RLY2_ON;
g_loop_acs_info.relay2_state = 1;
}
else
{
RLY2_OFF;
g_loop_acs_info.relay2_state = 0;
}
if(loop1_FLAG_PLUSE) // 输出离开脉冲
{
RLY1_ON;
@@ -1234,15 +1139,16 @@ void TMR1_IRQHandler(void)
}
} break;
default: {
if(loop1_VD_FLAG) // 继电器2存在信号
// DLD154Pro 单继电器, 默认存在模式
if(loop1_VD_FLAG)
{
RLY2_ON;
g_loop_acs_info.relay2_state = 1;
RLY1_ON;
g_loop_acs_info.relay1_state = 1;
}
else
{
RLY2_OFF;
g_loop_acs_info.relay2_state = 0;
RLY1_OFF;
g_loop_acs_info.relay1_state = 0;
}
} break;
}
@@ -40,8 +40,8 @@
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.stopAt" value="handle_reset"/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.pcRegister" value=""/>
<stringAttribute key="com.mounriver.debug.gdbjtag.svdPath"/>
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="obj/DLD110S_Peripheral_28K.elf"/>
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="DLD110S_Peripheral_28K"/>
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="obj/DLD154Pro_Peripheral_28K.elf"/>
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="DLD154Pro_Peripheral_28K"/>
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value=""/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.jtagDevice" value="GNU MCU OpenOCD"/>
<stringAttribute key="com.mounriver.debug.gdbjtag.openocd.gdbServerConnectionAddress" value=""/>
@@ -54,7 +54,7 @@
<intAttribute key="org.eclipse.cdt.debug.gdbjtag.core.portNumber" value="3333"/>
<intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="DLD110S_Peripheral_28K"/>
<listEntry value="DLD154Pro_Peripheral_28K"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/>
@@ -42,7 +42,7 @@
"name": "*.wvproj"
}
],
"projectName": "DLD110S_Peripheral_28K",
"projectName": "DLD154Pro_Peripheral_28K",
"architecture": "RISC-V",
"projectType": "c"
},
@@ -448,8 +448,8 @@
"showDebugOutputTimestamps": true
},
"reserve": {
"PROGRAM_NAME": "obj/DLD110S_Peripheral_28K.elf",
"PROJECT_ATTR": "DLD110S_Peripheral_28K",
"PROGRAM_NAME": "obj/DLD154Pro_Peripheral_28K.elf",
"PROJECT_ATTR": "DLD154Pro_Peripheral_28K",
"PROJECT_BUILD_CONFIG_AUTO_ATTR": true,
"PROJECT_BUILD_CONFIG_ID_ATTR": "",
"ATTR_BUILD_BEFORE_LAUNCH_ATTR": 2,
+13 -8
View File
@@ -46,29 +46,34 @@ extern "C" {
* TYPEDEFS
*/
/* 连接一个LED用于监控演示程序的进度,低电平LED */
/* һLEDڼʾĽ,͵ƽLED */
/* 1 - LED */
#define LED1_BV BV(15)
#define LED2_BV
/* DLD154Pro 指示灯
* LED1 = LEDA (PB22, 绿色, 有车亮/无车灭, 低电平有效)
* LED2 = LEDB (PB23, 红色, 呼吸灯, 低电平有效)
*/
#define LED1_BV BV(22)
#define LED2_BV BV(23)
#define LED3_BV
#define LED4_BV
#define LED1_OUT (R32_PB_OUT)
#define LED2_OUT 0
#define LED2_OUT (R32_PB_OUT)
#define LED3_OUT 0
#define LED4_OUT 0
#define LED1_DDR (R32_PB_DIR |= LED1_BV)
#define LED2_DDR 0
#define LED2_DDR (R32_PB_DIR |= LED2_BV)
#define LED3_DDR 0
#define LED4_DDR 0
#define HAL_TURN_OFF_LED1() (LED1_OUT |= LED1_BV)
#define HAL_TURN_OFF_LED2()
#define HAL_TURN_OFF_LED2() (LED2_OUT |= LED2_BV)
#define HAL_TURN_OFF_LED3()
#define HAL_TURN_OFF_LED4()
#define HAL_TURN_ON_LED1() (LED1_OUT &= (~LED1_BV))
#define HAL_TURN_ON_LED2()
#define HAL_TURN_ON_LED2() (LED2_OUT &= (~LED2_BV))
#define HAL_TURN_ON_LED3()
#define HAL_TURN_ON_LED4()