JZ2440 desarrollo tabla rasa y la práctica de interrupción anormal # 7 (2)

interrupción

controlador de interrupción

Benpian charla sobre las interrupciones, la parte I se han dicho acerca de las excepciones y manejo de excepciones, la interrupción es una anomalía, por lo que el tratamiento es también similar, la principal diferencia con otras anomalías, la presencia de un controlador de interrupciones ese papel.

proceso de interrupción es una fuente de interrupción -> Interrupt Controller -> controlador, hay muchos tipos interrumpen fuente, una interrupción puede ser un puerto serie, una interrupción de temporizador o una interrupción externa. Y los controlador controla si la interrupción es enmascarado, y el nivel de prioridad de interrupción del estado de alarma. La guía y el controlador de excepciones no es diferente, siempre y cuando se puede escribir de acuerdo a sus necesidades.

 La imagen muestra un diagrama de bloques del controlador de interrupción, la fuente de interrupción es la más a la izquierda, divididos en dos fuentes, excepto que sólo cómo dos registros de origen sub y SUBSRCPND submáscara control de interrupción. ¿Qué tipo de fuentes de interrupción han atribuido el S3C2440 aparece en la tabla:

 Aquí son la principal fuente de discusión fuentes de interrupción, se puede ver una descripción de una determinada interrupción fuente ha descrito, de acuerdo con sus propias necesidades de uno a uno, pero lo más importante de entender en un árbitro de la agrupación, fuente de interrupción fuente se divide en cinco grupos , cada uno no más de seis fuentes de interrupción, el resultado final asignación se muestra a continuación, esta asignación es principalmente para darse cuenta el nivel de prioridad de interrupción, la presencia de ARBITER cada grupo dos señales de control: 1bitARB_mode, 2bitsARB_SEL, en el que para la selección de ARB_SEL interrumpir de manera priorizada. Hay cuatro tipos de orden de prioridad se pueden ver en la siguiente figura, cuatro combinaciones de dos ARB_SEL representados REQ0 donde se fija la prioridad más alta, el correspondiente REQ5 fija la prioridad más baja, y con la REQ1-4 ARB_SEL Girar a la izquierda aumenta, podemos establecer directamente ARB_SEL para determinar el orden de prioridad, el orden de prioridad ARB_mode ser afectada aún más cuando ARB_mode es 0, estamos fijados de manera permanente ARBS_SEL determinado por el orden de prioridad, a menos que podríamos modificar . Cuando ARB_mode 1, cada tiempo de respuesta de interrupción, y hacer ARB_SEL aumentó 1 que dejó un ciclo, lo que resulta en la más alta prioridad de interrupción se convierte en la prioridad más baja, asegurando así las interrupciones de menor prioridad tienen la oportunidad de obtener una respuesta Prevenir el hambre, que también se conoce como programación de todos contra todos, la programación similar con sistema operativo, por lo que aquí ARB_mode planificación de turno rotativo también puede decirse del interruptor.

 controlador de interrupción 5 tiene un control para el registro fuente para la fuente de interrupción: fuente Pendiente Register, registro de modo de interrupción, la máscara de
Registro, la prioridad Pendiente Registro y registro de interrupción
. Wen primero una correspondencia puede bloquear diagrama en.

