Cet article est un article miroir de traduction automatique, veuillez cliquer ici pour accéder à l’article original.

Vue: 8951|Répondre: 0

Zigbee Journey (7) : Plusieurs expériences fondamentales importantes de CC2430 - transmission DMA

[Copié le lien]
Publié sur 30/10/2014 23:22:16 | | | |
1. Reliant les niveaux supérieur et inférieur

Dans la section précédente, nous avons parlé de l’utilisation des ADC et échantillonné le capteur de température intégré à la puce. Dans les projets réels, le nombre de capteurs est souvent important et une grande quantité de données de conversion doit être traitée. Déplacer ces données mettrait beaucoup de pression sur le processeur. Pour libérer le CPU et lui donner l’énergie nécessaire pour faire d’autres choses, le DMA (Direct Memory Access) peut s’avérer utile~

L’introduction suivante est extraite du tutoriel de pratique technologique Zigbee :

DMA est une abréviation d’accès direct à la mémoire, qui correspond à « accès direct à la mémoire ». Il s’agit d’un mode de transmission de données à haute vitesse dans lequel des unités périphériques telles que les émetteurs-récepteurs et la mémoire ADC/UART/RF peuvent échanger des données directement sous le contrôle du « contrôleur DMA » sans intervention limitée du CPU. En plus de faire un peu de traitement au début et à la fin du transfert de données, le CPU peut effectuer d’autres tâches pendant le transfert. Ainsi, le processeur et ces interactions de données fonctionnent en parallèle la plupart du temps. En conséquence, l’efficacité globale du système peut être grandement améliorée.

Comme vous pouvez le voir dans l’introduction, la DMA peut être utilisée dans de nombreux scénarios. Cette expérience implique uniquement la transmission DMA la plus simple et vise à démontrer l’utilisation générale de la DMA. Quant à l’application de la DMA dans d’autres scénarios, elle sera mise en œuvre dans des expériences globales à l’avenir.

2. Expérience de transmission DMA(1) Introduction à l’expérience

Caractères du tableausourceStringLe contenu est transféré dans la matrice de caractères via DMAdestString, le résultat de conversion est affiché sur le PC via le port série.

(2) Organigramme de programme

(3) Code source expérimental et analyse/*
    Description expérimentale : Le contenu de la sourceString du tableau de caractères est transféré vers le tableau de caractères destString via DMA, et le résultat de la conversion est affiché sur le PC via le port série.
*/

#include

#define menait P1_0         
#define P1_1         
#define a mené 3 P1_2         
#define P1_3 mené

/*用于配置DMA的结构体
-------------------------------------------------------*/
#pragma champs binaires = inversé
typedef struct
{
  non signé CharSRCADDRH ;           //源地址高8位
  non signé CharSRCADDRL ;           //源地址低8位
  non signé CharDESTADDRH ;         //目的地址高8位
  non signé CharDESTADDRL ;         //目的地址低8位
  non signé CharVLEN :3;     //长度域模式选择
  non signé CharLENH :5;     //传输长度高字节
  non signé CharLENL :8;     //传输长度低字节
  non signé CharTAILLE DU MOT :1;     //字节(byte)或字(word)传输
  non signé CharTMODE :2;     //传输模式选择
  non signé CharTRIG :5;     //触发事件选择
  non signé CharSRCINC :2;     //源地址增量:-1/0/1/2
  non signé CharDESTINC :2;     //目的地址增量:-1/0/1/2
  non signé CharIRQMASK :1;     //中断屏蔽
  non signé CharM8 :1;     //7或8bit传输长度,仅在字节传输模式下适用
  non signé CharPRIORITÉ :2;     //优先级
}DMA_CFG ;
#pragma champs binaires = par défaut

/*系统时钟初始化
-------------------------------------------------------*/
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 =1;               //关闭所有LED
  mené2 =1;
  mené3 =1;
  mené4 =1;
}

/*UART0通信初始化
-------------------------------------------------------*/
videUart0Init(non signé CharStopBits,non signé CharParité)
{
   P0SEL |=  0x0C;                  //初始化UART0端口,设置P0.2与P0.3为外部设备IO口
   PERCFG&= ~0x01;                  Sélectionnez UART0 comme première position optionnelle, c’est-à-dire RXD vers P0.2 et TXD vers P0.3
   
   U0CSR =0xC0;                    Réglez en mode UART et activez l’accepteur
   
   U0GCR =11;
   U0BAUD =216;                    //设置UART0波特率为115200bps
   
   U0UCR |= StopBits| Parité ;        //设置停止位与奇偶校验
}

