MikeXue 发表于 2026-7-3 18:40:23

STC32G144K246---统一个引脚MISO与中断共存咨询

Hi ,

    我使用STC32G144K246-LQFP100, SPI1单元, P1.4作为MISO ,同时我又配置P1.4为双边缘中断。   这样是否可行?
    实际应用是, 我的GateDriver是32bit格式的SPI器件, 该器件的SDO与MISO连接,当 GateDriver的CSN处于HighLV时, 器件的SDO脚上会有脉冲信号,MCU需要去捕获这个电平信号。
BR

狂热主宰 发表于 2026-7-3 20:48:25

为何没使用单边沿触发

MikeXue 发表于 2026-7-3 20:54:44

狂热主宰 发表于 2026-7-3 20:48
为何没使用单边沿触发

嗯,实际应用 ,必须监测上/下边沿。

梁工 发表于 2026-7-3 21:49:56

可以

MikeXue 发表于 2026-7-3 22:05:30

梁工 发表于 2026-7-3 21:49
可以

好的,谢谢。

神农鼎 发表于 2026-7-7 16:37:43


神农鼎 发表于 2026-7-7 16:38:26

<p>帖子内容已完整获取。下面我来结合手册,给出专业的技术分析。</p>
<hr />
<h2>问题分析:STC32G144K246 同一引脚(P1.4)同时用作 SPI1-MISO 和 I/O 口双边缘中断</h2>
<h3>结论:<strong>可行,但需注意配置细节</strong></h3>
<p>论坛中 STC 官方人员(梁工)已明确回复 <strong>&quot;可以&quot;</strong>。从硬件和寄存器层面分析,这是完全可行的,原因如下:</p>
<h3>原理说明</h3>
<ol>
<li>
<p><strong>SPI 外设与 I/O 口中断的独立性</strong></p>
<ul>
<li>SPI 模块的 MISO 功能是<strong>输入方向</strong>的,由 SPI 控制寄存器(如 <code>SPCTL</code>)中的 <code>SSIG</code>、<code>MSTR</code> 等位决定引脚功能。</li>
<li>I/O 口中断(端口中断)是独立于外设功能的另一套检测机制,它直接检测引脚上的电平变化,<strong>不受该引脚当前被哪个外设复用影响</strong>。</li>
<li>两者在硬件上是并行工作的,互不阻塞。</li>
</ul>
</li>
<li>
<p><strong>STC32G144K246 的 I/O 口中断特性</strong><br />
根据手册 <strong>&quot;15 普通I/O口均可中断,不是传统外部中断&quot;</strong>(F13T16)章节,STC32G 系列的每个 I/O 口都支持独立的中断,可配置为上升沿、下降沿或双边缘触发。这与 SPI 外设功能可以共存。</p>
</li>
</ol>
<h3>配置注意事项</h3>
<p>虽然可行,但实际应用中需要注意以下几点:</p>
<table>
<thead>
<tr>
<th>注意事项</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>中断触发时机</strong></td>
<td>当 SPI 通信进行时,MISO 上的数据位跳变也会触发 I/O 口中断。需要在中断服务程序中通过标志位或状态判断,区分是 SPI 通信产生的跳变还是 GateDriver 空闲时的脉冲信号。</td>
</tr>
<tr>
<td><strong>中断优先级</strong></td>
<td>如果 SPI 通信速率较高,MISO 上的跳变会很频繁,可能导致 I/O 口中断频繁触发,影响系统效率。建议合理设置中断优先级,或将 SPI 通信期间的中断做软件屏蔽处理。</td>
</tr>
<tr>
<td><strong>引脚模式配置</strong></td>
<td>P1.4 作为 MISO 时,通常由 SPI 外设自动控制引脚方向(输入)。I/O 口中断功能不需要额外配置引脚方向,只需使能对应的端口中断寄存器即可。</td>
</tr>
<tr>
<td><strong>双边缘中断配置</strong></td>
<td>需要设置 <code>P1IM0</code> 和 <code>P1IM1</code> 寄存器中对应 P1.4 的位,使能双边缘触发。具体寄存器定义请参考手册 <strong>&quot;15 普通I/O口均可中断&quot;</strong> 章节。</td>
</tr>
</tbody>
</table>
<h3>推荐的实现思路</h3>
<pre><code class="language-c">// 伪代码思路
void main()
{
    // 1. 初始化 SPI1,P1.4 作为 MISO(由 SPI 模块配置)
    SPI1_Init();

    // 2. 配置 P1.4 为双边缘中断
    P1IM0 &amp;= ~0x10;   // P1.4 中断模式位0
    P1IM1 |= 0x10;    // P1.4 中断模式位1 → 双边缘触发
    P1INTE |= 0x10;   // 使能 P1.4 中断
    EA = 1;         // 开总中断

    while(1)
    {
      // 主循环
    }
}

void P1_ISR() interrupt 11// 假设 P1 中断向量号
{
    if(P1INTF &amp; 0x10)       // 判断是否为 P1.4 中断
    {
      // 读取当前电平或记录边沿
      // 注意:此处可能包含 SPI 通信时的正常数据跳变
      P1INTF &amp;= ~0x10;    // 清除中断标志
    }
}
</code></pre>
<blockquote>
<p><strong>提示</strong>:实际应用中,建议在 SPI 通信期间(CSN 为低时)暂时屏蔽 P1.4 的 I/O 口中断,仅在 CSN 为高(GateDriver 空闲输出脉冲)时才使能中断,这样可以避免 SPI 数据位跳变带来的误触发。</p>
</blockquote>
<h3>信息来源</h3>
<ul>
<li><strong>论坛帖子</strong>:STC 官方人员梁工确认&quot;可以&quot;(<a href="https://www.stcaimcu.com/thread-24755-1-1.html">STC论坛 thread-24755</a>)</li>
<li><strong>手册章节</strong>:STC32G144K246 手册 <strong>&quot;15 普通I/O口均可中断,不是传统外部中断&quot;</strong>(F13T16)章节详细说明了 I/O 口中断的配置方法</li>
</ul>
<p>如果您需要具体的寄存器配置代码或更详细的实现示例,请告诉我您使用的开发环境(Keil C251 或其他),我可以为您提供完整的示例程序。</p>
<hr />
<p><a href="https://www.stcaimcu.com/plugin.php?id=twpx_xunsearch&amp;mod=forum&amp;q=https%3A%2F%2Fwww.stcaimcu.com%2Fthread-24755-1-1.html&amp;f=_all&amp;m=yes&amp;syn=yes&amp;s=relevance&amp;fid=0">🔍 搜索 &quot;https://www.stcaimcu.com/thread-24755-1-1.html&quot;</a></p>
<p>⏱️ 查找用时 2.0s | 总回答用时 14.4s</p>

MikeXue 发表于 2026-7-8 13:49:17

神农鼎 发表于 2026-7-7 16:38
帖子内容已完整获取。下面我来结合手册,给出专业的技术分析。

问题分析:STC32G144K246 同一引脚(P1.4) ...

Hi ,
    感谢了。
BR
页: [1]
查看完整版本: STC32G144K246---统一个引脚MISO与中断共存咨询