查看: 6707|回复: 8

[其他] 为什么我的PIT0中断只能进一次

[复制链接]

该用户从未签到

3

主题

33

帖子

0

新手上路

Rank: 1

积分
76
最后登录
1970-1-1
发表于 2012-3-29 15:53:18 | 显示全部楼层 |阅读模式
#define PIT0_INIT_VAL                            9599999  // 100ms
#define ENABLE_PIT0                              do{PIT_TCTRL0 |= PIT_TCTRL_TEN_MASK;}while(0)
#define DISABLE_PIT0                             do{PIT_TCTRL0 &= ~PIT_TCTRL_TEN_MASK;}while(0)
#define CLR_PIT0                                 do{PIT_TFLG0 = PIT_TFLG_TIF_MASK;}while(0)
1.首先是初始化:
void PIT_Init(void)
{
 
    // PIT clock enable:
    SIM_SCGC6 |= SIM_SCGC6_PIT_MASK;
   
    // enable the clock for PIT Timers:
    PIT_MCR = 0;
    
    // config the period of PIT0:
    PIT_LDVAL0 = PIT0_INIT_VAL;
   
    // enable interrupt for PIT0:
    PIT_TCTRL0 |= PIT_TCTRL_TIE_MASK;  // TIE=1:Interrupt will be requested whenever TIF is set
    EnableISR(IRQ_NUM_PIT0);
   
}
2.应用层开启Timer:
EnableTimer0(PERIOD_SAMPLE, MonitorTimerOK);
void EnableTimer0(UINT uiCnt, void (*pFunc)(void))
{
    ENABLE_PIT0;
   
    m_stTimer0Set.bTimerFlag   = TRUE;  // set flag for count
   
    m_stTimer0Set.uiTimerCnt   = uiCnt; // count number
   
    m_stTimer0Set.pTimerHandle = pFunc; // count OK,call this function
   
}
3.PIT0中断入口函数:
void PIT0_Handler(void)
{
  
    if (m_stTimer0Set.bTimerFlag)
    {
        if (0 == --m_stTimer0Set.uiTimerCnt)
        {
            if (m_stTimer0Set.pTimerHandle != NULL)
            {
                (*m_stTimer0Set.pTimerHandle)();
            }
        }
    }
   
    CLR_PIT0;
}
现象:从复位开始,PIT0中断入口函数只能进入一次;在调试过程中,只有在入口函数设置断点,并且将窗口Register中选择PIT相关寄存器,中断才能再次进入;一旦将断点取消,运行再没有进入中断。
 
我知道答案 目前已有7人回答
回复

使用道具 举报

  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2012-3-29 16:41:52 | 显示全部楼层

    RE:为什么我的PIT0中断只能进一次

    请确定,当执行完毕以后,是成功否清除了寄存器,还有控制寄存器的值。还有一个问题就是,你的PIT周期是否和你理想的一样?
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2012-3-29 16:42:55 | 显示全部楼层

    RE:为什么我的PIT0中断只能进一次

    你用的什么芯片?K60?
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    3

    主题

    33

    帖子

    0

    新手上路

    Rank: 1

    积分
    76
    最后登录
    1970-1-1
     楼主| 发表于 2012-3-29 16:50:38 | 显示全部楼层

    RE:为什么我的PIT0中断只能进一次

    我用的Tower开发板,是K60.我用IAR调试,单步运行结束,寄存器的值都是正确的。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    17

    主题

    113

    帖子

    0

    注册会员

    Rank: 2

    积分
    130
    最后登录
    1970-1-1
    发表于 2012-3-29 19:33:02 | 显示全部楼层

    回复:为什么我的PIT0中断只能进一次

    出中断前清除标志位
    PIT_TFLG_REG(PIT_BASE_PTR,0) |= PIT_TFLG_TIF_MASK;
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    3

    主题

    33

    帖子

    0

    新手上路

    Rank: 1

    积分
    76
    最后登录
    1970-1-1
     楼主| 发表于 2012-3-30 09:03:08 | 显示全部楼层

    回复:为什么我的PIT0中断只能进一次

    TIF清了,单步调试,出中断前,TIF=0
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    3

    主题

    57

    帖子

    0

    新手上路

    Rank: 1

    积分
    11
    最后登录
    1970-1-1
    发表于 2012-3-30 09:25:50 | 显示全部楼层

    回复:为什么我的PIT0中断只能进一次

    在你的中断服务程序中,添加PIT_MCR=0;
    这是个勘误,具体可见e2682
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    3

    主题

    33

    帖子

    0

    新手上路

    Rank: 1

    积分
    76
    最后登录
    1970-1-1
     楼主| 发表于 2012-3-30 09:44:26 | 显示全部楼层

    回复:为什么我的PIT0中断只能进一次

    太感谢了,问题已解决:
    void PIT0_Handler(void)
    {
      
        if (m_stTimer0Set.bTimerFlag)
        {
            if (0 == --m_stTimer0Set.uiTimerCnt)
            {
                if (m_stTimer0Set.pTimerHandle != NULL)
                {
                    (*m_stTimer0Set.pTimerHandle)();
                }
            }
        }
       
        CLR_PIT0;
       
        PIT_MCR=0;    // add for correcting PIT bug
     
    }
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    3

    主题

    33

    帖子

    0

    新手上路

    Rank: 1

    积分
    76
    最后登录
    1970-1-1
     楼主| 发表于 2012-3-30 10:12:14 | 显示全部楼层

    RE:为什么我的PIT0中断只能进一次

    e2682: PIT: Does not generate a subsequent interrupt after clearing the interrupt flag
    Errata type: Errata
    Description: The PIT does not generate a subsequent interrupt after clearing the interrupt flag in the ISR
    upon receiving the first interrupt. Thus, the second interrupt will never be triggered.
    Workaround: In order to enable the use of subsequent interrupts from the PIT, the user must access any PIT
    register after clearing the interrupt flag in the ISR.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-28 04:28 , Processed in 0.106014 second(s), 29 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表