打印
[技术问题解答]

KL16 portC_portD中断问题

[复制链接]
2391|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dolphintt920|  楼主 | 2015-9-13 13:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
RTC, pc, IO, pi, ui
新手上路,请教一下KL16 中断问题。
我使用PORTC的SPI接口,引脚为4567
PORTC3设置为外部中断,但是每当开启4567脚的复用SPI功能以后就会无限进入中断,是不是SPI和外部中断不能同时使用?
请问要怎么解决呢。
感谢各位~~

void gpioInit(void)
{

    SIM_SCGC5 |= SIM_SCGC5_PORTB_MASK | SIM_SCGC5_PORTD_MASK | SIM_SCGC5_PORTE_MASK | SIM_SCGC5_PORTC_MASK;  //开启时钟

        
                 PORT_ENABLE_CLK(MKL_PORTC);       //PORTC 3 外部中断设置
                 IO_FUN_SEL(MKL_PORTC,3,1);
                 GPIO_DDR_INPUT(MKL_PORTC,3);
                 IO_IRQ_CONFIG(MKL_PORTC, 3, IO_EITHER_EDGE_IRQ);
                  NVIC_EnableIRQ(PORTC_PORTD_IRQn);
                 NVIC_SetPriority(PORTC_PORTD_IRQn,6);  
                 PORTC_PCR3 = ( PORTC_PCR3 | PORT_PCR_IRQC(PORT_PCR_IRQC_MASK));    //清除标志位


                PORTC_PCR4  |= PORT_PCR_MUX(1);                      //SPI端口初始化                    
               PORTC_PCR5  |= PORT_PCR_MUX(2)|(uint32_t)~(uint32_t)PORT_PCR_MUX(5);      
               PORTC_PCR6  |= PORT_PCR_MUX(2)|(uint32_t)~(uint32_t)PORT_PCR_MUX(5);      
               PORTC_PCR7  |= PORT_PCR_MUX(2)|(uint32_t)~(uint32_t)PORT_PCR_MUX(5);        
               FGPIOC_PSOR |= 1<<4;                                       
               FGPIOC_PDDR |= 1<<4;   
}


中断服务

   void  PORTC_PORTD_IRQHandler (void)
{

         if(PORTC_PCR3 & PORT_PCR_ISF_MASK)
         {
                 PORTC_PCR3 = ( PORTC_PCR3 | PORT_PCR_IRQC(PORT_PCR_IRQC_MASK));         
                 GPIO_TOGGLE(MKL_PORTC,2) ;
         }
}

相关帖子

