<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[MC0 Icu测量异常问题修改]]></title><description><![CDATA[<ol>
<li>问题描述<br />
某用户使用MC03，MCAL驱动，问题背景及软件逻辑：</li>
</ol>
<ul>
<li>ICU模块捕获一个周期约5ms，占空比范围10%~90%的脉冲</li>
<li>10ms task中调用Icu_GetInputState获取到ICU_ACTIVE状态后调Icu_GetDutyCycleValues获取占空比<br />
<img src="https://yt-static-main.oss-cn-shanghai.aliyuncs.com/nodebb/237/7a318e07-6a14-499e-af45-fd3039d24da5.png" alt="d03d3d29-5510-4848-b9a4-fd9eadc78ef9-image.png" class=" img-fluid img-markdown" /> [Image]<br />
客户问题：<br />
实车测试时某辆车出现过持续200ms（约40个正常脉冲周期）时间内以10ms周期查询ICU状态，其状态均为ICU_IDLE的情况，导致这段时间内应用层拿不到占空比数据。<br />
<a href="https://yt-micro.feishu.cn/wiki/UNgEwEX2RiHXDJkbKVQc62SCnTe" rel="nofollow ugc">https://yt-micro.feishu.cn/wiki/UNgEwEX2RiHXDJkbKVQc62SCnTe</a></li>
</ul>
<ol start="2">
<li>问题定位<br />
函数Icu_Lld_Etmr_SignalMeasurementHandle()中的条件：</li>
</ol>
<ul>
<li>检测到TOF中断标志置位时置ICU_IDLE</li>
<li>检测到(CVAL&lt;2000)||（(MOD-CVAL)&lt;2000)时置ICU_IDLE<br />
用于处理以下可能出现的测量场景，目的是丢弃占空比可能计算不准的采样周期/占空比。<br />
（一）用户配置overflow中断优先级高于InputCapture中断<br />
假设代码中全局中断被关闭时，几乎同一时刻先来了一个脉冲边沿，后产生一个overflow中断，此时两个中断均处于pending状态。全局中断开启后先响应overflow中断，overflowtimes加1，再响应InputCapture中断进行占空比计算，此时会得到一个错误的计算值，故通过(CVAL&lt;2000)||（(MOD-CVAL)&lt;2000)条件丢弃采样边沿靠近overflow位置处的计算。<br />
（二）用户配置InputCapture中断优先级高于overflow中断<br />
几乎在同一时刻产生脉冲边沿和overflow中断时，先响应InputCapture中断，查询到TOF标志后表示TOF中断还未正常响应（原因是overflow中断累加一次overflowtimes后会把TOF标志清0），overflowtimes未正常加1，此时会得到一个错误的计算值，故通过查询TOF标志丢弃本周期计算。</li>
</ul>
<p dir="auto">但是 overflow 边界过滤条件使用的是固定 tick 阈值2000。这个固定值没有考虑McuClockReferencePointFrequency、ETMR 时钟源、ETMR 分频系数等因素。<br />
因此在不同工程、不同时钟配置下，同样的 <code>2000U</code> 对应的真实时间窗口并不一致，容易导致某些频率 / 占空比组合下的正常测量被丢弃，使<code>InputState</code> 长时间保持 <code>ICU_IDLE</code>，导致测量连续性较差。</p>
<ol start="3">
<li>修改方案<br />
缩短过滤的时间窗口，将固定 tick 阈值改为固定时间窗口，并根据当前 ETMR 时钟配置自动换算成 ETMR tick。</li>
</ol>
<p dir="auto">3.1 整体方案</p>
<ol>
<li>在 <code>Icu</code> 配置中增加可配置的保护时间参数。</li>
<li>在代码生成阶段将保护时间换算成 tick。</li>
<li>在 <code>Icu_Lld_Etmr.c</code> 中使用生成出来的 tick 值替换原来的固定 <code>2000U</code>。</li>
</ol>
<p dir="auto">3.2 新增Guard Time 配置项<br />
在Icu配置界面的IcuGeneral新增配置项IcuGeneral.IcuEtmrMc0CaptureGuardTimeUs，用户可以自定义时间窗口。<br />
配置规则：</p>
<ul>
<li>仅在 MC0 工程中显示</li>
<li>默认值为 <code>2us</code></li>
<li>取值范围为 <code>1 ~ 1000us</code></li>
</ul>
<p dir="auto">3.3 Tick 生成逻辑<br />
在 Icu_Cfg.h.hbs 模板中先计算 <code>guardTicks</code>，最后只输出一次最终宏：<br />
#define ICU_ETMR_MC0_CAPTURE_GUARD_TICKS    (...)<br />
时钟选择逻辑如下：</p>
<ul>
<li>当 IcuEtmrClockSource = INTERNAL_FASTBUSCLK
<ul>
<li>使用 IcuEtmrMcuClockReferencePoint 对应的 McuClockReferencePointFrequency</li>
</ul>
</li>
<li>当 IcuEtmrClockSource = EXTERNAL_CLOCK
<ul>
<li>使用固定 24 MHz<br />
tick 换算公式如下：<br />
guard_ticks = ceil(guard_time_us * etmr_clock_hz / ((IcuEtmrPrescaler + 1) * 1000000))<br />
其中：</li>
</ul>
</li>
<li>guard_time_us = IcuGeneral.IcuEtmrMc0CaptureGuardTimeUs</li>
<li>etmr_clock_hz = ETMR 实际输入时钟</li>
<li>IcuEtmrPrescaler + 1 = ETMR 实际分频系数</li>
</ul>
<p dir="auto">3.4 驱动侧修改<br />
在 Icu_Lld_Etmr.c 中，原来的 MC0 ETMR 不稳定样本过滤条件：<br />
(CurrentChannelCval &lt; 2000U) || ((ChannelPeriodTime - CurrentChannelCval) &lt; 2000U)<br />
修改为：<br />
(CurrentChannelCval &lt; CaptureGuardTicks) ||<br />
((ChannelPeriodTime - CurrentChannelCval) &lt; CaptureGuardTicks)<br />
其中：<br />
CaptureGuardTicks = ICU_ETMR_MC0_CAPTURE_GUARD_TICKS;</p>
<ol start="4">
<li>修改验证<br />
在overflow 边界过滤条件中进行Dio电平翻转，测试在相同时间内，修改后的代码的测量被丢弃的次数明显减少，测量连续性变好。<br />
输入信号247hz 10%占空比波形<br />
修改前：<br />
<img src="https://yt-static-main.oss-cn-shanghai.aliyuncs.com/nodebb/237/7e6a119e-e9fa-4d99-987c-72b1262b6f98.png" alt="b346616d-b3a9-4789-a2a5-d517280fb9bc-image.png" class=" img-fluid img-markdown" /></li>
</ol>
<p dir="auto">修改后：<br />
<img src="https://yt-static-main.oss-cn-shanghai.aliyuncs.com/nodebb/237/8129e6d9-5701-479d-8a3e-aac8cc37867d.png" alt="820557cd-58c8-4ec7-adab-9e7cb8d3e59d-image.png" class=" img-fluid img-markdown" /></p>
<ol start="5">
<li>总结<br />
修改方案的本质是将原来固定的 2000 tick overflow 边界过滤阈值，改为一个可配置的时间窗口，并在代码生成阶段自动换算成 ETMR tick。这样可以让 MC0 ETMR 信号测量路径中的边界保护逻辑更加稳定、可配置，并且更适应不同的时钟设置。</li>
</ol>
]]></description><link>https://forum.ytmicro.com/topic/1926/mc0-icu测量异常问题修改</link><generator>RSS for Node</generator><lastBuildDate>Wed, 21 Oct 2026 01:54:47 GMT</lastBuildDate><atom:link href="https://forum.ytmicro.com/topic/1926.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 30 Apr 2026 02:53:01 GMT</pubDate><ttl>60</ttl></channel></rss>