Šis raksts ir mašīntulkošanas spoguļraksts, lūdzu, noklikšķiniet šeit, lai pārietu uz oriģinālo rakstu.

Skats: 8951|Atbildi: 0

Zigbee ceļojums (7): Vairāki svarīgi CC2430 pamata eksperimenti - DMA pārraide

[Kopēt saiti]
Publicēts 30.10.2014 23:22:16 | | | |
1. Augšējā un apakšējā līmeņa savienošana

Iepriekšējā sadaļā mēs runājām par ADC izmantošanu un izlasījām mikroshēmas temperatūras sensoru. Faktiskajos projektos sensoru skaits bieži ir liels, un ir jāapstrādā liels apjoms konversijas datu. Šo datu pārvietošana radīs lielu slodzi CPU. Lai atbrīvotu procesoru un dotu tam enerģiju citām lietām, DMA (tiešā piekļuve atmiņai) var noderēt ~

Šis ievads ir izvilkums no Zigbee tehnoloģiju prakses apmācības:

DMA ir saīsinājums no tiešas piekļuves atmiņai, kas ir "tieša piekļuve atmiņai". Tas ir ātrgaitas datu pārraides režīms, kurā perifērijas vienības, piemēram, ADC/UART/RF raiduztvērēji un atmiņa, var apmainīties ar datiem tieši "DMA kontroliera" kontrolē bez nelielas CPU iejaukšanās. Papildus nelielai apstrādei datu pārsūtīšanas sākumā un beigās CPU pārsūtīšanas laikā var veikt arī citus darbus. Tādā veidā CPU un šīs datu mijiedarbības lielāko daļu laika darbojas paralēli. Tā rezultātā sistēmas vispārējo efektivitāti var ievērojami uzlabot.

Kā redzat ievadā, DMA var izmantot daudzos scenārijos. Šis eksperiments ietver tikai vienkāršāko DMA pārraidi, un tā mērķis ir parādīt DMA vispārēju izmantošanu. Kas attiecas uz DMA piemērošanu citos scenārijos, tas nākotnē tiks īstenots visaptverošos eksperimentos.

2. DMA pārraides eksperiments(1) Ievads eksperimentā

Masīva rakstzīmesavota virkneSaturs tiek pārsūtīts uz rakstzīmju masīvu, izmantojot DMAdestString, konvertēšanas rezultāts tiek parādīts datorā, izmantojot seriālo portu.

(2) Programmas plūsmas diagramma

(3) Eksperimentālais pirmkods un analīze/*
    Eksperimentālais apraksts: rakstzīmju masīva sourceString saturs tiek pārsūtīts uz rakstzīmju masīvu destString, izmantojot DMA, un konvertēšanas rezultāts tiek parādīts datorā, izmantojot seriālo portu.
*/

#include

#define led1 P1_0         
#define led2 P1_1         
#define led3 P1_2         
#define led4 P1_3

/*用于配置DMA的结构体
-------------------------------------------------------*/
#pragma bitlauki=apgriezti
typedef Struktūra
{
  bez paraksta oglesSRCADDRH;           //源地址高8位
  bez paraksta oglesSRCADDRL;           //源地址低8位
  bez paraksta oglesDESTADDRH;         //目的地址高8位
  bez paraksta oglesDESTADDRL;         //目的地址低8位
  bez paraksta oglesVLEN :3;     //长度域模式选择
  bez paraksta oglesLENHS:5;     //传输长度高字节
  bez paraksta oglesLENL :8;     //传输长度低字节
  bez paraksta oglesVĀRDA LIELUMS:1;     //字节(byte)或字(word)传输
  bez paraksta oglesTMODE :2;     //传输模式选择
  bez paraksta oglesTRIG :5;     //触发事件选择
  bez paraksta oglesSRCINC :2;     //源地址增量:-1/0/1/2
  bez paraksta oglesDESTINC :2;     //目的地址增量:-1/0/1/2
  bez paraksta oglesIRQMASK :1;     //中断屏蔽
  bez paraksta oglesM8 :1;     //7或8bit传输长度,仅在字节传输模式下适用
  bez paraksta oglesPRIORITĀTE :2;     //优先级
}DMA_CFG;
#pragma bitfields=noklusējums

