IRQ7 is a NON-MASKABLE interrupt level to the CPU. In general, the only way to safely use it is for dire emergencies only. I use it in a project as a software watchdog. If it triggers the device is getting reset very soon after, or getting shut down.
The only way to safely service any level "N" interrupt is to have the CPU set to level "N" while it is servicing that interrupt. That means that only requests of a higher priority can interrupt that interrupt. And more importantly, another level "N" (or the same level "N") can't get in and mess things up.
IRQ7 is different to the core and may be different to other hardware as well. The description of the Status Register contains:
Interrupt level mask. Defines current interrupt level. Interrupt requests are
inhibited for all priority levels less than or equal to current level,
except edge-sensitive level 7 requests, which cannot be masked.
The Interrupt Controller chapter says:
16.1 68K/ColdFire Interrupt Architecture Overview
Level 7 interrupts are treated as non-maskable and edge-sensitive within
the processor, while levels 1–6 are treated as level-sensitive and
may be masked depending on the value of the SR[I] field.
So when you're servicing any other interrupt, the CPU's IPL (in the status register) prevents any changes in the state of the pin that caused the interrupt (or any changes you make to the interrupt controller) from causing any problems, any Level 7 interrupt pin transition (the active edge presented from the interrupt controller to the CPU) can cause the Level 7 interrupt service routine to be re-entered. So if you disable that interrupt in the interrupt controller and then re-enable it, you're likely to get re-interrupted there.
The other bit problem is that you almost always want to protect data structures used by your mainline and the interrupt service routine from each other. If the mainline is changing a shared data structure you want to stop the interrupt service routine from affecting it. You do this by disabling interrupts around that mainline access. You can't do this with IPL7.
> The problem I'm having with IRQ7: is that it permanently disables all of the other interrupts, killing the system.
That may be what it looks like but probably isn't what is really happening. You should run with a debugger connected and try to find out what is really happening.
It may be possible to use IRQ7 as a "general purpose interrupt", but you'd be better off fixing the hardware.
Higher-end CPUs (like the MCF5329 I'm using) allow any priority level to be assigned to the seven IRQ pins and don't force them to be at the-same-level-as-the-pin-name. That's a lot more flexible than the CF2 CPUs allow.
Tom