Browse Source

修复bsk存储,改为稀疏映射,使用数组存储数据

Signed-off-by: hanyongwei <2043702190@qq.com>
dev1
hanyongwei 3 weeks ago
parent
commit
854f0e9cb9
5 changed files with 1157 additions and 1765 deletions
  1. +1116
    -1746
      iar/plsr.dep
  2. +7
    -6
      plsr/plsr.c
  3. +1
    -1
      plsr/pulse_driver/plsr_pulse_driver.c
  4. +1
    -1
      plsr/pulse_driver/plsr_pulse_driver.h
  5. +32
    -11
      plsr/run_control/plsr_run_control.c

+ 1116
- 1746
iar/plsr.dep
File diff suppressed because it is too large
View File


+ 7
- 6
plsr/plsr.c View File

@@ -10,9 +10,9 @@
* 本文件仅依赖 plsr.h 及各子模块头文件,不被其它 plsr 模块反向引用。
*
* 关键数据流
* PlsrInit 顺序:Param 默认 → PersistLoad → PulseDriver → SignalIo
* RunControl → PersistRestoreRuntime → ExportToHold →
* CommandInit → PersistRestoreMonitor → PersistPoll
* PlsrInit 顺序:Param 默认 → PersistLoad(BKP→hold) → ApplyFromHold
* PulseDriver → RunControl → RestoreRuntime → ExportToHold →
* CommandInit → RestoreMonitor → PersistPoll
* PlsrTask 循环:TickMs → DebouncePoll → CommandPoll → PersistPoll → WakePend
*/
#include "plsr.h"
@@ -30,12 +30,13 @@
void PlsrInit(void)
{
PlsrParamInitDefault();
PlsrPersistLoad(); /* BKPSRAM:覆盖公共+段表;累计/故障暂存 */
PlsrPersistLoad(); /* BKPSRAM 稀疏映像 → g_hold_reg */
(void)PlsrParamBlockApplyFromHold();
PlsrPulseDriverInit();
PlsrSignalIoInit();
PlsrRunControlInit();
PlsrPersistRestoreRuntime(); /* 写回累计脉冲 */
PlsrParamBlockExportToHold(); /* 上电把运行映像摊到保持寄存器,供 Modbus 0x03 读取 */
PlsrPersistRestoreRuntime(); /* 0x2000 累计 → run_control */
PlsrParamBlockExportToHold(); /* 运行映像与 hold 对齐,供 Modbus 读 */
PlsrCommandInit();
PlsrPersistRestoreMonitor(); /* 恢复故障码;0x3000/运行态强制空闲 */
PlsrPersistPoll(); /* 消费 Restore 置的 dirty */


+ 1
- 1
plsr/pulse_driver/plsr_pulse_driver.c View File

@@ -812,7 +812,7 @@ void PlsrPulseDriverArmOnePulseStop(void)
{
return;
}
/* 下一 UPDATE 后计数器停止;须在倒数第二拍尽早武装(见 run_control ISR) */
/* 下一 UPDATE 后计数器停止;须在「已计入末拍上升沿」时武装(见 run_control ISR) */
htim->Instance->CR1 |= TIM_CR1_OPM;
}



+ 1
- 1
plsr/pulse_driver/plsr_pulse_driver.h View File

@@ -102,7 +102,7 @@ void PlsrPulseDriverStop(void);

/**
* @brief 当前拍结束后停止计数(CR1.OPM),避免段末多出一个上升沿
* @note 调用时机:倒数第二脉冲 ISR,且不会 FOLLOW 不停表衔接时
* @note 调用时机:已计入末拍上升沿的 ISR;本周期结束后 OPM 停表
*/
void PlsrPulseDriverArmOnePulseStop(void);



+ 32
- 11
plsr/run_control/plsr_run_control.c View File