En el que la fuente de espera de registro y de interrupción pendiente registrarse similares, que se utiliza para indicar qué alarma se activa cuando se ha disparado la alarma, el bit de interrupción correspondiente se establece, la diferencia será que todos SRCPND desencadenadas interrupción se afirma, pero sólo para las necesidades actuales INTPND la más alta prioridad de interrupción de procesamiento fijada, SRCPND proyectará en la más alta interrupción de prioridad para procesamiento de interrupción después de la INTPND, INTPND recibido a través del escudo y el registro de máscara prioridad. Cabe señalar que estos dos registros tienen que ser limpiado después de que se complete el proceso, de lo contrario habría sido la respuesta ha sido tratado repetidas interrupciones. Y la necesidad de empezar desde la fuente SRCPND-> INTPND, por lo que no va a fijar de nuevo después de SRCPND compensación INTPND. ajuste de modo está ajustado a 1 en el bit correspondiente.

 registro de máscara se utiliza para enmascarar interrupciones, fuente de interrupción cuando se establece el bit correspondiente, a continuación, las interrupciones del sistema no son reconocidos, e incluso vienen SRCPND interrupción es algo establecido, no responden, pero si el INTPND conjunto directamente, o que requieren un procesamiento de respuestas (INTPND después de la máscara, máscara no control).

 registro de modo se utiliza para controlar la interrupción o normal contraataque interrupción, por un FIQ ya se ha descrito, ya que tienen más de su propio registro exclusivo, y por lo tanto preservar la escena y recuperar el costo del campo más pequeño, la velocidad de respuesta es más rápida, por lo que se dice para el contraataque. Aquí el valor predeterminado es 0, que poco ordinaria de interrupción por defecto.

 Recordemos que en el registro de prioridad, y sólo tiene que girar el interruptor giratorio de acuerdo con la necesidad, para establecer el orden de prioridad de interrupción.

 

 Además del controlador, si las necesidades del sistema para responder a la interrupción, también necesitan el bit I CPSR mencionada sección F-bit o abierto, que es el proceso de interrupción interruptor maestro del sistema o a la I-bit F- poco se aclaró.

Añadir que, con el fin de facilitar la resolución de interrupción S3C2440 manejador de interrupciones conjunto de registros fuente INTOFFSET, diferentes fuentes de interrupción tienen diferente valor de desplazamiento, el valor del registro se puede comparar directamente con la norma.

 

interrupción externa

Además de las necesidades controlador de interrupciones que ser configurado, la fuente de interrupción también necesita ser configurado. En un ejemplo donde una interrupción externa, un conmutador de interrupción externa es que se pulsa un botón para el botón deseado, se dispara una interrupción, luces LED.

En https://blog.csdn.net/G_METHOD/article/details/104271762 también escrito una clave de contenido, que es la forma de votación para llevar a cabo la detección llave estado, un mayor consumo de recursos de CPU y el uso de interrupción externa -evento gratuito enfoque permite a la CPU para manejar otras cosas ocurre, y cuando se activa un evento, y el tratamiento oportuno. copia del esquema y haga clic en el botón correspondiente a la tabla de claves pie.

EINT0 EINT2 EINT11 EINT19
GPF0 GPF2 GPG3 GPG11

 La última vez que nos propusimos a los pines de entrada se puede leer pines para el estado clave, la necesidad de utilizar una interrupción externa, es necesario ponerlo en el modo de interrupción externa correspondiente. Visto desde la figura., Siempre y cuando el pasador GPxCON correspondiente se establece a un pin de interrupción externa.

 Además del registro GPIO debe establecerse, sino también la necesidad de establecer una interrupción externa. En la siguiente manera, siempre gatillo extinto puede especificar la interrupción externa es baja, alta, creciente, decreciente o doble borde disparado. Aquí se optó por utilizar doble filo disparado, de acuerdo a sus necesidades o preferencias pueden ser seleccionados.

 Cabe señalar que algunos pin de interrupción externa existe filtrado jugó interrupciones externas 32 o 51 puede ser conocida, la clave de nivel se presiona habrá fluctuación de fase, si no el procesamiento de difuminado, el botón de disparo de interrupción operación de prensa puede ser gatillo múltiples eventos de interrupción, como los botones para la iluminación, pero agitar activado más de una vez, por lo que cada vez que se pulsa el botón una vez que las luces parpadean. el modo estabilizado se puede filtrar, el filtrado de manera cruda, se trata de un período de retardo a la espera de nivel estable, donde el chip nos ayudan a hacer el filtrado, por supuesto, se puede escribir desactivar el filtro de registro de funciones, hay hora del reloj y otros registros a la filtración de configure .

 

 controlador de interrupción compara manera similar, el registro de máscara de interrupción externa y el registro es también presentes registros Pend, de manera similar, la máscara de interrupción para enmascarar, la PEND indica que un disparador de interrupción externa. Del mismo modo, después de procesar la interrupción para borrar la correspondiente PEND bit.

 El control de la registro de interrupción se ha descrito anteriormente en la fuente de interrupción, pero el controlador de interrupción en la fuente de interrupción se determina, si el PND usando el controlador de interrupción no puede determinar la fuente específica de la interrupción (por ejemplo, hay varias interrupciones externas compartir EINT una bandera) en este caso, es necesario por registro de interrupción externa a un PND que distinguen a una fuente particular de la interrupción.