沙发
dolphintt920|  楼主 | 2015-9-13 14:10 | 只看该作者
这是代码工程和开发板原理图,:(

YL-KL26Z-V3.pdf

80.41 KB

按键中断调试成功.zip

929.89 KB

使用特权

评论回复
板凳
西门扫雪| | 2015-9-13 19:49 | 只看该作者
你的外部中断和SPI功能重合吗?

使用特权

评论回复
地板
dolphintt920|  楼主 | 2015-9-14 09:13 | 只看该作者
西门扫雪 发表于 2015-9-13 19:49
你的外部中断和SPI功能重合吗?

引脚不同

使用特权

评论回复
5
FSL_TICS_ZJJ| | 2015-9-14 09:14 | 只看该作者
楼主清除标志位的语句有问题,请将
     PORTC_PCR3 = ( PORTC_PCR3 | PORT_PCR_IRQC(PORT_PCR_IRQC_MASK));    //清除标志位
改为
PORTC_PCR3 |= PORT_PCR_ISF_MASK;  
包括gpioInit函数以及PORTC_PORTD_IRQHandler中断服务函数的相关两句代码。
然后你再测试下,是否还会一直进入中断。

使用特权

评论回复
6
dolphintt920|  楼主 | 2015-9-14 11:34 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-9-14 09:14
楼主清除标志位的语句有问题,请将
     PORTC_PCR3 = ( PORTC_PCR3 | PORT_PCR_IRQC(PORT_PCR_IRQC_MASK)) ...

无效:(     标志位可以正常清除 但是还是一直进去,可以通过哪个寄存器看触发源是哪里吗

使用特权

评论回复
7
dolphintt920|  楼主 | 2015-9-14 14:47 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-9-14 09:14
楼主清除标志位的语句有问题,请将
     PORTC_PCR3 = ( PORTC_PCR3 | PORT_PCR_IRQC(PORT_PCR_IRQC_MASK)) ...

解决了,配置SPI端口复用功能的时候会在对应端口产生一个外部中断的标志位,清除一下就可以了,产生原因不明。

使用特权

评论回复
8
FSL_TICS_ZJJ| | 2015-9-14 15:25 | 只看该作者
dolphintt920 发表于 2015-9-14 14:47
解决了,配置SPI端口复用功能的时候会在对应端口产生一个外部中断的标志位,清除一下就可以了,产生原因 ...

你是说,你配置PTC4,5,6,7的MUX会在PTC3的中断标志?
你可以把PTC4,5,6,7的配置直接放到使能PTC3中断之前。
另外,你可以使用示波器,跟踪下你的PTC3,看看是否会有引脚信号上面的毛刺出现。

使用特权

评论回复
9
dolphintt920|  楼主 | 2015-9-15 09:19 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-9-14 15:25
你是说,你配置PTC4,5,6,7的MUX会在PTC3的中断标志?
你可以把PTC4,5,6,7的配置直接放到使能PTC3中 ...

是的,不仅在配置PTC 567的MUX的时候会产生对应脚的中断标志,而且在每次操作SPI读写数据以后都会产生中断标志···现在只能在中断里面每次都清除567脚的中断标志。。。
中断使能都是在配置和操作之后进行的。
另外我发现在配置了相应的中断管脚以后,即使不打开中断使能,也能通过查询的方式读取相应的中断标志。

使用特权

评论回复
10
FSL_TICS_ZJJ| | 2015-9-15 09:24 | 只看该作者
dolphintt920 发表于 2015-9-15 09:19
是的,不仅在配置PTC 567的MUX的时候会产生对应脚的中断标志,而且在每次操作SPI读写数据以后都会产生中 ...

你PTC3外面接的什么?
另外,你方便把你工程上传吗?我这边测试看看。

使用特权

评论回复
11
dolphintt920|  楼主 | 2015-9-17 09:30 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-9-15 09:24
你PTC3外面接的什么?
另外,你方便把你工程上传吗?我这边测试看看。

工程和开发板原理图在一楼,如果有空的话希望能帮分析一下,非常感谢

使用特权

评论回复
12
FSL_TICS_ZJJ| | 2015-9-18 12:31 | 只看该作者
楼主你好!
你这个问题还有由你配置的方法导致的。
你把配置:
           PORTC_PCR5  |= PORT_PCR_MUX(2)|(uint32_t)~(uint32_t)PORT_PCR_MUX(5);      
               PORTC_PCR6  |= PORT_PCR_MUX(2)|(uint32_t)~(uint32_t)PORT_PCR_MUX(5);      
               PORTC_PCR7  |= PORT_PCR_MUX(2)|(uint32_t)~(uint32_t)PORT_PCR_MUX(5); 、

改为

        PORTC_PCR5 &=     (uint32_t)~(uint32_t)PORT_PCR_MUX(7);
                PORTC_PCR5 |= PORT_PCR_MUX(2);

        PORTC_PCR6 &=     (uint32_t)~(uint32_t)PORT_PCR_MUX(7);
                PORTC_PCR6 |= PORT_PCR_MUX(2);
               
                PORTC_PCR7 &=     (uint32_t)~(uint32_t)PORT_PCR_MUX(7);
                PORTC_PCR7 |= PORT_PCR_MUX(2);

要清除MUX,先直接与下,因为,如果按照你那么配置,如果不使能PORT中断,会导致IRQC为15,是一个保留的值,你应该把这个值配置为0,否则会引起ISFflag异常,为1,就进入到中断之中。
所以,你的异常中断,其实是由PORTC 5,6,7的异常配置导致的,而不是PTC3导致的。
你修改后,中断中直接就清除PORTC3标志就可以了:“

void PORTD_IRQHandler(void)
{
  
  if(PORTC_ISFR == (1<<3))
  {
   PORTC_PCR3 |= PORT_PCR_ISF_MASK;   
        printf("\n\rinterrupt!\r");
  }

  return;
}

使用特权

评论回复
13
dolphintt920|  楼主 | 2015-9-19 10:04 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-9-18 12:31
楼主你好!
你这个问题还有由你配置的方法导致的。
你把配置:

亲测有效   太给力了,由于才接触飞思卡尔所以东拼西凑一些代码,没有深入阅读寄存器,所以走了些弯路,非常感谢你。

使用特权

评论回复
14
大苏牙| | 2015-9-20 21:45 | 只看该作者
void gpioInit(void)
{

    SIM_SCGC5 |= SIM_SCGC5_PORTB_MASK | SIM_SCGC5_PORTD_MASK | SIM_SCGC5_PORTE_MASK | SIM_SCGC5_PORTC_MASK;  //开启时钟

        
                 PORT_ENABLE_CLK(MKL_PORTC);       //PORTC 3 外部中断设置
                 IO_FUN_SEL(MKL_PORTC,3,1);
                 GPIO_DDR_INPUT(MKL_PORTC,3);
                 IO_IRQ_CONFIG(MKL_PORTC, 3, IO_EITHER_EDGE_IRQ);
                  NVIC_EnableIRQ(PORTC_PORTD_IRQn);
                 NVIC_SetPriority(PORTC_PORTD_IRQn,6);  
                 PORTC_PCR3 = ( PORTC_PCR3 | PORT_PCR_IRQC(PORT_PCR_IRQC_MASK));    //清除标志位


                PORTC_PCR4  |= PORT_PCR_MUX(1);                      //SPI端口初始化                    
               PORTC_PCR5  |= PORT_PCR_MUX(2)|(uint32_t)~(uint32_t)PORT_PCR_MUX(5);      
               PORTC_PCR6  |= PORT_PCR_MUX(2)|(uint32_t)~(uint32_t)PORT_PCR_MUX(5);      
               PORTC_PCR7  |= PORT_PCR_MUX(2)|(uint32_t)~(uint32_t)PORT_PCR_MUX(5);        
               FGPIOC_PSOR |= 1<<4;                                       
               FGPIOC_PDDR |= 1<<4;   
}


是不是管脚复用了,功能复用了呀

使用特权

评论回复
15
FSL_TICS_ZJJ| | 2015-9-21 09:03 | 只看该作者
dolphintt920 发表于 2015-9-19 10:04
亲测有效   太给力了,由于才接触飞思卡尔所以东拼西凑一些代码,没有深入阅读寄存器,所以走了些弯路, ...

不客气,其实严格按照手册来做,就能够正常运行。
后续如果还有问题,欢迎继续发帖交流。

使用特权

评论回复
16
FSL_TICS_ZJJ| | 2015-9-21 09:06 | 只看该作者
大苏牙 发表于 2015-9-20 21:45
是不是管脚复用了,功能复用了呀

管脚复用,是指你这个管脚的功能配置为相应的功能。
具体的功能实现,你还要配置对应的模块。

使用特权

评论回复
17
芙蓉洞| | 2015-9-21 09:09 | 只看该作者
SPI的接口是不是也是中断的管脚啊?

使用特权

评论回复
18
dolphintt920|  楼主 | 2015-9-21 09:30 | 只看该作者
芙蓉洞 发表于 2015-9-21 09:09
SPI的接口是不是也是中断的管脚啊?

嗯 PTC,有外部中断功能

使用特权

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

本版积分规则

81

主题

115

帖子

1

粉丝