@@ -30,8 +30,9 @@
* 若不超前,末拍实际是 f(N-1)≈sqrt(f_end^2+2a),示波器偶发「末频偏高」。
* 减速在 remain==dec_n+1 切入;纯减速开表再预装一拍。
*
* 【段末停表】非 FOLLOW-keep 时开段锁 s_seg_end_opm,倒数第二拍 ISR 内立刻写
* CR1.OPM,避免改频路径拖长导致下一拍已开跑、偶发多出 1 个边沿。
* 【段末停表】非 FOLLOW-keep 时开段锁 s_seg_end_opm:
* UPDATE≈上升沿;s_done 到 target 时武装 OPM,末拍整周期跑完后下一 UPDATE
* 再 AfterSegDone 且不再 ++ → 末拍完整且不多 1。FOLLOW-keep 到点立刻衔接。
*
* 【故障诊断 0x2006】(PlsrCommandSetFault,告警码 1~3 不停机;4 禁止启动)
* 0x01 段结束 AfterSegDone:s_done != s_target
@@ -127,6 +128,7 @@ static uint32_t s_chain_freq; /* 段末停表前的落地频率
static uint8_t s_chain_valid; /* 1=s_chain_freq 有效 */
static uint8_t s_pwm_on; /* 1=PWM 正在输出 */
static uint8_t s_seg_end_opm; /* 1=本段末拍用 OPM 单脉冲停表 */
static volatile uint8_t s_last_period_wait; /* 1=已计满 target,等末拍周期结束再 AfterSegDone */

static uint16_t s_run_accel_ms; /* 本段锁定加速时间 ms(ChangeFreq 复用) */
static uint16_t s_run_decel_ms; /* 本段锁定减速时间 ms */
@@ -1222,6 +1224,7 @@ static void PlsrRunControlFinishAll(void)
s_act_handoff_keep = 0U;
s_wait_expire_req = 0U;
s_act_time_ms = 0U;
s_last_period_wait = 0U;
PlsrPersistNotifyMonitorChanged(); /* 全部结束:落盘累计与空闲状态 */
}

@@ -1248,6 +1251,7 @@ static void PlsrRunControlBeginSeg(uint16_t seg_idx0)
seg = PlsrParamGetSeg(seg_idx0);
cfg = PlsrParamGetCfg();
s_cur_seg = seg_idx0;
s_last_period_wait = 0U;
cnt = seg->pulse_cnt;

if (cfg->run_mode == PLSR_POS_ABSOLUTE)
@@ -1390,6 +1394,7 @@ void PlsrRunControlInit(void)
s_plan_dec_n = 0U;
s_decel_budget = 0U;
s_seg_end_opm = 0U;
s_last_period_wait = 0U;
s_phase = PH_CONST;
s_act_armed = 0U;
s_act_expire_req = 0U;
@@ -1549,6 +1554,7 @@ void PlsrRunControlStop(void)
s_act_handoff_keep = 0U;/*ACT 切段后是否保持当前频率衔接*/
s_wait_expire_req = 0U;/*段后等待到期请求标志*/
s_act_time_ms = 0U;/*本段 ACT 定时时长*/
s_last_period_wait = 0U;
PlsrPersistNotifyMonitorChanged(); /* 停机:立刻落盘累计/状态 */
}

@@ -1703,6 +1709,18 @@ void PlsrRunControlOnPulseIsr(void)
return;
}

/*
* 末拍整周期已跑完:本 UPDATE 由 OPM 停表产生,不再计入脉冲。
* 先于 s_done++,保证个数 = target 且示波器末拍完整。
*/
if (s_last_period_wait != 0U)
{
s_last_period_wait = 0U;
s_act_cut_pending = 0U;
PlsrRunControlAfterSegDone();
return;
}

s_done++;
if (s_forward != 0U)
{
@@ -1731,19 +1749,22 @@ void PlsrRunControlOnPulseIsr(void)

if (s_done >= s_target)
{
if (s_seg_end_opm != 0U)
{
/*
* 本 UPDATE = 末拍上升沿,已计入 target。
* 武装 OPM:本周期完整跑完后下一 UPDATE 停表 → s_last_period_wait 收尾。
* 此处不 AfterSegDone/Stop,否则会截断末拍成尖刺。
*/
PlsrPulseDriverArmOnePulseStop();
s_last_period_wait = 1U;
return;
}
/* FOLLOW 不停表衔接:立刻切段,PWM 连续 */
PlsrRunControlAfterSegDone();
return;
}

/*
* 倒数第二拍立刻武装 OPM(在改频/曲线步进之前)。
* 若拖到 ISR 末尾才写 OPM,高频时下一拍已跑完甚至又开一拍 → 示波器偶发多 1。
*/
if ((s_seg_end_opm != 0U) && (s_done >= (s_target - 1)))
{
PlsrPulseDriverArmOnePulseStop();
}

remain = PlsrRunControlRemainPulses();

if (s_phase == PH_CONST)


Loading…
Cancel
Save