De acuerdo con el código de salida anterior como sigue:

.text
.global _start

_start:
	B RESET	
	LDR pc,UNDEFIE
	LDR pc,SW_INTERRUPT
	B ABORT_PREFETCH
	B ABORT_DATA
	B halt				//reserve
	LDR pc,INTERRUPT
	B FIQ_HANDLE

UNDEFIE:
	.word DO_UND	
	
SW_INTERRUPT:
	.word DO_SWI

INTERRUPT:
	.word DO_INTERRUPT
	

ABORT_PREFETCH:
ABORT_DATA:	
IRQ_HANDLE:
FIQ_HANDLE:
	B halt

DO_UND:
	//1.设置栈
	LDR SP,=0x34000000
	//2.保存现场
	STMDB SP!,{R0-R12,LR}

	//处理函数
	MRS R0,CPSR
	LDR R1,=UND_TEST_STRING
    BL ExecptionHandle
	
	//3.恢复现场,跳转回原来的位置
	LDMIA SP!,{R0-R12,PC}^  //^ 表示将SPSR恢复到CPSR中
	
DO_SWI:
	//1.设置栈
	LDR SP,=0x33e00000
	//2.保存现场
	STMDB SP!,{R0-R12,LR}
	
	//处理函数
	MRS R0,CPSR
	LDR R1,=SWI_TEST_STRING
	SUB R2,LR,#4
    BL SWIHandler
	
	//3.恢复现场,跳转回原来的位置
	LDMIA SP!,{R0-R12,PC}^  //^ 表示将SPSR恢复到CPSR中

DO_INTERRUPT:
	//1.设置栈
	LDR SP,=0x33d00000
	//2.保存现场
	SUBS LR, LR, #4
	STMDB SP!,{R0-R12,LR}
	
	//处理函数
    BL InterruptHandler
    bl testPrint1
	
	//3.恢复现场,跳转回原来的位置
	LDMIA SP!,{R0-R12,PC}^  //^ 表示将SPSR恢复到CPSR中

UND_TEST_STRING:
	.string "enter undefin mode!\n"
	
SWI_TEST_STRING:
	.string "enter swi mode!\n"

.align 4
RESET:
	MOV R0,#0
	LDR R1,[R0]
	
	STR R0,[R0]
	LDR R2,[R0]
	
	CMP R2,R0
	LDR SP,=0x40000000+4096
	MOVEQ SP,#4096
	STREQ R1,[R0]
	
	BL HardwareInitAll
	BL UartInit
	
TEST_UND:
	bl testPrint
	.word 0xdeadc0de
	//bl testPrint
TEST_SWI:
	MRS R0,CPSR
	BIC R0,R0,#0x0F
	MSR CPSR,R0
	SWI 0x123
	
	LDR pc,=main
halt:
    B halt
interrupt.h
----------------------
#ifndef __INTERRUPT_H
#define __INTERRUPT_H


void AllInterruptInit(void);
void InterruptHandler(void);


#endif


 

interrupt.c
-------------------------------

#include "interrupt.h"
#include <stdint.h>

#include "led.h"
#include "s3c2440.h"


