打印
[技术问题解答]

KL02中断开启后主函数不能同时运行

[复制链接]
2129|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xingxuan_hehe|  楼主 | 2014-5-21 10:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
main函数如下:
int main (void)
{
          PORTB_PCR10= PORT_PCR_MUX(1);
                PORTB_PCR7= PORT_PCR_MUX(1);
   
    SIM_SOPT2|=SIM_SOPT2_TPMSRC(1);
    SIM_SCGC6|=SIM_SCGC6_TPM0_MASK;
                TPM0_SC=TPM_SC_PS(7)|TPM_SC_CMOD(1)|TPM_SC_TOIE_MASK;
                TPM0_CNT=TPM_CNT_COUNT(65000);
                TPM0_MOD=TPM_MOD_MOD(37500);
          printf("\nRunning the Test_TPM0_Interrupt_again project.\n");

        while(1)
        {
               
                GPIOB_PDDR =GPIO_PDDR_PDD(0x400);       
                printf("SET  GPIOB_PDDR");
    delay_time(5500);
                printf("delay_time!");
    GPIOB_PDDR =GPIO_PDDR_PDD(0x00);
    delay_time(5500);               
    printf("\nRunning the Test_TPM0_Interrupt_again project:while().\n");
    enable_irq(33-16);       
    printf("while(1) executed");               
        }
}
然后enable_irq()运行后,主函数不能printf("while(1) executed");需要等中断执行完后,才打印!
请问这是什么原因?

相关帖子

沙发
FSL_TICS_A| | 2014-5-21 11:07 | 只看该作者
你好,楼主!
运行enable_irp()后,是不是马上进入中断函数呢,你可以Debug的时候,设置一个端点看看?

使用特权

评论回复
板凳
xingxuan_hehe|  楼主 | 2014-5-21 11:12 | 只看该作者
这是我的中断函数,我看了下串口输出,进入中断后马上就打印出Interrupt start!然后最后一行如果不加入disable_irq(33-16)就不能退出中断
void TPM0_Interrupt_test(void)
{
        printf("Interrupt start!");
        TPM0_SC|=TPM_SC_TOF_MASK;
        GPIOB_PDDR =GPIO_PDDR_PDD(0x80);
        delay_time(1000);
        GPIOB_PDDR =GPIO_PDDR_PDD(0x00);
        delay_time(1000);
        printf("Interrupt end!");
        //disable_irq(33-16);
}

使用特权

评论回复
地板
FSL_FAE_LiKe| | 2014-5-21 13:46 | 只看该作者
从你的代码上来看,你使能了timer overflow中断,然后一进中断处理函数就清除标志位,但是最后才关中断,我认为很可能是在该函数执行的过程中,counter又overflow了,所以一退出又进来同一个中断。
建议你把disable_irq这句放在该函数的最前面再试试,看看是不是能解决。

使用特权

评论回复
5
xingxuan_hehe|  楼主 | 2014-5-21 13:54 | 只看该作者
FSL_FAE_LiKe 发表于 2014-5-21 13:46
从你的代码上来看,你使能了timer overflow中断,然后一进中断处理函数就清除标志位,但是最后才关中断,我 ...

我现在把中断程序的delay_time()都注释掉了。现在串口输出Interrupt start!Interrupt end!根本停不下来!一直在输出,但是我设置的中断间隔应该在1s,不会这么快呀!

使用特权

评论回复
6
xingxuan_hehe|  楼主 | 2014-5-21 13:56 | 只看该作者
FSL_FAE_LiKe 发表于 2014-5-21 13:46
从你的代码上来看,你使能了timer overflow中断,然后一进中断处理函数就清除标志位,但是最后才关中断,我 ...

应该就是中断标志位没能清除,加上disable_irq是把中断关掉了,虽然能停,但是清除标志位也应该能停掉呀!不过它一直在运行!

使用特权

评论回复
7
FSL_FAE_LiKe| | 2014-5-21 14:03 | 只看该作者
清除标志位并不会让counter停止递增,也就是说程序一边在执行中断处理函数,counter一边还在递增,如果想让计数器在overflow后停下来,可以把TPM0_CONF寄存器的CSOO位置1,或者把counter disable掉。
我认为并不是标志位没有清除,而是清除了马上又置1了,建议你再试试。

使用特权

