|
1. Conexión entre los niveles superior e inferior En la clase anterior, nos familiarizamos con el proceso básico de desarrollo del programa CC2430 por IAR mediante un sencillo experimento de parpadeo LED. El cuchillo ya está afilado de todas formas (aunque mi piedra de afilar no está bien), y ahora empezaré a sacrificar insectos :). A continuación, aprendamos algunos experimentos básicos de CC2430. Cada pequeño experimento se divide en tres partes: "Introducción al experimento", "Diagrama de flujo del programa" y "Código fuente experimental y análisis". Este artículo explica las interrupciones externas. 2. Interrupción externa(1) Introducción al experimentoLas interrupciones son un mecanismo interno para que los microcontroladores procesen eventos internos o externos en tiempo real. Cuando ocurre un evento interno o externo, el sistema de interrupciones del microcontrolador obligará a la CPU a pausar el programa en ejecución y, en su lugar, procesar el evento de interrupción. Las interrupciones se dividen en interrupciones externas e internas, y CC2430 contiene un total de 18 fuentes de interrupciones (para descripciones y definiciones específicas de vectores de interrupción, consulte "Manual chino CC2430》)。 Ahora echemos un vistazo al diagrama de circuito de esta placa de revelado:
El botón S1 se ha conectado a P0.1 en la placa de revelado, y el efecto de este experimento es activar la interrupción de P0.1 a través del botón S1, y luego controlar el encendido/apagado de LED1 en el subprograma de servicio de interrupciones. (2) Principio experimental y diagrama de flujoEl diagrama de flujo experimental es el siguiente:
(3) Código fuente experimental//头文件
#include
//延时子函数
#definelideró1 P1_0
#defineled2 P1_1
#defineLed3 P1_2
#defineled4 P1_3
VacíoRetraso(sin firmarn)
{
sin firmartt;
para(tt =0; tt<n; tt++);
para(tt =0; tt<n; tt++);
para(tt =0; tt<n; tt++);
para(tt =0; tt<n; tt++);
para(tt =0; tt<n; tt++);
}
//32M晶振初始化
Vacíoxtal_init(Vacío)
{ SUEÑO &= ~0x04; //都上电
mientras(! (SUEÑO &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; //Elige un oscilador de cristal de 32MHz SUEÑO |=0x04;
}
//LED灯初始化
Vacíoled_init(Vacío)
{ P1SEL =0x00; P1 es el puerto normal de E/S P1DIR |=0x0F; P1.0 P1.1 P1.2 P1.3 salida
lideraba1 = 0; lideró2 = 0; lideraba3 = 0; lideraba4 = 0;
}
//io及外部中断初始化
Vacíoio_init(Vacío)
{ P0INP &= ~0X02; //P0.1有上拉、下拉
EA =1; //总中断使能
P0IE =1; //P0中断使能
PICTL |= 0X09; //P0.1口中断使能,下降沿触发
P0IFG &= ~0x02; //P0.1中断标志清0 };
//主函数
Vacíomain(Vacío)
{ xtal_init(); led_init(); io_init();
mientras(1); //等待中断
}
//中断服务子程序
#pragma vector = P0INT_VECTOR
__interrupt VacíoP0_ISR(Vacío)
{ EA =0; La puerta se interrumpe
Retraso(10000); Retraso(10000); Retraso(10000); Retraso(10000); Retraso(10000);
si((P0IFG &0x02) >0) //按键中断 { P0IFG &= ~0x02; //P0.1中断标志清0 liderado1 = !liderado1; } P0IF =0; //P0中断标志清0
EA =1; //开中断
}
Primero, inicializa el reloj del sistema: selecciona un oscilador de cristal de 32MHz. Luego inicializa los LEDs: configura P1 como puerto general de E/S, configura la dirección P1.0 ~ P1.3 como salida y luego apaga las 4 luces LED. A continuación, configura los registros SFR relevantes para interrupciones externas que permitan interrupciones en todos los niveles, involucrando 3 SFR:EA、IEN1、PICTL(Para más detalles de cada SFR, por favor consulte elManual chino CC2430》): EA- Interrupción total habilitada; IEN1.5- Activación de interrupción P0; PICTL.3—— Activación de interrupción de puerto P0.1; PICTL.0—— Configurar el borde de caída de entrada del puerto P0.1 para causar disparo de interrupciones. Luego usa while(1) en la función principal y espera la interrupción. Consejos CC2430(1) Resumen de la sintaxis de asignación de bits Muchas veces, necesitamos asignar un bit (0 o 1) a un solo byte de SFR para controlar con precisión el dispositivo de hardware. Existe la SFRDireccionamiento de bits de soportePor ejemplo, TCON, P0, etc., en este momento, la asignación de contrapuntos es muy sencilla, solo hay que consultar la definición de bits en la sección SFR Bit Access del archivo de cabecera ioCC2430.h: P0_0 = 0; // asignar 0 al primer dígito de P0 P0_0 = 1; // asignar un valor de 1 al primer dígito de P0
Pero algunos SFR no estánNo se soporta el direccionamiento de bits, como en este experimentoPICTL, en este momento, quieres asignar un valor a uno de ellos, la sintaxis es la siguiente: PICTL &= ~0x01; Asignar un valor de 0 al primer dígito PICTL |= 0x01; Asignar un valor de 1 al primer dígito
Puedes recordarlo&= ~,|=Estas dos sintaxis de asignación de bits son comúnmente utilizadas. (2) Resumen de la habilitación de interrupciones Cuando hay una interrupción en el programa, debe activarse antes de que se active la interrupción. La jerarquía del sistema de habilitación de interrupciones C51 es muy evidente: Jefe de Interrupción: EAes el jefe, responsableGeneralHabilitar interrupciones: EA = 1;
Cada líder de escuadra interrumpido: Lo siguiente es para cada unoPartes funcionales(como P0, temporizador 1, etc.), estos SFR suelen ser direccionables por bits, y el nombre suele contener IE (Interrupt Enable): P0IE = 1;
Cada miembro del equipo fue interrumpido: Escuadrón Pero como cada característica también contiene múltiples interrupciones, el último nivel es para estoCada interrupciónEste tipo de SFR suele ser sin bits y no direccionable, y suele incluir IE (Interrupt Enable) o IM (Máscara de Interrupción) en el nombre: PICTL |=0x01;
No hace falta hacer SFR de interrupción mecánica, solo entiende su jerarquía y luego tómate el tiempo de buscar el manual o el archivo de cabecera. (3) Interrumpir la escritura de programas El uso de interrupciones en un programa generalmente incluye dos partes: la escritura del subprograma de servicio de interrupciones y la apertura de la habilitación de interrupciones. La función de interrupción se ha introducido anteriormente, y a continuación se presenta una breve introducción a la redacción del subprograma de servicio de interrupciones: Especifica primeroVector de ruptura, que puede consultarse en la sección de Vectores de Interrupción del archivo de cabecera ioCC2430.h, con la siguiente sintaxis: #pragma vector = vector de interrupción
Luego escribe inmediatamente el gestor de interrupciones, que se estructura de la siguiente manera: __interrupt nombre de la función void (void) { //开中断 //中断处理 //中断标志清0 //关中断 }
3. ConclusiónEste artículo introduce el método de implementación de interrupciones externas simples basadas en CC2430, y tras la base de las interrupciones, introduciremos otro módulo muy importante: los temporizadores. CC2430 tiene un total de 4 temporizadores, que se pueden dividir en tres categorías: temporizador 1, temporizador 2, temporizador 3/4 (3 y 4 son básicamente el mismo uso). </n; tt++); </n; tt++); </n; tt++); </n; tt++); </n; tt++);
|