/*系统时钟初始化
-------------------------------------------------------*/
Tukšumsxtal_init (Tukšums)
{
  MIEGS &= ~0x04;            //都上电
  kamēr(! (MIEGS &0x40));     //晶体振荡器开启且稳定
  CLKCON &= ~0x47;            Izvēlieties 32MHz kristāla oscilatoru
  MIEGS |=0x04;
}

/*LED初始化
-------------------------------------------------------*/
Tukšumsled_init (Tukšums)
{
  P1SEL =0x00;         P1 ir parastais I/O ports
  P1DIR |=0x0F;         P1.0 P1.1 P1.2 P1.3 izeja
  
  led1 =1;               //关闭所有LED
  led2 =1;
  led3 =1;
  led4 =1;
}

/*UART0通信初始化
-------------------------------------------------------*/
TukšumsUart0Init(bez paraksta oglesStopBits,bez paraksta oglesParitāte)
{
   P0SEL |=  0x0C;                  //初始化UART0端口,设置P0.2与P0.3为外部设备IO口
   PERCFG&= ~0x01;                  Izvēlieties UART0 kā pirmo izvēles pozīciju, tas ir, RXD uz P0.2 un TXD uz P0.3
   
   U0CSR =0xC0;                    Iestatiet UART režīmu un iespējojiet akceptoru
   
   U0GCR =11;
   U0BAUD =216;                    //设置UART0波特率为115200bps
   
   U0UCR |= StopBits| Paritāte;        //设置停止位与奇偶校验
}

/*UART0发送数据
-------------------------------------------------------*/
Tukšums  Uart0Sūtīt(bez paraksta oglesdati)
{
  kamēr(U0CSR &0x01);   //等待UART空闲时发送数据
  U0DBUF = dati;
}

/*UART0发送字符串
-------------------------------------------------------*/
TukšumsUart0SendString(bez paraksta ogles*s)
{
  kamēr(*s !=0)         //依次发送字符串s中的每个字符
    Uart0Sūtīt(*s++);
}

/*主函数
-------------------------------------------------------*/
Tukšumsgalvenais(Tukšums)
{
  DMA_CFG dmaConfig;      //定义配置结构体
  
  bez paraksta oglesavotsVirkne[]="Es esmu sourceString!";      //源字符串
  bez paraksta oglesdestString[izmērs(avotsVirkne)] ="Es esmu destString!";  //目的字符串
  
  oglesi;
  ogleskļūda =0;
  
  xtal_init ();            //系统时钟初始化
  led_init ();
  Uart0Init(0x00,0x00);   //UART初始化
  
  Uart0SendString(avotsVirkne);         //传输前的原字符数组
  Uart0SendString(destString);           //传输前的目的字符数组
  
  //配置DMA结构体
  dmaConfig.SRCADDRH=(bez paraksta ogles)((bez paraksta int)&sourceString >>8);     //源地址
  dmaConfig.SRCADDRL=(bez paraksta ogles)((bez paraksta int)&sourceString);
   
  dmaConfig.DESTADDRH=(bez paraksta ogles)((bez paraksta int)&destString >>8);      //目的地址
  dmaConfig.DESTADDRL=(bez paraksta ogles)((bez paraksta int)&destString);
  
  dmaConfig.VLEN=0x00;         //选择LEN作为传送长度
  
  dmaConfig.LENH=(bez paraksta ogles)((bez paraksta int)izmērs(avotsVirkne) >>8);  //传输长度
  dmaConfig.LENL=(bez paraksta ogles)((bez paraksta int)izmērs(avotsVirkne));
  
  dmaConfig.WORDSIZE=0x00;     //选择字节(byte)传送
  
  dmaConfig.TMODE=0x01;        //选择块传送(block)模式
  
  dmaConfig.TRIG=0;            Nav trigera (var saprast kā manuālu iedarbināšanu)
  
  dmaConfig.SRCINC=0x01;      //源地址增量为1
  
  dmaConfig.DESTINC=0x01;      //目的地址增量为1
  
  dmaConfig.IRQMASK=0;         //DMA中断屏蔽
   
  dmaConfig.M8=0x00;           //选择8位长的字节来传送数据
  
  dmaConfig.PRIORITY=0x02;     //传输优先级为高
  

  DMA0CFGH=(bez paraksta ogles)((bez paraksta int)&dmaConfig >>8);   //将配置结构体的首地址赋予相关SFR
  DMA0CFGL=(bez paraksta ogles)((bez paraksta int)&dmaConfig);
  
  DMAARM=0x01;                 //启用配置
  
  DMAIRQ =0x00;                 //清中断标志
  DMAREQ =0x01;                 //启动DMA传输
  
  kamēr(! (DMAIRQ &0x01));               //等待传输结束
  
  par(i =0; i <izmērs(avotsVirkne); i++)   //校验传输的正确性
  {
    ja(avotsVirkne!=destString)
      kļūda ++;
  }
  
  ja(kļūda ==0)                          //将结果通过串口传输到PC
  {
    Uart0SendString("Pareizi!");
    Uart0SendString(destString);        //传输后的目的字符数组
  }
  citādi
    Uart0SendString("Kļūda!");

  kamēr(1);
}