评论回复
8
xingxuan_hehe|  楼主 | 2014-5-21 14:33 | 只看该作者
FSL_FAE_LiKe 发表于 2014-5-21 14:03
清除标志位并不会让counter停止递增,也就是说程序一边在执行中断处理函数,counter一边还在递增,如果想让 ...

先说一个问题,那个主函数while(1)中,printf("SET  GPIOB_PDDR");刚打印出SET  GPIOB_PD,后边的字母还没打印完呢,就进入中断程序了,输出Interrupt start!了。按说我的主函数设置的中断时间应该是1秒呀,它怎么一下就进入中断了呢!
然后我想问下,怎么把counter中的起始计数变成0,让它重新从0开始递增!

使用特权

评论回复
9
FSL_TICS_A| | 2014-5-21 14:35 | 只看该作者
xingxuan_hehe 发表于 2014-5-21 11:12
这是我的中断函数,我看了下串口输出,进入中断后马上就打印出Interrupt start!然后最后一行如果不加入dis ...

你好,楼主!
6楼的建议值得重视,我建议你可以在调试时,观察TPM的counter寄存器和中断标志位的值。

使用特权

评论回复
10
xingxuan_hehe|  楼主 | 2014-5-21 14:35 | 只看该作者
本帖最后由 xingxuan_hehe 于 2014-5-22 09:12 编辑
FSL_FAE_LiKe 发表于 2014-5-21 14:03
清除标志位并不会让counter停止递增,也就是说程序一边在执行中断处理函数,counter一边还在递增,如果想让 ...


使用特权

评论回复
11
xingxuan_hehe|  楼主 | 2014-5-21 14:40 | 只看该作者
FSL_FAE_LiKe 发表于 2014-5-21 13:46
从你的代码上来看,你使能了timer overflow中断,然后一进中断处理函数就清除标志位,但是最后才关中断,我 ...

加了disable_isq后,再后面再加上enable_isq后,又立马进入中断程序了!

使用特权

评论回复
12
FSL_TICS_Jeremy| | 2014-5-22 09:16 | 只看该作者
xingxuan_hehe 发表于 2014-5-21 14:40
加了disable_isq后,再后面再加上enable_isq后,又立马进入中断程序了!

你没有在Debug时,查看过相关寄存器的值啊?如果没有,你可以试试,可能对找出问题会有帮助。
如果实在找不到问题,你可以上传工程,我这边帮你看看。

使用特权

评论回复
13
xingxuan_hehe|  楼主 | 2014-5-22 11:08 | 只看该作者
我传了两个附件,你运行下看看,是keil环境的。然后中断程序,不断在运行!

Test_TPM1_PWMOUT1.zip

125.31 KB

Test_TPM0_Interrupt_again.zip

126.55 KB

使用特权

评论回复
14
xingxuan_hehe|  楼主 | 2014-5-22 11:11 | 只看该作者
FSL_TICS_Jeremy 发表于 2014-5-22 09:16
你没有在Debug时,查看过相关寄存器的值啊?如果没有,你可以试试,可能对找出问题会有帮助。
如果实在找 ...

我上传了两个附件!在13楼!

使用特权

评论回复
15
FSL_TICS_Jeremy| | 2014-5-22 16:42 | 只看该作者
xingxuan_hehe 发表于 2014-5-22 11:08
我传了两个附件,你运行下看看,是keil环境的。然后中断程序,不断在运行! ...

我手头没有KL02的开发,我打算用KL25开发板复现一下你的问题,请问
你传的两个例程都有同样的问题吗?

使用特权

评论回复
16
xingxuan_hehe|  楼主 | 2014-5-23 13:55 | 只看该作者
FSL_TICS_Jeremy 发表于 2014-5-22 16:42
我手头没有KL02的开发,我打算用KL25开发板复现一下你的问题,请问
你传的两个例程都有同样的问题吗? ...

是的,都是同样的问题!

使用特权

评论回复
17
FSL_TICS_Jeremy| | 2014-5-23 17:18 | 只看该作者
xingxuan_hehe 发表于 2014-5-23 13:55
是的,都是同样的问题!

你的例程上传时是不是出错啊,无法打开。我现在自己用KL25创建工程,
是不是代码就是你在帖子冲贴出来的。

使用特权

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

本版积分规则

1

主题

17

帖子

0

粉丝