打印
[STM8]

香主来帮忙,有图有真相,STM8在定时器中断问题

[复制链接]
4543|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 zhseedling 于 2012-4-3 23:19 编辑

芯片是STM8S208RB,STVD+Cosmic专门写了个程序来测试。
问题是在定时器1的捕获比较中断中关不了总中断。

下面是测试过程。

#include "stm8s208rb.h"

void delay(unsigned int t);
unsigned int captureValue = 0,numberOfCapture = 0;
main()
{        
        /* CC1通道被配置为输入,IC1映射在TI1FP1上 */
        TIM1_CCMR1 |= 0x01;
        /* IC1PSC[1:0]被配置为11,即8分频 */
        TIM1_CCMR1 |= (0x03 << 2);
        /* 开捕获1中断 */
        TIM1_IER |= 0x02;
        /* 定时器开始计数 */
        TIM1_CR1 |= 0x01;
        /* 捕获使能 */
        TIM1_CCER1 |= 0x01;
        _asm("rim");
        /* 时钟输出为fLSI */
        CLK_CCOR |= 0x02;
        /* 开启CCO时钟输出 */
        CLK_CCOR |= 0x01;
        while (1)
        {
                delay(100);
                delay(100);
        }
}
void delay(unsigned int t)
{
        while(t--);
}

@far @interrupt void TIM1CC_IRQ(void)
{
//        _asm("sim");
        captureValue = (unsigned int)TIM1_CCR1H << 8;
        captureValue |= TIM1_CCR1L;
        numberOfCapture++;
        
}
接下来是仿真的图片






当跳出定时器函数的时候,总中断自动开了
然后我注释掉了关中断这条




结果进入中断服务程序总中断自动关闭了


然后又自动打开了。
当然,这也符合同时发生模式,可是这种实现方式也太低级了吧,出中断的时候打开中断。

下面是中断服务程序的汇编代码
main.c:39
_asm("sim");
0x8116 <TIM1CC_IRQ>         0x9B            SIM                       SIM
main.c:40
captureValue = (unsigned int)TIM1_CCR1H << 8;
0x8117 <TIM1CC_IRQ+1>       0xC65265        LD    A,0x5265            LD    A,_TIM1_CCR1H
0x811a <TIM1CC_IRQ+4>       0x5F            CLRW  X                   CLRW  X
0x811b <TIM1CC_IRQ+5>       0x97            LD    XL,A                LD    XL,A
0x811c <TIM1CC_IRQ+6>       0x4F            CLR   A                   CLR   A
0x811d <TIM1CC_IRQ+7>       0x02            RLWA  X,A                 RLWA  X,A
0x811e <TIM1CC_IRQ+8>       0xBF00          LDW   0x00,X              LDW   captureValue,X
main.c:41
captureValue |= TIM1_CCR1L;
0x8120 <TIM1CC_IRQ+10>      0xC65266        LD    A,0x5266            LD    A,_TIM1_CCR1L
0x8123 <TIM1CC_IRQ+13>      0x5F            CLRW  X                   CLRW  X
0x8124 <TIM1CC_IRQ+14>      0x97            LD    XL,A                LD    XL,A
0x8125 <TIM1CC_IRQ+15>      0x01            RRWA  X,A                 RRWA  X,A
0x8126 <TIM1CC_IRQ+16>      0xBA01          OR    A,0x01              OR    A,captureValue+1
0x8128 <TIM1CC_IRQ+18>      0x01            RRWA  X,A                 RRWA  X,A
0x8129 <TIM1CC_IRQ+19>      0xBA00          OR    A,0x00              OR    A,captureValue
0x812b <TIM1CC_IRQ+21>      0x01            RRWA  X,A                 RRWA  X,A
0x812c <TIM1CC_IRQ+22>      0xBF00          LDW   0x00,X              LDW   captureValue,X
main.c:42
numberOfCapture++;
0x812e <TIM1CC_IRQ+24>      0xBE02          LDW   X,0x02              LDW   X,numberOfCapture
0x8130 <TIM1CC_IRQ+26>      0x1C0001        ADDW  X,#0x0001           ADDW  X,#0x0001
0x8133 <TIM1CC_IRQ+29>      0xBF02          LDW   0x02,X              LDW   numberOfCapture,X
main.c:44
}
0x8135 <TIM1CC_IRQ+31>      0x80            IRET                      IRET
沙发
zhseedling|  楼主 | 2012-4-3 23:17 | 只看该作者
我以为可能是仿真的问题,又写了个数码管显示的程序,结果还是一样,捕获次数在不断的加,关不了中断。

使用特权

评论回复
板凳
香水城| | 2012-4-4 11:16 | 只看该作者
正常现象。
STM8进中断时CPU会保存CC,执行IRET时会恢复CC寄存器。

使用特权

评论回复
地板
zhseedling|  楼主 | 2012-4-5 09:35 | 只看该作者
本帖最后由 zhseedling 于 2012-4-5 16:26 编辑

嗯,试了下,的确是,在外部中断中也不能关闭总中断。
那只能是关中断自己的小开关了。
后来又试了下修改优先级,发现其实单片机在进入到中断服务程序的时候,是把进入的这个中断的优先级复制到了CPU CC中。又看了一边手册,发现ST写的太牛了,你懂的话肯定能看懂,你不懂的话肯定看不懂。

手册里关于这部分的描述:
当一个中断请求必须被响应时:
1. 在当前正在执行指令结束之后,正常的操作被悬起;
2. PC,X,Y,A和CC寄存器被自动压栈;
3. 根据ITC_SPRx寄存器中的值对应的中断服务向量,CC寄存器中的位I1和I0被相应设置;
4. 通过中断向量载入中断服务子程序的入口地址,接着对中断服务子程序的第一条指令取址(参
考表16中断映射表 来了解向量地址的更详细情况)。
中断服务子程序必须以IRET指令结束,该指令会把堆栈中的保存的寄存器内容出栈,同时由于运
行IRET指令,位I1和位I0被重新恢复,程序也恢复运行。

相应两字实在是太犀利了。每个地方都用"相应"的话手册肯定能薄不少
补充:
其实手册下面关于CC寄存器描述的时候说到了:
I[1:0] :软件中断优先级位
这两位表明当前中断请求的优先级。当一个中断请求发生时,相应的中断向量
的软件优先级自动从(ITC_SPRx) 载入I[1:0]。

使用特权

评论回复
5
触觉的爱| | 2012-4-5 13:18 | 只看该作者
人家是注重环保与效率的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

27

帖子

1

粉丝