任何实际程序未使用的中断都可以借用
嗯嗯 那 这个问题1 14号 15号中断 手册上写的是系统内部中断,这个属于未使用中断么?还是说已经使用了? 使用汇编指令跳转到正确中断人口就可以了吧。没用过的中断号都可以借用。 用 14号 15号中断,写一段代码,测试一下。 _奶咖君_ 发表于 2024-12-2 16:42
嗯嗯 那 这个问题1 14号 15号中断 手册上写的是系统内部中断,这个属于未使用中断么?还是说已经使用了? ...
这个不大清楚,没用过 社区闲人 发表于 2024-12-2 17:02
用 14号 15号中断,写一段代码,测试一下。
{:4_167:}准备写的呢,手头上还有活没干完,,所以先来问着了,, bkeuqoaq 发表于 2024-12-2 17:12
这个不大清楚,没用过
好的谢谢 soma 发表于 2024-12-2 16:47
使用汇编指令跳转到正确中断人口就可以了吧。没用过的中断号都可以借用。 ...
是的,,这里想知道的14号 15号中断是否能借用 系统内部中断可能是系统程序用的,STC有很多细节是不公开的。
不让普通用户用,是用户不可见,可能内部在默默运行。
例如bootloader,仿真固件等。
stc这个仿真它不是硬件级的仿真,应该是内部跑的一段固件程序,在适当的时候与上位机通讯一下,理应占用一些MCU资源,包括内存,外设,中断这些。 health 发表于 2024-12-2 19:24
系统内部中断可能是系统程序用的,STC有很多细节是不公开的。
不让普通用户用,是用户不可见,可能内部在默 ...
嗯 感觉有道理,,, <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 & 0x01))
; // 等待时钟稳定
RTCCFG |= 0x02; // 选择内部低速 IRC作为 RTC时钟源
// 选择外部 32K
// X32KCR = ENX32K | GAIN32K; // 启动外部 32K晶振
// while (!(X32KCR & X32KST))
// ; // 等待时钟稳定
// RTCCFG &= ~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 & SETRTC)
;
RTCCR &= ~RUNRTC; // 配置完成之后再关闭RTC
RTCIF = 0; // 清中断标志
RTCIEN = ESECI; // 使能秒中断
}
</code></pre>
<p>中断服务函数中判断秒中断标志位,然后清零,再执行一个回调函数。</p>
<pre><code>void ISR_Number28(void) interrupt 15
{
#if defined(__MCURTC_H)
if (RTCIF & SECIF)
{
RTCIF &= ~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("RTC IRQ Test!\r\n");
}
}
</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]