static void InterruptControllerInit(void)
{
	//开启全局中断开关
	asm(
		"MRS R0,CPSR \n\t"
		"BIC R0,R0,#0x80 \n\t"
		"MSR CPSR,R0 \n\t"
	);

	//关闭相关中断的屏蔽
	INTMSK &= ~((1<<0) | (1<<2) | (1<<5)); 

}

static void ExternInterruptInit(void)
{
	//设置为外部中断引脚
	GPFCON &= ~((3<<0)|(3<<4));
	GPFCON |= (2<<0)|(2<<4);
	
	GPGCON &= ~((3<<6)|(3<<22));
	GPGCON |= (2<<6)|(2<<22);

	EXTINT0 |= (7<<0) | (7<<8);     /* S2,S3 */
	EXTINT1 |= (7<<12);             /* S4 */
	EXTINT2 |= (7<<12);
	
	/* 设置EINTMASK使能eint11,19 */
	EINTMASK &= ~((1<<11) | (1<<19));
}


void AllInterruptInit(void)
{
	InterruptControllerInit();
	ExternInterruptInit();
}

void ExtInterruptHandler(uint32_t irq)
{
	uint32_t ext_interrupt_bit = EINTPEND;
	
	switch(irq)
	{
		case 0:
		{
			ToggleLed(kLed1);
			break;
		}

		case 2:
		{		
			ToggleLed(kLed2);
			break;
		}
		
		case 5:
		{
			if(ext_interrupt_bit &( 1 << 9 ))
			{		
				ToggleLed(kLed3);
			}
			else if(ext_interrupt_bit &( 1 << 11 ))
			{			
				ToggleLed(kLed1);
				ToggleLed(kLed2);
				ToggleLed(kLed3);
			}
			
			break;
		}
		default:
			break;
	}
	
	EINTPEND = ext_interrupt_bit;
}

void InterruptHandler(void)
{
	uint32_t interrupt_bit = INTOFFSET;

	if(interrupt_bit>=0 && interrupt_bit <=5)
	{
		ExtInterruptHandler(interrupt_bit);
	}

	SRCPND = 1<< interrupt_bit;
	INTPND = 1<< interrupt_bit;
}


Este código no es en realidad la carga de trabajo de escritura, algún registro directamente utilizando el valor por defecto sin modificaciones, pero aún así me tarjeta de mucho tiempo, sobre todo después de pulsar el botón para ejecutar la función de interrupción siempre de alguna manera fuera de control o reiniciar inexplicable, última mirada dis se encuentra en uno de los diferentes valores de retorno anormal mencionados requieren un tratamiento diferente de este punto, la necesidad de interrumpir el valor de retorno de menos 4 para volver al flujo normal del programa.

 

temporizador

Temporizadores pueden contar a partir del nombre se utiliza para la sincronización, debe estar aquí debido a su presencia interrumpe la función de interrupción, no sólo la interrupción del temporizador función. Después de ajustar el temporizador de interrupción se genera por un tiempo predeterminado puede utilizarse para realizar tareas periódicamente o temporalmente, por otra parte, mediante la comparación del temporizador de registro habilitar pin temporizador de salida de PWM, la unidad de control de suministro de energía u otra energía requerida periféricos, luz de respiración pueden ser alcanzados por esta función, puede ser también de salida como los periféricos fuente de reloj.

