查看: 7086|回复: 26

[求助] 【FRDM-K64F】求助一个GPIO口的中断控制RGB灯的例程

[复制链接]
  • TA的每日心情
    开心
    2024-1-6 07:38
  • 签到天数: 736 天

    连续签到: 1 天

    [LV.9]以坛为家II

    21

    主题

    3486

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    5093
    最后登录
    2024-1-7
    发表于 2015-12-10 09:36:19 | 显示全部楼层 |阅读模式
    本帖最后由 nothingness 于 2015-12-10 09:41 编辑

    求一个GPIO口中断控制RGB灯的例程
    IAR ,要寄存器操作,不要库函数的例程,学习一下K64F在IAR下的中断编程方法
    QQ截图20151210093335.jpg
    QQ截图20151210093400.jpg
    最简单的程序即可,学习一下IAR下的中断编程方法
    1. <p>#include "MK64F12.h"
    2. void delay(uint32_t num);
    3. int main()
    4. {
    5.   SIM_SCGC5 |= (SIM_SCGC5_PORTA_MASK
    6.                 | SIM_SCGC5_PORTB_MASK
    7.                   | SIM_SCGC5_PORTC_MASK
    8.                     | SIM_SCGC5_PORTD_MASK
    9.                       | SIM_SCGC5_PORTE_MASK);
    10. //  PORTB_PCR21 |= 1<<8;
    11.   PORTB_PCR22 |= 1<<8;
    12.   PORTE_PCR26 |= 1<<8;
    13. //  GPIOB_PDDR |= (1<<21)+(1<<22);
    14.   GPIOE_PDDR |= 1<<26;</p><p>  while (1)
    15.   {
    16.     delay(5000000);
    17. //    GPIOB_PTOR |= (1<<21)+(1<<22);
    18.     GPIOE_PTOR |= 1<<26;
    19.   }
    20.   return 0;
    21. }</p><p>void delay(uint32_t num)
    22. {
    23.   uint32_t k;
    24.   for (k=0;k<=num;k++)
    25.   {
    26.     ;
    27.   }
    28. }
    29. </p>
    复制代码
    在这个最简单的程序上修改也行,谢谢

    我知道答案 目前已有26人回答
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

    该用户从未签到

    145

    主题

    4926

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    9267
    最后登录
    1970-1-1
    发表于 2015-12-10 09:59:03 | 显示全部楼层
    楼主你好!
    如果想学习,我建议你自己学着去配置。
    想要用SW按键中断控制GPIO,需要做如下配置。
    1.按键对应GPIO的PORTx_PCR寄存器,配置其中的MUX为1,GPIO功能,IRQC配置中断方式,
    这里PTA4是NMI引脚,你也可以直接用NMI中断,默认就是NMI,无需配置。
    2. 使能端口中断,比如PTC6,需要使能PTC的中断向量, enable_irq(61);
    具体对应IRQ向量号,到reference manual的Table 3-5. Interrupt vector assignments 查找。
    3.使能总中断 EnableInterrupts
    4.编写对应的服务函数,在服务函数中添加控制小灯的程序。
    你先按照这个步骤自己做下,如果遇到问题,再发帖交流。

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-1-6 07:38
  • 签到天数: 736 天

    连续签到: 1 天

    [LV.9]以坛为家II

    21

    主题

    3486

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    5093
    最后登录
    2024-1-7
     楼主| 发表于 2015-12-10 10:35:38 | 显示全部楼层
    本帖最后由 nothingness 于 2015-12-10 10:46 编辑
    FSL_TICS_ZJJ 发表于 2015-12-10 09:59
    楼主你好!
    如果想学习,我建议你自己学着去配置。
    想要用SW按键中断控制GPIO,需要做如下配置。
    1.   PORTC_PCR6 |= 0x010a0100;   //ISF=1 清中断标志,IRQC=A 下降沿中断,MUX=1 GPIO
    2.   NVICICPR1 |= 1<<29;
    3.   NVICISER1 |= 1<<29;
    4.   enable_irq(61);
    5.   EnableInterrupts;
    复制代码
    QQ截图20151210103455.jpg

    需要包含哪个头文件吗?
    中断函数要怎么定义才可以正确的中断?
    QQ截图20151210103811.jpg
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    145

    主题

    4926

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    9267
    最后登录
    1970-1-1
    发表于 2015-12-10 11:23:31 | 显示全部楼层
    nothingness 发表于 2015-12-10 10:35

    需要包含哪个头文件吗?
    中断函数要怎么定义才可以正确的中断?

    void enable_irq (int irq)
    {
        int div;
       
        /* Make sure that the IRQ is an allowable number. Right now up to 91 is
         * used.
         */
        if (irq > 91)
            printf("\nERR! Invalid IRQ value passed to enable irq function!\n");
       
        /* Determine which of the NVICISERs corresponds to the irq */
        div = irq/32;
       
        switch (div)
        {
            case 0x0:
                  NVICICPR0 = 1 << (irq%32);
                  NVICISER0 = 1 << (irq%32);
                  break;
            case 0x1:
                  NVICICPR1 = 1 << (irq%32);
                  NVICISER1 = 1 << (irq%32);
                  break;
            case 0x2:
                  NVICICPR2 = 1 << (irq%32);
                  NVICISER2 = 1 << (irq%32);
                  break;
        }              
    }



    回复 支持 反对

    使用道具 举报

    该用户从未签到

    145

    主题

    4926

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    9267
    最后登录
    1970-1-1
    发表于 2015-12-10 11:24:02 | 显示全部楼层
      /*!< Macro to enable all interrupts. */
    #define EnableInterrupts asm(" CPSIE i");

      /*!< Macro to disable all interrupts. */
    #define DisableInterrupts asm(" CPSID i");
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    145

    主题

    4926

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    9267
    最后登录
    1970-1-1
    发表于 2015-12-10 11:25:31 | 显示全部楼层
    nothingness 发表于 2015-12-10 10:35

    需要包含哪个头文件吗?
    中断函数要怎么定义才可以正确的中断?

    中断函数就用void INT_PORTC(void)
    {
    //清中断标志
    //控制小灯
    }
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-1-6 07:38
  • 签到天数: 736 天

    连续签到: 1 天

    [LV.9]以坛为家II

    21

    主题

    3486

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    5093
    最后登录
    2024-1-7
     楼主| 发表于 2015-12-10 11:43:18 | 显示全部楼层
    本帖最后由 nothingness 于 2015-12-10 11:47 编辑
    FSL_TICS_ZJJ 发表于 2015-12-10 11:25
    中断函数就用void INT_PORTC(void)
    {
    //清中断标志

    谢谢您的耐心指导
    这个问题需要怎么解决

    QQ截图20151210114541.jpg
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    145

    主题

    4926

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    9267
    最后登录
    1970-1-1
    发表于 2015-12-10 12:33:39 | 显示全部楼层
    nothingness 发表于 2015-12-10 11:43
    谢谢您的耐心指导
    这个问题需要怎么解决

    看你的报错,这个函数应该是已经定义过了,你搜索看看,是不是已经有这个函数了。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-1-6 07:38
  • 签到天数: 736 天

    连续签到: 1 天

    [LV.9]以坛为家II

    21

    主题

    3486

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    5093
    最后登录
    2024-1-7
     楼主| 发表于 2015-12-10 12:41:20 | 显示全部楼层
    本帖最后由 nothingness 于 2015-12-10 12:42 编辑
    FSL_TICS_ZJJ 发表于 2015-12-10 12:33
    看你的报错,这个函数应该是已经定义过了,你搜索看看,是不是已经有这个函数了。 ...

    只有头文件 MK64F12.h 中有定义
    QQ截图20151210124010.jpg
    我的工程代码很少,没有其它的了
    1. <p>#include "MK64F12.h"
    2. /*!< Macro to enable all interrupts. */
    3. #define EnableInterrupts asm(" CPSIE i");</p><p>/*!< Macro to disable all interrupts. */
    4. #define DisableInterrupts asm(" CPSID i");
    5. void delay(uint32_t num);
    6. void enable_irq (int irq);
    7. int main()
    8. {
    9.   SIM_SCGC5 |= (SIM_SCGC5_PORTA_MASK
    10.                 | SIM_SCGC5_PORTB_MASK
    11.                   | SIM_SCGC5_PORTC_MASK
    12.                     | SIM_SCGC5_PORTD_MASK
    13.                       | SIM_SCGC5_PORTE_MASK);
    14. //  PORTB_PCR21 |= 1<<8;
    15.   PORTB_PCR22 |= 1<<8;
    16.   PORTC_PCR6 |= 0x010a0100;   //ISF=1 清中断标志,IRQC=A 下降沿中断,MUX=1 GPIO
    17.   NVICICPR1 |= 1<<29;
    18.   NVICISER1 |= 1<<29;
    19.   enable_irq(61);
    20. //  asm "CPSIE i"
    21.   EnableInterrupts;
    22.   PORTE_PCR26 |= 1<<8;
    23. //  GPIOB_PDDR |= (1<<21)+(1<<22);
    24.   GPIOE_PDDR |= 1<<26;</p><p>  while (1);
    25. //  {
    26. //    delay(5000000);
    27. //    GPIOB_PTOR |= (1<<21)+(1<<22);
    28. //    GPIOE_PTOR |= 1<<26;
    29. //  }
    30. //  return 0;
    31. }</p><p> </p><p>void delay(uint32_t num)
    32. {
    33.   uint32_t k;
    34.   for (k=0;k<=num;k++)
    35.   {
    36.     ;
    37.   }
    38. }</p><p> </p><p>void INT_PORTC(void)
    39. {
    40.    //清中断标志
    41.    //控制小灯
    42.    PORTC_PCR6 &= ~0x01000000;
    43.    GPIOE_PTOR |= 1<<26;
    44. }</p><p>
    45. void enable_irq (int irq)
    46. {
    47.      int div;
    48.      
    49.      /* Make sure that the IRQ is an allowable number. Right now up to 91 is
    50.       * used.
    51.       */
    52.      if (irq > 91)
    53. //         printf("\nERR! Invalid IRQ value passed to enable irq function!\n");
    54.      
    55.      /* Determine which of the NVICISERs corresponds to the irq */
    56.      div = irq/32;
    57.      
    58.      switch (div)
    59.      {
    60.          case 0x0:
    61.                NVICICPR0 = 1 << (irq%32);
    62.                NVICISER0 = 1 << (irq%32);
    63.                break;
    64.          case 0x1:
    65.                NVICICPR1 = 1 << (irq%32);
    66.                NVICISER1 = 1 << (irq%32);
    67.                break;
    68.          case 0x2:
    69.                NVICICPR2 = 1 << (irq%32);
    70.                NVICISER2 = 1 << (irq%32);
    71.                break;
    72.      }              
    73. }</p>
    复制代码

    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    145

    主题

    4926

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    9267
    最后登录
    1970-1-1
    发表于 2015-12-10 12:55:09 | 显示全部楼层
    nothingness 发表于 2015-12-10 12:41
    只有头文件 MK64F12.h 中有定义

    我的工程代码很少,没有其它的了

    头文件中的,那不行的,你启动文件加了没有?
    startup_MK64F12.s
    startup_MK64F12.rar (3.65 KB, 下载次数: 3)
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-24 08:12 , Processed in 0.112841 second(s), 31 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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