DMA izmantošanas pamatprocess ir:DMA konfigurēšanaIespējot konfigurācijuSākt DMA pārsūtīšanu → Pagaidiet, līdz DMA pārsūtīšana tiks pabeigta.Attiecīgi ir šādi:

  (1) Konfigurējiet DMA: Pirmkārt, DMA ir jākonfigurē, bet DMA konfigurācija ir īpaša: tā vietā, lai tieši piešķirtu vērtības dažiem SFR, tā definē struktūru ārēji, piešķir tai vērtības un pēc tam piešķir šīs struktūras pirmās adreses augstos 8 bitusDMA0CFGH, piešķirot tam mazāku 8 ciparu skaitliDMA0CFGL。 (Detalizētus norādījumus konfigurācijas struktūrā, lūdzu, skatiet CC2430 ķīniešu rokasgrāmatā)

CC2430 padomi
Ir divi punkti, kas jāprecizē par konfigurācijas struktūru definīciju iepriekš minētajā avota kodā:
(1) Bitu domēns
Definējot šo struktūru, tiek izmantoti daudz kolu (:), kam seko skaitlis, ko sauc par "bitu lauku":
Bitu domēns nozīmē, ka informācijai nav jāaizņem pilns baits, kad tā tiek glabāta, bet aizņem tikai dažus vai vienu bināro bitu. Piemēram, saglabājot komutācijas daudzumu, ir tikai divi stāvokļi, 0 un 1, un jūs varat izmantot vienu bitu bināru. Lai ietaupītu krātuves vietu un atvieglotu apstrādi, C nodrošina datu struktūru, ko sauc par "bitu lauku" vai "bitu lauku". Tā sauktais "bitu lauks" sadala bināros failus baitā vairākos dažādos reģionos un apraksta bitu skaitu katrā reģionā. Katram domēnam ir domēna nosaukums, kas ļauj programmā veikt darbības pēc domēna nosaukuma. Tas ļauj baitu binārā bitlaukā attēlot vairākus dažādus objektus.
(2) Abstraktas kopīgas funkcijas
Uzmanīgi lasītāji atklās, ka vērtības piešķiršana struktūrai bieži ietver 16 bitu neparakstītas int tipa vērtības piešķiršanu divām 8 bitu neparakstītām rakstzīmes tipa vērtībām šādi:
dmaConfig.SRCADDRH=(bez paraksta ogles)((bez paraksta int)&sourceString >>8);     //源地址
dmaConfig.SRCADDRL=(bez paraksta ogles)((bez paraksta int)&sourceString);

