|
1. Reliant les niveaux supérieur et inférieur Lors du cours précédent, nous nous sommes familiarisés avec le processus de base de développement du programme CC2430 par l’IAR grâce à une simple expérience de clignotement LED. Le couteau a déjà été aiguisé (même si ma pierre à aiguiser n’est pas bonne), et maintenant je vais commencer à abattre des insectes :). Ensuite, apprenons quelques expériences de base sur CC2430. Chaque petite expérience est divisée en trois parties : « Introduction à l’expérience », « Organigramme de programme » et « Code source et analyse expérimentaux ». Cet article explique les interruptions externes. 2. Interruption externe(1) Introduction à l’expérienceLes interruptions sont un mécanisme interne permettant aux microcontrôleurs de traiter des événements internes ou externes en temps réel. Lorsqu’un événement interne ou externe survient, le système d’interruption du microcontrôleur force le processeur à mettre le programme en cours de pause et à traiter l’événement d’interruption. Les interruptions sont divisées en interruptions externes et internes, et CC2430 contient un total de 18 sources d’interruption (pour des descriptions spécifiques d’interruptions et des définitions des vecteurs d’interruption, veuillez consulter "Manuel chinois CC2430》)。 Regardons maintenant le schéma de cette carte de développement :
Le bouton S1 a été connecté à P0.1 sur la carte de développement, et l’effet de cette expérience est de déclencher l’interruption de P0.1 via le bouton S1, puis de contrôler l’allumage/extinction de LED1 dans le sous-programme de service d’interruption. (2) Principe expérimental et organigrammeLe diagramme de flux expérimental est le suivant :
(3) Code source expérimental//头文件
#include
//延时子函数
#definemené1 P1_0
#defineLed2 P1_1
#defineLed3 P1_2
#defineLead4 P1_3
videDélai (non signén)
{
non signétt ;
pour(tt =0; tt<n ; tt++) ;
pour(tt =0; tt<n ; tt++) ;
pour(tt =0; tt<n ; tt++) ;
pour(tt =0; tt<n ; tt++) ;
pour(tt =0; tt<n ; tt++) ;
}
//32M晶振初始化
vidextal_init(vide)
{ SOMMEIL &= ~0x04; //都上电
tandis que(! (SOMMEIL &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; //Choisissez un oscillateur à cristal de 32 MHz SOMMEIL |=0x04;
}
//LED灯初始化
videled_init(vide)
{ P1SEL =0x00; P1 est le port d’E/S normal P1DIR |=0x0F; Sortie P1.0 P1.1 P1.2 P1.3
mené1 = 0 ; mené2 = 0 ; mené3 = 0 ; menait4 = 0 ;
}
//io及外部中断初始化
videio_init(vide)
{ P0INP &= ~0X02 ; //P0.1有上拉、下拉
EA =1; //总中断使能
P0IE =1; //P0中断使能
PICTL |= 0X09 ; //P0.1口中断使能,下降沿触发
P0IFG &= ~0x02; //P0.1中断标志清0 };
//主函数
videmain(vide)
{ xtal_init() ; led_init() ; io_init() ;
tandis que(1); //等待中断
}
//中断服务子程序
#pragma vecteur = P0INT_VECTOR
__interrupt videP0_ISR(vide)
{ EA =0; La porte est interrompue
Délai (10000); Délai (10000); Délai (10000); Délai (10000); Délai (10000);
si((P0IFG &0x02) >0) //按键中断 { P0IFG &= ~0x02; //P0.1中断标志清0 mené1 = !mené1 ; } P0IF =0; //P0中断标志清0
EA =1; //开中断
}
Commencez par initialiser l’horloge du système : sélectionnez un oscillateur à cristal à 32 MHz. Ensuite, initialisez les LED : réglez P1 comme port d’E/S général, réglez la direction P1.0 ~ P1.3 comme sortie, puis éteins les 4 LED. Ensuite, configurez les registres SFR pertinents pour les interruptions externes afin d’activer les interruptions à tous les niveaux, impliquant 3 SFR :EA、IEN1、PICTL(Pour plus de détails sur chaque SFR, veuillez consulter leManuel chinois CC2430》): EA- Activation totale des interruptions ; IEN1.5- Activation de l’interruption P0 ; PICTL.3—— Activation de l’interruption de port P0.1 ; PICTL.0—— Réglez le bord de descente de l’entrée P0.1 pour provoquer le déclenchement d’interruption. Ensuite, utilisez while(1) dans la fonction principale et attendez l’interruption. Conseils CC2430(1) Résumé de la syntaxe de l’affectation des bits Souvent, il faut attribuer un bit (0 ou 1) à un seul octet de SFR pour contrôler précisément le périphérique matériel. Il y a la SFRAdressage de bits de supportPar exemple, TCON, P0, etc., à ce stade, l’attribution des contrepoints est très simple, il suffit de rechercher la définition du bit dans la section SFR Bit Access du fichier d’en-tête ioCC2430.h : P0_0 = 0 ; // attribuer 0 au premier chiffre de P0 P0_0 = 1 ; // attribuer une valeur de 1 au premier chiffre de P0
Mais certains SFR n’existent pasL’adressage des bits n’est pas pris en charge, comme dans cette expériencePICTL, à ce moment-là, vous souhaitez attribuer une valeur à l’un d’eux, la syntaxe est la suivante : PICTL &= ~0x01 ; Attribuer une valeur de 0 au premier chiffre PICTL |= 0x01 ; Attribuer une valeur de 1 au premier chiffre
Tu peux t’en souvenir&= ~,|=Ces deux syntaxes d’affectation de bits sont couramment utilisées. (2) Résumé de l’activation des interruptions Lorsqu’une interruption est impliquée dans le programme, elle doit être activée avant que l’interruption ne soit déclenchée. La hiérarchie du système d’activation des interruptions C51 est très évidente : Boss Interruption : EAest-ce le patron, responsableGénéralitésActivation des interruptions : EA = 1 ;
Chaque chef d’escouade interrompu: Ensuite pour chacunParties fonctionnelles(comme P0, minuterie 1, etc.), ces SFR sont généralement adressables par bit, et le nom contient généralement IE (Interrupt Enable) : P0IE = 1 ;
Chaque membre de l’équipe a été interrompu: Escouade Mais puisque chaque caractéristique contient aussi plusieurs interruptions, le dernier niveau est pour celui-ciChaque interruptionCe type de SFR est généralement sans bits et non adressable, et contient généralement IE (Interrupt Enable) ou IM (Interrupt Mask) dans le nom : PICTL |=0x01 ;
Pas besoin de faire des interruptions répétitives en SFR, il suffit de comprendre sa hiérarchie puis de prendre le temps de consulter le manuel ou le fichier d’en-tête. (3) Interrompre la rédaction des programmes L’utilisation des interruptions dans un programme comprend généralement deux parties : l’écriture du sous-programme de service d’interruption et l’ouverture de l’activation des interruptions. La fonction d’interruption a été introduite ci-dessus, et voici une brève introduction à la rédaction du sous-programme de service d’interruption : Précisez d’abordVecteur de rupture, qui peut être interrogé dans la section Vecteurs d’interruption du fichier d’en-tête ioCC2430.h, avec la syntaxe suivante : #pragma vecteur = vecteur d’interruption
Ensuite, écrivez immédiatement le gestionnaire d’interruptions, structuré comme suit : __interrupt nom de la fonction void (void) { //开中断 //中断处理 //中断标志清0 //关中断 }
3. ConclusionCet article présente la méthode d’implémentation des interruptions externes simples basées sur CC2430, et après la base des interruptions, nous introduirons un autre module très important : les minuteurs. CC2430 dispose d’un total de 4 minuteries, qui peuvent être divisées en trois catégories : minuterie 1, minuterie 2, minuterie 3/4 (3 et 4 ont essentiellement la même utilisation). </n ; tt++) ; </n ; tt++) ; </n ; tt++) ; </n ; tt++) ; </n ; tt++) ;
|