OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 598|回复: 3

IMX6ULL裸机按键中断,有没有人遇到过程序没返回主程序的呀

[复制链接]

1

主题

4

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2023-11-15
在线时间
8 小时
发表于 2023-11-23 11:09:05 | 显示全部楼层 |阅读模式
1金钱
我设置了LED常亮,在中断处理这里设置熄灭LED灯,主函数内容是打开LED灯,但是这里关闭之后就没进入主函数打开LED灯
void system_irqhandler(unsigned int gicciar)
{

    // 检查中断ID是否正常
    uint32_t intNum = gicciar & 0x3ff;
    if((intNum == 1023) || (intNum >= NUMBER_OF_INT_VECTORS))
    {
        return;
    }

    irqNesting++;       /* 中断嵌套计数器加一 */
    //根据中断ID号,读取中断处理函数然后执行
    irqTable[intNum].irqHandler(intNum, irqTable[intNum].userParam);
    irqNesting--;       /* 中断执行完成,中断嵌套寄存器减一 */
    led_off();
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2023-11-15
在线时间
8 小时
 楼主| 发表于 2023-11-24 09:50:41 | 显示全部楼层
这是代码

9_int.rar

279.98 KB, 下载次数: 0

回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2023-11-15
在线时间
8 小时
 楼主| 发表于 2023-11-24 17:00:52 | 显示全部楼层


  1. .global _start

  2. _start:
  3.     ldr pc, =Reset_Handler       /*复位中断服务函数 */
  4.     ldr pc, =Undefined_Handler  /* 未定义指令中断 */
  5.     ldr pc, =SVC_Handler        /* SVC(Supervisor)中断 */
  6.     ldr pc, =PrefAbort_Handler   /* 预取终止中断 */
  7.     ldr pc, =DataAbort_Handler  /* 数据终止中断 */
  8.     ldr pc, =NotUsed_Handler    /* 未使用中断 */
  9.     ldr pc, =IRQ_Handler        /* IRQ 中断 */
  10.     ldr pc, =FIQ_Handler        /* FIQ 中断 */

  11. /*复位中断服务函数 */
  12. Reset_Handler:

  13.     cpsid i     /*关闭 IRQ中断 */


  14. /*1.关闭I,D Cache 和 MMU,修改SCTLR寄存器,采用读 改 写的方式*/
  15.     mrc p15, 0, r0, c1, c0, 0 /*读取SCTLR寄存器数据到r0寄存器里 */
  16.     bic r0, r0, #(1 << 12)    /* 清除 C1 的 I 位,关闭 I Cache */
  17.     bic r0, r0, #(1 << 11)    /* 清除 C1 的 Z 位,关闭分支预测 */
  18.     bic r0, r0, #(1 << 2)     /* 清除 C1 的 C 位,关闭 D Cache */
  19.     bic r0, r0, #(1 << 1)     /* 清除 C1 的 A 位,关闭对齐检查 */
  20.     bic r0, r0, #(1 << 0)     /* 清除 C1 的 M 位,关闭 MMU */
  21.     mcr p15, 0, r0, c1, c0, 0 /*将r0寄存器写入SCTLR寄存器里 */

  22. #if 0
  23.     /*设置中断向量偏移 */
  24.     ldr r0, =0x87800000
  25.     dsb
  26.     isb
  27.     mcr p15, 0, r0, c12, c0, 0 /*设置VBAR寄存器=0x87800000 */
  28.     dsb
  29.     isb
  30. #endif

  31. .global _bss_start
  32. _bss_start:
  33.     .word __bss_start

  34. .global _bss_end
  35. _bss_end:
  36.     .word __bss_end

  37.     /* clean bss */
  38.     ldr r0, _bss_start
  39.     ldr r1, _bss_end
  40.     mov r2, #0
  41. bss_loop:
  42.     stmia r0!, {r2}   /*r0*/
  43.     cmp r0, r1
  44.     ble bss_loop


  45.     /*设置各个模式下的SP指针 */
  46.     mrs r0, cpsr
  47.     bic r0, r0, #0x1f
  48.     orr r0, r0, #0x12   /*IRQ模式 */
  49.     msr cpsr, r0
  50.     ldr sp, =0x8060000  /*设置改模式下的sp */

  51.     /* 进入 SYS 模式 */
  52.     mrs r0, cpsr
  53.     bic r0, r0, #0x1f
  54.     orr r0, r0, #0x1f   /*SYS模式 */
  55.     msr cpsr, r0
  56.     ldr sp, =0x80400000
  57.    
  58.     /* 进入 SVC 模式 */
  59.     mrs r0, cpsr
  60.     bic r0, r0, #0x1f
  61.     orr r0, r0, #0x13   /*SVC模式 */
  62.     msr cpsr, r0
  63.     ldr sp, =0x80200000

  64.     cpsie i     /*使能IRQ中断 */
  65.     b main
  66.   

  67. /* 未定义指令中断服务函数 */
  68. Undefined_Handler:
  69.     ldr r0, =Undefined_Handler
  70.     bx r0

  71. /* SVC(Supervisor)中断服务函数 */
  72. SVC_Handler:
  73.     ldr r0, =SVC_Handler
  74.     bx r0

  75. /* 预取终止中断服务函数 */
  76. PrefAbort_Handler:
  77.     ldr r0, =PrefAbort_Handler
  78.     bx r0

  79. /* 数据终止中断服务函数 */
  80. DataAbort_Handler:
  81.     ldr r0, =DataAbort_Handler
  82.     bx r0

  83. /* 未使用中断服务函数 */
  84. NotUsed_Handler:
  85.     ldr r0, =NotUsed_Handler
  86.     bx r0

  87. /* IRQ 中断服务函数 */
  88. IRQ_Handler:
  89.     push {lr}                       /* 保存 lr 地址 */
  90.     push {r0-r3, r12}                /* 保存 r0-r3, r12 寄存器 触发中断会保存一些,剩下需要自己手动保存*/

  91.     mrs r0, spsr                    /* 读取 spsr 寄存器 */
  92.     push {r0}                       /* 保存 spsr 寄存器 */

  93.     mrc p15, 4, r1, c15, c0, 0      /* 将 CP15 的 C0 CBAR寄存器内的值到 R1 寄存器中 ,GIC物理首地址
  94.                                      * 参考文档 ARM Cortex-A(armV7)编程手册 V4.0.pdf P49
  95.                                      * Cortex-A7 Technical ReferenceManua.pdf P68 P138
  96.                                      */
  97.     add r1, r1, #0X2000             /* GIC 基地址加 0X2000, 得到 CPU 接口端基地址 */
  98.     ldr r0, [r1, #0XC]              /* CPU 接口端基地址加 0X0C 就是 GICC_IAR 寄存器,
  99.                                     * GICC_IAR 保存着当前发生中断的中断号,我们要根据
  100.                                     * 这个中断号来绝对调用哪个中断服务函数
  101.                                     */
  102.     push {r0, r1}                   /* 保存 r0,r1 */
  103.     cps #0x13                      /* 进入 SVC 模式,允许其他中断再次进去 */

  104.     push {lr}                       /* 保存 SVC 模式的 lr 寄存器 */
  105.     ldr r2, =system_irqhandler      /* 加载 C 语言中断处理函数到 r2 寄存器中*/
  106.     blx r2                          /* 运行 C 语言中断处理函数,带有一个参数 */
  107.    
  108.     pop {lr}                        /* 执行完 C 语言中断服务函数, lr 出栈 */
  109.     cps #0x12                       /* 进入 IRQ 模式                    */
  110.     pop {r0, r1}
  111.     str r0, [r1, #0X10]             /* 中断执行完成,写 EOIR */

  112.     pop {r0}
  113.     msr spsr_cxsf, r0               /* 恢复 spsr */
  114.    
  115.     pop {r0-r3, r12}                 /* r0-r3,r12 出栈 */
  116.     pop {lr}                         /* lr 出栈 */
  117.     subs pc, lr, #4                  /* 将 lr-4 赋给 pc 执行 译码 取码 pc在取码,返回后该执行的是已译码的代码 即pc-4*/  
  118. /* FIQ 中断服务函数 */
  119. FIQ_Handler:
  120.     ldr r0, =FIQ_Handler
  121.     bx r0
复制代码

使用这个start.S就不行,使用文档里面的就可以,这个和文档里的是有什么不同吗
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2023-11-15
在线时间
8 小时
 楼主| 发表于 2023-11-24 17:13:27 | 显示全部楼层
IRQ模式下SP地址少了一位,为什么少了一位是执行完就出问题,而不是一开始就出问题啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-6-11 18:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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