微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > KL25Z不进中断函数

KL25Z不进中断函数

时间:10-02 整理:3721RD 点击:
我的KL25Z怎么进不了中断啊,中断也开了,中断函数也写了,就是进不去啊

  1. void Pit_init(void)
  2. {
  3.   SIM_SCGC6 |= SIM_SCGC6_PIT_MASK;        /*PIT定时器系统时钟使能*/
  4.   enable_irq(INT_PIT-16);                 /*定时器中断向量使能*/
  5.   PIT_MCR=0X00;                           /*标准定时器时钟使能*/
  6.   PIT_TCTRL1=0X00;                        /*定时器的级联位,使能位,中断位全部清除*/
  7.   PIT_LDVAL1=48000;                       //定时器初始值,定时器采用倒计时方式,记到0是产生中断,这里计时PIT_LDVAL1/SYSCLOCK,这里相当于1ms
  8.   PIT_TCTRL1=PIT_TCTRL_TIE_MASK;          //定时器中断使能位使能
  9.   PIT_TFLG1=0X01;                         //中断标志位,标志超时并发送中断请求,向该位写1,即为清除该标志
  10.   PIT_TCTRL1=PIT_TCTRL_TEN_MASK;          //定时器使能位使能
  11. }

  12. void Pit1_isr(void)
  13. {

  14. //PIT_TCTRL1=PIT_TCTRL_TEN_SHIFT;          // 关闭定时器  
  15. PIT_TFLG1=0X01;                          //清除标志位

  16. RED_ON;                                   //红灯亮
  17. BLUE_ON;                                  //蓝灯亮
  18. // PIT_TCTRL1=PIT_TCTRL_TEN_MASK;

  19. }

复制代码

在isr.h里也定义了

  1. #ifndef __ISR_H
  2. #define __ISR_H 1

  3. extern void tpm0_isr(void);
  4. extern void tpm1_isr(void);
  5. extern void Pit1_isr(void);


  6. #undef  VECTOR_033
  7. #define VECTOR_033 tpm0_isr

  8. #undef  VECTOR_034
  9. #define VECTOR_034 tpm1_isr

  10. #undef VECTOR_038
  11. #define VECTOR_038 Pit1_isr


  12. #endif  //__ISR_H

复制代码

不知道为什么就是不执行中断,求帮助

一般要使能模块的中断,还要添加enable_irq(xx); 函数来使能外围模块的。
建议你最好去下载FRDM-KL25例程包,参考例程包中的中断函数设置。

  1. void Pit1_init(void)
  2. {
  3.     SIM_SCGC6 |= SIM_SCGC6_PIT_MASK; // enable PIT module
  4.    
  5.     /* Enable PIT Interrupt in NVIC*/   
  6.     enable_irq(INT_PIT - 16);
  7.       
  8.     PIT_MCR = 0x00;  // MDIS = 0  enables timer
  9.     PIT_TCTRL1 = 0x00; // disable PIT1
  10.     PIT_LDVAL1 = 48000; //
  11.     PIT_TCTRL1 = PIT_TCTRL_TIE_MASK; // enable PIT1 and interrupt
  12.     PIT_TFLG1 = 0x01; // clear flag
  13.     PIT_TCTRL1 |= PIT_TCTRL_TEN_MASK;
  14.    
  15. }
  16. CUInt16 ti_accel_sampling;
  17. CUInt16 base_time125m;
  18. CUInt16 ti_delay;
  19. CUInt16 ti_print;
  20. CUInt16 ti_task;
  21. void PIT_IRQHandler(void)
  22. //void Pit1_isrv(void)
  23. {  
  24.     static char count_mseg=125;
  25.     PIT_TFLG1 = 0x01; // clear flag
  26.     if (count_mseg)count_mseg--;
  27.     if (ti_accel_sampling) ti_accel_sampling--;
  28.     else
  29.     {
  30.      count_mseg=125;
  31.      base_time125m++;
  32.     }
  33.    if (ti_task) ti_task--;
  34.    if (ti_delay) ti_delay--;
  35.    if (ti_print) ti_print--;
  36. }

复制代码

我在mkl05中测试,通过,能进中断

小编还要注意一点:
定时器诸如:PIT、LPTMR、TPM之类的模块都有设置调试状态时他们的counter是如何运行的。
如果设置的不好,他们的counter在调试时是不会增长的,自然就会导致无法进入中断。

感谢楼上的各位大神,应该是我设置的问题,我再调整一下

多谢啊

用CMSIS标准的NVIC操作函数控制NVIC的中断开关,调用NVIC_EnableIRQ(PIT_IRQn)。另外,你的中断服务程序不应该把关闭定时器的两句代码注释掉,其它模块可能不需要关功能,但是PIT一定要,这是手册里写的。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top