/*UART0发送数据
-------------------------------------------------------*/
vide  Uart0Send(non signé Chardonnées)
{
  tandis que(U0CSR&0x01);   //等待UART空闲时发送数据
  U0DBUF = data ;
}

/*UART0发送字符串
-------------------------------------------------------*/
videUart0SendString(non signé Char*s)
{
  tandis que(*s !=0)         //依次发送字符串s中的每个字符
    Uart0Send(*s++) ;
}

/*主函数
-------------------------------------------------------*/
videmain(vide)
{
  DMA_CFG dmaConfig ;      //定义配置结构体
  
  non signé CharsourceString[]=« Je suis la SourceString !";      //源字符串
  non signé ChardestString[Taille(sourceString)] =« Je suis le destString !";  //目的字符串
  
  CharJe;
  CharErreur=0;
  
  xtal_init() ;            //系统时钟初始化
  led_init() ;
  Uart0Init(0x00,0x00);   //UART初始化
  
  Uart0SendString(sourceString) ;         //传输前的原字符数组
  Uart0SendString(destString) ;           //传输前的目的字符数组
  
  //配置DMA结构体
  dmaConfig.SRCADDRH=(non signé Char)((non signé int)& sourceString >>8);     //源地址
  dmaConfig.SRCADDRL=(non signé Char)((non signé int)& sourceString) ;
   
  dmaConfig.DESTADDRH=(non signé Char)((non signé int)&destString >>8);      //目的地址
  dmaConfig.DESTADDRL=(non signé Char)((non signé int)&destString) ;
  
  dmaConfig.VLEN=0x00;         //选择LEN作为传送长度
  
  dmaConfig.LENH=(non signé Char)((non signé int)Taille(sourceString) >>8);  //传输长度
  dmaConfig.LENL=(non signé Char)((non signé int)Taille(sourceString) ;
  
  dmaConfig.WORDSIZE=0x00;     //选择字节(byte)传送
  
  dmaConfig.TMODE=0x01;        //选择块传送(block)模式
  
  dmaConfig.TRIG=0;            Pas de déclencheur (on peut le comprendre comme un déclenchement manuel)
  
  dmaConfig.SRCINC=0x01;      //源地址增量为1
  
  dmaConfig.DESTINC=0x01;      //目的地址增量为1
  
  dmaConfig.IRQMASK=0;         //DMA中断屏蔽
   
  dmaConfig.M8=0x00;           //选择8位长的字节来传送数据
  
  dmaConfig.PRIORITY=0x02;     //传输优先级为高
  

  DMA0CFGH=(non signé Char)((non signé int)&dmaConfig >>8);   //将配置结构体的首地址赋予相关SFR
  DMA0CFGL=(non signé Char)((non signé int)&dmaConfig) ;
  
  DMAARM=0x01;                 //启用配置
  
  DMAIRQ=0x00;                 //清中断标志
  DMAREQ=0x01;                 //启动DMA传输
  
  tandis que(! (DMAIRQ&0x01));               //等待传输结束
  
  pour(i=0; Je <Taille(sourceString) ; i++)   //校验传输的正确性
  {
    si(sourceString!=destString)
      error++ ;
  }
  
  si(erreur==0)                          //将结果通过串口传输到PC
  {
    Uart0SendString(« Correct ! »);
    Uart0SendString(destString) ;        //传输后的目的字符数组
  }
  sinon
    Uart0SendString(« Erreur ! »);

  tandis que(1);
}

Le processus de base pour utiliser la DMA est le suivant :Configurer DMAActiver la configurationCommencez le transfert DMA → Attendez que le transfert DMA se termine.Voici respectivement :

  (1) Configurer le DMA: Tout d’abord, la DMA doit être configurée, mais la configuration de la DMA est particulière : au lieu d’attribuer directement des valeurs à certains SFR, elle définit une structure à l’extérieur, lui attribue des valeurs, puis attribue les 8 bits supérieurs de la première adresse de cette structureDMA0CFGH, ce qui lui donne un chiffre inférieur de 8 chiffresDMA0CFGL。 (Pour des instructions détaillées dans la structure de configuration, veuillez consulter le manuel chinois CC2430)

Conseils CC2430
Il y a deux points à clarifier concernant la définition des structs de configuration dans le code source ci-dessus :
(1) Domaine binaire
Lors de la définition de cette struct, beaucoup de deux-points (:) sont utilisés, suivis d’un nombre, appelé « champ de bits » :
Le domaine binaire signifie que l’information n’a pas besoin d’occuper un octet complet lorsqu’elle est stockée, mais n’occupe qu’un ou quelques bits binaires. Par exemple, lorsqu’on stocke une quantité de commutation, il n’y a que deux états, 0 et 1, et vous pouvez utiliser un bit binaire. Pour économiser de l’espace de stockage et faciliter le traitement, C fournit une structure de données appelée « champ de bits » ou « champ de bits ». Le soi-disant « champ de bits » divise les binaires d’un octet en plusieurs régions différentes et décrit le nombre de bits dans chaque région. Chaque domaine possède un nom de domaine, permettant des opérations par nom de domaine dans le programme. Cela permet de représenter plusieurs objets différents dans un champ binaire d’octets.
(2) Fonctions communes abstraites
Les lecteurs attentifs constateront que l’attribution d’une valeur à une structure implique souvent d’attribuer une valeur de type int non signé de 16 bits à deux valeurs de type char non signé de 8 bits, comme suit :
dmaConfig.SRCADDRH=(non signé Char)((non signé int)& sourceString >>8);     //源地址
dmaConfig.SRCADDRL=(non signé Char)((non signé int)& sourceString) ;

Pour ce type de fonction fréquemment utilisée, autant la faire abstraction comme une fonction générale, comme suit :
#define SET_WORD(destH,destL,word)
    faire{
       destH=(non signé Char)((non signé int)mot >>8);     
       destL=(non signé Char)((non signé int)word) ;
    }tandis que(0)

À l’avenir, chaque fois que vous devrez effectuer une opération de division similaire, vous pourrez l’appeler directement, comme suit :
SET_WORD(dmaConfig.SRCADDRH, dmaConfig.SRCADDRL, &sourceString) ;


  (2) Activer la configuration: D’abord, la première adresse de la structure&dmaConfigLes 8 bits haut/bas sont respectivement attribués à la SFRDMA0CFGHetDMA0CFGL(où 0 représente la configuration du canal 0, CC2430 contient 5 canaux DMA, le canal 0 est utilisé ici). OuiDMAARM.0Attribuez une valeur de 1 pour permettre la configuration du canal 0 afin que le canal 0 soit en mode fonctionnement.

  (3) Activer la transmission DMA :DroiteDMAREQ.0Attribuez une valeur de 1 pour lancer la transmission DMA du canal 0.

  (4) Attendre que la DMA soit transmise :Après la transmission de la DMA du canal 0, l’interruption sera déclenchée, et le drapeau d’interruption du canal 0 sera déclenchéDMAIRQ.0sera automatiquement réglé à 1. Chaque caractère des deux chaînes est ensuite comparé et le résultat de la vérification est envoyé au PC.

(4) Résultats expérimentaux

Ouvrez d’abord l’outil de débogage des ports série, puis lancez le débogage CC2430, et l’écran suivant apparaîtra :

Tu trouverasdestStringLe contenu a été entièrement révélésourceStringrempli.

Fait~

3. Conclusion

Cette section introduit l’utilisation de la DMA, bien que très simple, mais je pense que vous avez compris l’usage de base de la DMA, et vous pouvez aussi l’analyser calmement lors de ses scénarios d’utilisation complexes à l’avenir.

Peu importe la qualité d’un bureau, il va geler, et de même, un système embarqué va inévitablement stagner. Dans la section suivante, nous allons présenter une méthode très efficace de réinitialisation systématique : les chiens de garde.






Précédent:Zigbee Journey (6) : Plusieurs expériences fondamentales importantes de CC2430 - Échantillonnage unique ADC
Prochain:Zigbee Journey (8) : Plusieurs expériences fondamentales importantes de CC2430 - watchdogs
Démenti:
Tous les logiciels, supports de programmation ou articles publiés par Code Farmer Network sont uniquement destinés à l’apprentissage et à la recherche ; Le contenu ci-dessus ne doit pas être utilisé à des fins commerciales ou illégales, sinon les utilisateurs assumeront toutes les conséquences. Les informations sur ce site proviennent d’Internet, et les litiges de droits d’auteur n’ont rien à voir avec ce site. Vous devez supprimer complètement le contenu ci-dessus de votre ordinateur dans les 24 heures suivant le téléchargement. Si vous aimez le programme, merci de soutenir un logiciel authentique, d’acheter l’immatriculation et d’obtenir de meilleurs services authentiques. En cas d’infraction, veuillez nous contacter par e-mail.

Mail To:help@itsvse.com