S3C2440 tiene cinco reloj de 16 bits, el reloj calcula diferentes razones de costo o por difícil de lograr, la presencia de la castración funcional o recursos compartidos. TIMER0 es el más completo de un temporizador.

 De izquierda a derecha, se puede ver el reloj temporizador usos PCLK a conducir antes de que el contenido ha sido PCLK a 50MHz. Existe un prescaler de 8 bits después de la PCLK, puede requerir el uso de la división, es decir, reducir la frecuencia de reloj utilizada a partir de entonces también puede reducir el divisor de frecuencia en el tiempo, donde la selección por división de frecuencia mediante el establecimiento de un número de división de frecuencia regístrese MUX . existe temporizador de registro TCMPB, TCNTB, en TCMPB registro de comparación, para comparar el valor actual del contador a la salida de una onda PWM, TCNTB compara con el valor inicial establecido por el temporizador, cuando el valor del temporizador es 0, establecimos automático y cargas, esta TCNTB se asigna automáticamente a la cuenta de registro. También se observa que los dos registros pueden ser modificados en cualquier momento, pero no tendrán efecto en cualquier momento cuando sea necesario en el próximo ciclo de temporización empieza a hacer efecto, por lo que para garantizar recuento en curso a la operación normal. Seguido por un circuito digital es negado, selector seguido es trapezoidal, invertido poco por uno para controlar la salida de la forma de onda está invertida. generador de banda muerta muerta Zona generador para un motor de alta potencia salvaguardia con un tiempo de PWM, en la aplicación del circuito de puente H clásica para controlar el motor. Sustancialmente siguiente diagrama (AD no tienen que usar un simple dibujo Videos sobre ···), un intermedio para el motor M, como un dispositivo de circuito de amplificación de triodo, cuando el voltaje en la A, B a un potencial cero, y el circuito A se enciende el segundo caso, suponiendo que el motor se transfiere correspondiente a la figura. Cuando la tensión se gira a B y A para el tiempo 0, el circuito del lado B está activada, el caso inverso motor, correspondiente a la tercera caso de la figura. Cuando el motor necesario para revertir o viceversa alrededor de la positivo, unido a través de un tiempo de conmutación de tensión A y B, con un verdadero análogo de tensiones no es posible mutaciones. En este momento, si no hay período de tiempo muerto, mientras que puede ser A y B están en el rango de tensión ON, en caso de un cortocircuito directamente a la fuente de alimentación y la tierra, en particular el riesgo de causar un cuarto FIG. La ayuda puede muertos a resolver este problema, el hormigón ya no se expanda.

S3C2440 contador es relativamente simple, pero también establece el contador 32 antes de su uso para aumentar o disminuir, sólo pueden reducirse aquí, también se considera la preocupación, cuando el contador se reduce a 0, es decir, la temporización de la interrupción del temporizador se activa. Que desee utilizar una interrupción del temporizador, el controlador de temporizador, además de los ajustes de la sección, también es necesario para ajustar el temporizador y se inicia. correspondientes registros de la siguiente manera:

El primero es contar una frecuencia de 8 pre-escalador, se utilizó el temporizador 1 se utiliza sólo para la interrupción, y por lo tanto sólo el prescaler a 0. También hay necesidad de factor de división complejo utilizado por estos dos números para hacer que el reloj hacia abajo a un valor apropiado, donde el valor de hecho suficiente en la línea, tal como aquí se dispone directamente a prescaler 99, y 16 usando división de frecuencia, de acuerdo con la final reloj fórmula es 50MHz / ((99 + 1) * 16) = 31250Hz.

 Después de determinar el reloj, el valor de conteo se determina para obtener el período del temporizador, aquí no es necesario, ya que no se proporciona ningún registro de comparación de salida PWM, solo necesita ajustar el valor inicial al TCMPB0 recuento. Supongamos que esperamos 0.5s interrumpidos una vez, de acuerdo con el reloj obtenido anteriormente, se puede saber que necesitamos para establecer el valor inicial de 15625, se puede obtener 0.5s interrumpidos una vez que el efecto deseado.

 La última es una necesidad para establecer el registro de control de reloj, la misma atención sólo al temporizador relevante 0, configurado el tiempo para volver a cargar automáticamente el valor inicial de 0, ya que no es necesario pin de reloj de salida, donde el tubo no puede invertir, los valores por defecto de acuerdo con el manual de chip mencionada por primera vez la necesidad de iniciar manualmente la actualización manual manualmente, pero es necesario para borrar este bit antes de escribir la próxima vez. Por último, iniciar el temporizador.

 Otro contenido similar en interrupción externa, interrupción externa sólo sobre la base del programa, además de temporizador se inicializa, el temporizador de interrupción controlador, mientras que el cierre de la interrupción de temporizador asociado máscara para de ese modo de salida el código como sigue:

