_奶咖君_ 发表于 2024-12-2 16:42:22

bkeuqoaq 发表于 2024-12-2 16:38
任何实际程序未使用的中断都可以借用

嗯嗯 那 这个问题1 14号 15号中断 手册上写的是系统内部中断,这个属于未使用中断么?还是说已经使用了?

soma 发表于 2024-12-2 16:47:01

使用汇编指令跳转到正确中断人口就可以了吧。没用过的中断号都可以借用。

社区闲人 发表于 2024-12-2 17:02:47

用 14号 15号中断,写一段代码,测试一下。

bkeuqoaq 发表于 2024-12-2 17:12:47

_奶咖君_ 发表于 2024-12-2 16:42
嗯嗯 那 这个问题1 14号 15号中断 手册上写的是系统内部中断,这个属于未使用中断么?还是说已经使用了? ...

这个不大清楚,没用过

_奶咖君_ 发表于 2024-12-2 17:13:55

社区闲人 发表于 2024-12-2 17:02
用 14号 15号中断,写一段代码,测试一下。

{:4_167:}准备写的呢,手头上还有活没干完,,所以先来问着了,,

_奶咖君_ 发表于 2024-12-2 17:14:06

bkeuqoaq 发表于 2024-12-2 17:12
这个不大清楚,没用过

好的谢谢

_奶咖君_ 发表于 2024-12-2 17:16:20

soma 发表于 2024-12-2 16:47
使用汇编指令跳转到正确中断人口就可以了吧。没用过的中断号都可以借用。 ...

是的,,这里想知道的14号 15号中断是否能借用

health 发表于 2024-12-2 19:24:54

系统内部中断可能是系统程序用的,STC有很多细节是不公开的。
不让普通用户用,是用户不可见,可能内部在默默运行。

例如bootloader,仿真固件等。
stc这个仿真它不是硬件级的仿真,应该是内部跑的一段固件程序,在适当的时候与上位机通讯一下,理应占用一些MCU资源,包括内存,外设,中断这些。

_奶咖君_ 发表于 2024-12-2 22:50:06

health 发表于 2024-12-2 19:24
系统内部中断可能是系统程序用的,STC有很多细节是不公开的。
不让普通用户用,是用户不可见,可能内部在默 ...

嗯 感觉有道理,,,

_奶咖君_ 发表于 2025-1-4 17:26:13

<p>年前终于是稍微闲一点儿了,正愁着找点儿什么事情做,突然想起来这里还有个坑没有填,所以抄起板子测试了一下。</p>
<p>测试用单片机STC8H8K64U,未使能芯片的仿真功能,测试使用的中断 内置RTC的36号中断,使用内部32KRC时钟给RTC提供时钟(别问为啥不用外置的,懒的往上面焊了)。开启秒中断,其实只要证明中断可以正常触发,正常跳转到中断服务函数就可以了。下面是RTC初始化函数。</p>
<pre><code>
void MCURTC_Init(void (*SecIrq)(void))
{
    EAXSFR();
    MCURTCSecIrqProcessFunction = SecIrq;
    // // 选择内部低速 IRC
    IRC32KCR = 0x80; // 启动内部低速振荡器
    while (!(IRC32KCR &amp; 0x01))
      ;         // 等待时钟稳定
    RTCCFG |= 0x02; // 选择内部低速 IRC作为 RTC时钟源
    // 选择外部 32K
    // X32KCR = ENX32K | GAIN32K; // 启动外部 32K晶振
    // while (!(X32KCR &amp; X32KST))
    //   ; // 等待时钟稳定
    // RTCCFG &amp;= ~RTCCKS;

    INIYEAR = 00;   // Y:2021
    INIMONTH = 1;   // M:12
    INIDAY = 1;       // D:31
    INIHOUR = 0;      // H:23
    INIMIN = 0;       // M:59
    INISEC = 0;       // S:50
    INISSEC = 0;      // S/128:0
    RTCCFG |= SETRTC; // 触发 RTC寄存器初始化
    RTCCR |= RUNRTC;// 需要开启RTC RTC才会进行配置
    /**
   * @brief 等待初始化完成,设置RTC需要一个时钟周期。32K 时钟源下,一个时钟周期为 1/32768 秒 大约 30us
   * 在次期间如果进入睡眠模式,则RTC会由于没有设置完成,停止计数。如果此时设置的是使用RTC中断唤醒,则会
   * 导致系统无法唤醒。
   */
    while (RTCCFG &amp; SETRTC)
      ;

    RTCCR &amp;= ~RUNRTC; // 配置完成之后再关闭RTC
    RTCIF = 0;      // 清中断标志
    RTCIEN = ESECI;   // 使能秒中断
}
</code></pre>
<p>中断服务函数中判断秒中断标志位,然后清零,再执行一个回调函数。</p>
<pre><code>void ISR_Number28(void) interrupt 15
{
#if defined(__MCURTC_H)
    if (RTCIF &amp; SECIF)
    {
      RTCIF &amp;= ~SECIF; // 清中断标志
      if (MCURTCSecIrqProcessFunction != NULL)
      {
            MCURTCSecIrqProcessFunction();
      }
    }
#endif
}
</code></pre>
<p>这个回调函数要执行一个,将一个全局变量置1的简单操作</p>
<pre><code>uint8_t RTCFlag = 0;
void RTC_IRQ_Test(void)
{
    RTCFlag = 1;
}
</code></pre>
<p>主函数中这样写</p>
<pre><code>    MCURTC_Init(RTC_IRQ_Test);
    MCURTC_Start();
</code></pre>
<p>然后再while(1)循环中加入对标志位轮询检查再执行对应操作,这里当检查到标志位被置1后,清除标志位,并用printf语句打印一个信息到串口.</p>
<pre><code>void RTC_Process(void)
{
    if (RTCFlag != 0)
    {
      RTCFlag = 0;
      printf(&quot;RTC IRQ Test!\r\n&quot;);
    }
}
</code></pre>
<p>啊 关键的一个汇编文件展示了,,需要再工程中加入一个写有如下内容的.asm文件。AT 后面写入36号中断的向量地址 0123H 在 JMP 后面写入借用的中断地址号 这里测试了一个15号中断 他的中断向量地址为 007BH</p>
<pre><code>    CSEG      AT 0123H
    JMP                007BH
    END

</code></pre>
<p>测试结果:</p>
<p><img src="data/attachment/forum/202501/04/171906pke0h7jedsdmczj3.png" alt="image.png" title="image.png" /></p>
<p>嘛嘛,,看起来似乎是正常输出了。</p>
<p>关于问题1: 14 15号中断可以占用么,就以上的条件下,似乎可以正常输出结果。。但是既然手册上标注了内部系统使用,我觉得还是放过这两个中断把。</p>
<p>关于问题2:在已知使用的单片机中没有的外设中断,可以随意使用,,比如果STC8H这个没有PCA,完全就可以吧PCA作为RTC中断来看,同样的这几个波形发生器(可能是那些有独立波特率发生器的片子使用的中断)也是一样的套路。</p>
<p>关于坛友的一个回复</p>
<p><img src="data/attachment/forum/202501/04/172433s7wp17vra970p037.png" alt="image.png" title="image.png" /></p>
<p>成立!</p>
<p>应该可以完结撒花了吧。。<img alt="hecai" class="emoji" src="https://www.stcaimcu.com/static/image/smiley/default/hecai.gif" title="hecai" /></p>
页: 1 [2]
查看完整版本: 有关使用超过31号中断问题的解决方法2的疑问