Šāda veida bieži izmantotajai funkcijai mēs to varētu abstrahēt kā vispārēju funkciju šādi:
#define SET_WORD(destH,destL,vārds)
    darīt{
       destH=(bez paraksta ogles)((bez paraksta int)vārdu >>8);     
       destL=(bez paraksta ogles)((bez paraksta int)vārds);
    }kamēr(0)

Nākotnē, kad jums ir nepieciešams veikt līdzīgu sadalīšanas operāciju, varat to izsaukt tieši:
SET_WORD(dmaConfig.SRCADDRH, dmaConfig.SRCADDRL, &sourceString);


  (2) Iespējot konfigurāciju: Pirmkārt, struktūras pirmā adrese&dmaConfigAugstie / zemie 8 biti tiek piešķirti attiecīgi SFRDMA0CFGHunDMA0CFGL(kur 0 apzīmē 0 kanāla konfigurāciju, CC2430 satur 5 DMA kanālus, šeit tiek izmantots 0 kanāls). JāDMAARM.0Piešķiriet vērtību 1, lai iespējotu kanāla 0 konfigurāciju tā, lai kanāls 0 būtu darba režīmā.

  (3) Iespējot DMA pārraidi:Pa labiDMAREQ.0Piešķiriet vērtību 1, lai sāktu kanāla 0 DMA pārraidi.

  (4) Pagaidiet, līdz DMA tiks nosūtīts:Pēc kanāla 0 DMA pārraidīšanas tiks aktivizēts pārtraukums un tiks aktivizēts kanāla 0 pārtraukuma karodziņšDMAIRQ.0tiks automātiski iestatīts uz 1. Pēc tam katra abu virkņu rakstzīme tiek salīdzināta, un verifikācijas rezultāts tiek nosūtīts uz datoru.

(4) Eksperimenta rezultāti

Vispirms atveriet seriālā porta atkļūdošanas rīku un pēc tam sāciet CC2430 atkļūdošanu, un parādīsies šāds ekrāns:

Jūs atradīsietdestStringSaturs ir pilnībā atklātsavota virknepiepildīts.

Gatavs ~

3. Secinājums

Šī sadaļa iepazīstina ar DMA izmantošanu, lai gan tas ir ļoti vienkārši, bet es domāju, ka jūs esat sapratis DMA pamata lietojumu, un jūs varat to mierīgi analizēt, nākotnē saskaroties ar tā sarežģītajiem lietošanas scenārijiem.

Neatkarīgi no tā, cik laba ir darbvirsma, tā iesaldēs, un līdzīgi iegultā sistēma neizbēgami stagnēs. Nākamajā sadaļā mēs iepazīstināsim ar ļoti efektīvu sistemātiskas atiestatīšanas metodi: sargsuņi.






Iepriekšējo:Zigbee ceļojums (6): Vairāki svarīgi CC2430 pamata eksperimenti - ADC viena paraugu ņemšana
Nākamo:Zigbee ceļojums (8): Vairāki svarīgi CC2430 pamata eksperimenti - sargsuņi
Atruna:
Visa programmatūra, programmēšanas materiāli vai raksti, ko publicē Code Farmer Network, ir paredzēti tikai mācību un pētniecības mērķiem; Iepriekš minēto saturu nedrīkst izmantot komerciāliem vai nelikumīgiem mērķiem, pretējā gadījumā lietotājiem ir jāuzņemas visas sekas. Informācija šajā vietnē nāk no interneta, un autortiesību strīdiem nav nekāda sakara ar šo vietni. Iepriekš minētais saturs ir pilnībā jāizdzēš no datora 24 stundu laikā pēc lejupielādes. Ja jums patīk programma, lūdzu, atbalstiet oriģinālu programmatūru, iegādājieties reģistrāciju un iegūstiet labākus oriģinālus pakalpojumus. Ja ir kādi pārkāpumi, lūdzu, sazinieties ar mums pa e-pastu.

Mail To:help@itsvse.com