[CC2530 Introduction Course-03] Système d'interruption CC2530 et application d'interruption externe

[CC2530 Introduction Tutorial-06] Principe de fonctionnement et application de l'ADC du CC2530

[CC2530 Introduction Tutorial-05] Principe et application de l'interface série du CC2530

[CC2530 Introduction Course-04] Principe et application de la minuterie / compteur CC2530

[CC2530 Introduction Course-03] Système d'interruption CC2530 et application d'interruption externe

[CC2530 Introduction Tutorial-02] Contrôle général d'entrée et de sortie du port d'E / S du CC2530

[CC2530 Getting Started Tutorial-01] CC2530 Développement du microcontrôleur Premiers pas

 


1. Concepts de base relatifs aux interruptions

       Il existe deux principaux modes d'interaction entre le  noyau et les périphériques : l' interrogation et l' interruption . La méthode d'interrogation semble juste, mais l'efficacité réelle du travail est très faible et elle ne peut pas répondre aux urgences à temps; le système d'interruption donne au noyau la capacité de répondre aux urgences.

        Lors de l'exécution du programme en cours de la CPU, en raison d'une situation urgente dans le système, la CPU suspend le programme en cours d'exécution, puis exécute un autre programme spécial pour traiter les affaires émergentes. Une fois le traitement terminé, la CPU revient automatiquement à l'exécution originale Continue dans le programme suspendu. Ce type de programme est interrompu pendant l'exécution pour des raisons externes, ce que l'on appelle une interruption .

        Deux concepts importants:

        <1>  Fonction de service d'interruption : le programme de traitement correspondant exécuté après que le noyau a répondu à l'interruption.

        <2>  Vecteur d'interruption : l'adresse d'entrée de la routine de service d'interruption. Chaque source d'interruption correspond à une adresse d'entrée fixe. Lorsque le noyau répond à une demande d'interruption, il suspend l'exécution du programme en cours, puis passe à l'adresse d'entrée pour exécuter le code.

Deuxièmement, le système d'interruption du CC2530

        CC2530 a 18 sources d'interruption , et chaque source d'interruption est contrôlée par sa propre série de registres de fonctions spéciales . Peut être programmé pour définir les registres de fonctions spéciales appropriés, définir la priorité de 18 sources d'interruption et activer la réponse de l'application d'interruption. Les sources d'interruption couramment utilisées sont les suivantes:

Trois, méthode d'écriture de la fonction de traitement d'interruption CC2530

        La fonction de service d'interruption est différente de la fonction personnalisée générale et a un format d'écriture spécifique :

<1> Avant chaque fonction de service d'interruption, une première phrase doit être ajoutée :

        #pragma vector  = < vecteur d'interruption >

        <Vecteur d'interruption> indique que la fonction de service d'interruption à écrire ensuite sert cette source d'interruption. Il existe deux manières d'écrire cette instruction:

        #pragma vector = 0x7B     ou     #pragma vector = P1INT_VECTOR

        La première est l'adresse d'entrée du vecteur d'interruption et la seconde est la définition de la macro dans le fichier d' en- tête "ioCC2530.h" .

<2> Le  mot clé _ _interrupt indique que la fonction est une fonction de service d'interruption, <nom de la fonction> peut être personnalisé et le corps de la fonction ne peut pas avoir de paramètres ou de valeurs de retour .

Quatrièmement, l'interruption externe de CC2530

        Chaque broche dans les P0, P1 et P2 de ports CC2530 a une fonction d'entrée d' interruption externe. Pour certaines broches ont une fonction d' interruption externe, vous devez régler correctement le IENx registre, PxIEN registre et PICTL registre. En plus de chaque source d'interruption ayant son propre interrupteur de validation d'interruption, le système d'interruption dispose également d'un interrupteur principal, qui peut être activé avec " EA = 1 ;".

        Les ports P0, P1 et P2 utilisent respectivement P0IF, P1IF et P2IF comme bits d'indicateur d'interruption . Lorsqu'une interruption externe se produit sur une broche d'un groupe de ports, l'indicateur d'interruption du groupe de ports correspondant est automatiquement défini. Notez que l'indicateur d'interruption externe doit être effacé manuellement dans la fonction de service d'interruption, sinon la CPU entrera à plusieurs reprises dans l'interruption. Les registres d' indicateur d'état du port P0IFG , P1IGF et P2IFG correspondent à l'état de déclenchement d'interruption de chaque broche dans les 3 ports. Lorsqu'un déclenchement d'interruption externe se produit sur une broche, le bit indicateur correspondant sera automatiquement défini. Cet indicateur doit également être effacé manuellement.

Cinq, cas de formation: entrée d'interruption externe pour contrôler les lumières LED

[1] Conception de la fonction d'initialisation d'interruption externe Init_INTP ()

        La fonction d'initialisation d'interruption externe consiste principalement à compléter la configuration des registres de fonctions spéciales liées aux interruptions:

        <1> Configurez le registre IENx pour activer la fonction d'interruption du groupe de ports.

        <2> Configurez le registre PxIEN pour activer des broches d'interruption externes spécifiques.

        <3> Configurez le registre PICTL et définissez le mode de déclenchement d'interruption.

[2] Concevez la fonction de service d'interruption externe Int1_Sevice ()

        Lors de l'écriture de fonctions de service d'interruption, le format d'écriture doit être correct et le vecteur d'interruption ne doit pas être erroné. Faites particulièrement attention à: Effacez le groupe de ports et les indicateurs de broche dans la fonction, sinon le CPU entrera à plusieurs reprises dans l'interruption. Vous devez d'abord effacer l'indicateur de broche PxIFG, puis effacer l'indicateur de groupe de ports PxIF.

[3] Le code source et les commentaires du projet de formation

#include "ioCC2530.h"

#define  LED6   P1_4
#define  LED3   P1_0
#define  LED4   P1_1
/*===================延时函数=========================*/
void Delay(unsigned int t)
{
  while(t--);
}
/*==================端口初始化函数=====================*/
void Init_Port()
{
  //将P1_0、P1_1和P1_4设置为通用I/O端口功能
  P1SEL &= ~0x13;
  //将P1_0、P1_1和P1_4的端口传输方式设置为输出
  P1DIR |= 0x13;
  LED6 = 0;
  LED3 = 0;
  LED4 = 0;
}
/*==================跑马灯子函数=====================*/
void LED_Running()
{
  LED3 = 1;
  Delay(50000);
  LED4 = 1;
  Delay(50000);
  LED3 = 0;
  Delay(50000);
  LED4 = 0;
  Delay(50000);
}
/*===============外部中断初始化函数==================*/
void Init_INTP()
{
  IEN2 |= 0x10;         //端口1中断使能
  P1IEN |= 0x04;        //端口P1_2外部中断使能
  PICTL |= 0x02;        //端口P1_0到P1_3下降沿触发
  EA = 1;               //使能总中断
}
/*================外部中断1服务函数====================*/
#pragma vector = P1INT_VECTOR     //外部中断1的向量入口
__interrupt void Int1_Sevice()
{
  LED6 = ~LED6;
/*先清除引脚标志位,再清除端口标志位,否则会不断进入中断*/
  P1IFG &= ~ 0x04;        //软件清除P1_2引脚的标志位
  P1IF = 0;               //软件清除P1端口组的标志位
}
/*====================主函数==========================*/
void main()
{
  Init_Port();          //初始化通用I/O端口
  Init_INTP();          //初始化外部中断
  while(1)
  {
    LED_Running();     //跑马灯
  }
}

 

Je suppose que tu aimes

Origine blog.csdn.net/weixin_44643510/article/details/114319628
conseillé
Classement