interrupt.c
------------------------------------

#include "interrupt.h"
#include <stdint.h>

#include "led.h"
#include "s3c2440.h"

typedef void (*irq_func)(int);
irq_func irq_array[32];

static void register_irq(int irq, irq_func fp)
{
	irq_array[irq] = fp;
	INTMSK &= ~(1<<irq);
}

void Timer0InterruptHandler(int irq)
{
	ToggleLed(kLed1);
}

void ExtInterruptHandler(int irq)
{
	uint32_t ext_interrupt_bit = EINTPEND;
	
	switch(irq)
	{
		case 0:
		{
			ToggleLed(kLed1);
			break;
		}

		case 2:
		{		
			ToggleLed(kLed2);
			break;
		}
		
		case 5:
		{
			if(ext_interrupt_bit &( 1 << 9 ))
			{		
				ToggleLed(kLed3);
			}
			else if(ext_interrupt_bit &( 1 << 11 ))
			{			
				ToggleLed(kLed1);
				ToggleLed(kLed2);
				ToggleLed(kLed3);
			}
			
			break;
		}
		default:
			break;
	}
	
	EINTPEND = ext_interrupt_bit;
}


static void InterruptControllerInit(void)
{
	//开启全局中断开关
	asm(
		"MRS R0,CPSR \n\t"
		"BIC R0,R0,#0x80 \n\t"
		"MSR CPSR,R0 \n\t"
	);
}

static void ExternInterruptInit(void)
{
	//设置为外部中断引脚
	GPFCON &= ~((3<<0)|(3<<4));
	GPFCON |= (2<<0)|(2<<4);
	
	GPGCON &= ~((3<<6)|(3<<22));
	GPGCON |= (2<<6)|(2<<22);

	EXTINT0 |= (7<<0) | (7<<8);     /* S2,S3 */
	EXTINT1 |= (7<<12);             /* S4 */
	EXTINT2 |= (7<<12);
	
	/* 设置EINTMASK使能eint11,19 */
	EINTMASK &= ~((1<<11) | (1<<19));
	
	register_irq(0,ExtInterruptHandler);
	register_irq(2,ExtInterruptHandler);
	register_irq(5,ExtInterruptHandler);
}

static void Timer0InterruptInit(void)
{
	TCFG0 = 99;  
	TCFG1 &= ~0xf;
	TCFG1 |= 3;

	TCNTB0 = 15625;

	TCON |= (1<<1);

	TCON &= ~(1<<1);
	TCON |= (1<<0) | (1<<3);

	/* 设置中断 */
	register_irq(10, Timer0InterruptHandler);
}


void AllInterruptInit(void)
{
	InterruptControllerInit();
	ExternInterruptInit();
	Timer0InterruptInit();
}

void InterruptHandler(void)
{
	uint32_t interrupt_bit = INTOFFSET;

	irq_array[interrupt_bit](interrupt_bit);

	SRCPND = 1<< interrupt_bit;
	INTPND = 1<< interrupt_bit;
}


 Con el trabajo preliminar, el temporizador de interrupción aquí para hacer muy poco, aquí para eliminar la función normal utilizando la matriz de punteros de función estructura de código optimizado, cuando la inicialización de interrupción, que requiere el registro de interrupción de números y los controladores de interrupción, por lo que la interrupción total manipuladores no necesitan ser modificados durante funcionalidad mayor subsiguiente, el acoplamiento para reducir el código. Código efecto abrió la luz, ja visualmente 0.5s.

 

Se han publicado 19 artículos originales · ganado elogios 7 · vistas 6918

Supongo que te gusta

Origin blog.csdn.net/G_METHOD/article/details/104620994
Recomendado
Clasificación