DSP28335学习记录(四)——ADC、DMA
本文記錄一下仿真模式下的printf()的使用,ADC,DMA,
目錄
一、仿真模式下的printf()
二、ADC
?2.1 ADC模式
2.2 觸發(fā)源,中斷,覆蓋功能
2.3 如何初始化配置
三、DMA
一、仿真模式下的printf()
這塊推薦這個:CCS中printf()的使用
其實想找一下用仿真器的COM口做串口的方法,沒有找到。這個在CCS仿真模式下直接用printf的方式,還挺方便的。
二、ADC
F28335 的 ADC 模塊主要包括以下特點:
- --12 位模數(shù)轉(zhuǎn)換
- --2 個采樣保持器(S/H)
- --同時或順序采樣
- --模擬電壓輸入范圍 0-3V
- --ADC 轉(zhuǎn)換時鐘頻率最高可配置為 25MHz,采樣帶寬 12.5MHz
- --16 通道模擬輸入
- --排序器支持 16 通道獨立循環(huán)“自動轉(zhuǎn)換”,每次轉(zhuǎn)換通道可以軟件編程 選擇。
- --16 個結(jié)果寄存器存放 ADC 轉(zhuǎn)換的結(jié)果,轉(zhuǎn)換后的數(shù)字量表示為: 數(shù)字值=4095*(輸入模擬值-ADCLO)/3,輸入模擬值在 0-3V 之間
-
--多個觸發(fā)源啟動 ADC 轉(zhuǎn)換(SOC):?
①S/W--軟件立即啟動
②外部引腳
③ePWMx SOCA 啟動
④ePWMx SOCB 啟動
- --靈活的中斷控制,允許每個或者每隔一個序列轉(zhuǎn)換結(jié)束產(chǎn)生中斷請求
- --排序器可工作在啟動/停止模式
- --采樣保持(S/H)采集時間窗口有獨立的預(yù)定標(biāo)控制
在使用 ADC 轉(zhuǎn)換模塊時,特別要注意的是 F28335 的 AD 的輸入范圍 0-3V,若 輸入負電壓或高于 3V 的電壓就會燒壞 AD 模塊,這一點要務(wù)必引起重視。超出輸 入范圍的電壓可在前級電路,通過電阻進行分壓,或經(jīng)運放比例電路進行處理后 再輸入。連接到 ADCINxx 引腳的模擬輸入信號要盡可能的遠離數(shù)字電路信號線, ADC 模塊的電源供電要與數(shù)字電源電源隔離開,避免數(shù)字電源的高頻干擾,ADC 的參考源是影響 AD 精度的一個重要因數(shù),注意 ADC 參考源的電壓紋波處理
ADC的內(nèi)部框圖:16個輸入通道,分AB兩組,兩個采樣保持器,一個轉(zhuǎn)換模塊,兩個排序器。
由于有兩個采樣保持器,所以根據(jù)工作方式分:順序采樣,同步采樣。后面講。
雙排序器根據(jù)工作方式分:級聯(lián)模式,雙排序器模式。
以上兩個模塊排列組合,ADC共有4中模式。
?2.1 ADC模式
1,級聯(lián)模式
在級聯(lián)排序器操作方式下,2 個 8 狀態(tài)排序器(SEQ1 和 SEQ2)構(gòu)成一個 16狀態(tài)的排序SEQ。只能設(shè)置一個觸發(fā)源,按照順序轉(zhuǎn)換。
2,雙排序器模式
兩個排序器獨立運行,分別獨立設(shè)置一個觸發(fā)源,只有一個AD轉(zhuǎn)換模塊,所以分時復(fù)用,轉(zhuǎn)換順序下圖。?
3,順序采樣
和級聯(lián)排序模式下一樣,就是按照順序轉(zhuǎn)換。級聯(lián)排序其順序采樣也是最常用的模式。
4,同步采樣
如果一個輸入來自 ADCINA0-ADCINA7,另一個輸入來自 ADCINB0-ADCINB7, ADC 能夠?qū)崿F(xiàn) 2 個 ADCINxx 輸入的同時采樣。此外,要求 2 個輸入必須有同樣的 采樣和保持偏移量(比如 ADCINA4 和 ADCINB4,不能是 ADCINA7 和 ADCINA6)。 為了讓 ADC 模塊工作在同步采樣模式,必須設(shè)置 ADCTRL3 寄存器中的 SMODE_SEL 位為 1。
在同步采樣模式下,CONVxx 寄存器的最高位不起作用,每個采樣和保持緩沖 器對 CONVxx 寄存器低 3 位確定的引腳進行采樣。例如,如果 CONVxx 寄存器的值 是 0110b,ADCINA6 就由采樣保持器 A 采樣,ADCINB6 有采樣保持器 B 采樣,和 1110b 的效果是一樣的,如果 CONVxx 寄存器的值是 1001b,ADCINA1 由采樣和保 持器 A 采樣,ADCINB1 由采樣和保持器 B 采樣。采樣保持兩路可以同步進行,因 為有兩個采樣保持器,但是轉(zhuǎn)換不可能同時進行。轉(zhuǎn)換器首先轉(zhuǎn)換采樣保持器 A 中鎖存的電壓量,然后轉(zhuǎn)換采樣保持器 B 中鎖存的電壓量。采樣保持器 A 轉(zhuǎn)換的 結(jié)果保存到當(dāng)前的 ADCRESULTn 寄存器(如果排序器已經(jīng)復(fù)位,SEQ1 的結(jié)果放到 ADCRESULT0),采樣保持器 B 轉(zhuǎn)換的結(jié)果保存到下一個(順延)ADCRESULTn 寄 存器(如果排序器已經(jīng)復(fù)位,SEQ1 的結(jié)果放到 ADCRESULT1),結(jié)果寄存器指針 每次增加 2。
2.2 觸發(fā)源,中斷,覆蓋功能
1,觸發(fā)源
2,中斷
?在不同工作模式下如何使用中斷模式 1 和中斷模式 2。
情形 1:在第 1 個和第 2 個序列中采樣的數(shù)量不相等。
(1)中斷模式 1(每個 EOS 到來時產(chǎn)生中斷請求)
①排序器用 MAX_CONVn=1 初始化,轉(zhuǎn)換 I1 和 I2。
②在中斷服務(wù)子程序 a 中,通過軟件將 MAX_CONVn 的值設(shè)為 2,轉(zhuǎn)換 V1、V2 和 V3。
③在中斷服務(wù)子程序 b 中,完成下列任務(wù):
--將 MAX_CONVn 的值再次設(shè)置為 1,轉(zhuǎn)換 I1 和 I2。
--從 ADC 結(jié)果寄存器中讀出 I1、I2、V1、V2 和 V3 的值。
--復(fù)位排序器。
④重復(fù)操作第②、③步。每次 SEQ_CNTRn 等于 0 時產(chǎn)生中斷,并且中斷能夠 被識別。
情形 2:在第 1 個和第 2 個序列中采樣的數(shù)量相等。
(2)中斷模式 2 操作(每隔一個 EOS 信號產(chǎn)生中斷請求)
①排序器設(shè)置 MAX_CONVn=2 初始化,轉(zhuǎn)換 I1、I2、I3 或 V1、V2 和 V3。
②在服務(wù)子程序 b 和 d 中,完成下列任務(wù)。
--從 ADC 結(jié)果寄存器中讀出 I1、I2、I3 或者 V1、V2 和 V3 的值。
--復(fù)位排序器。
--重復(fù)第②步。
情形 3:兩個序列的采樣個數(shù)是相等的(帶空讀)
(3)中斷模式 2(隔一個 EOS 信號產(chǎn)生中斷請求)
①MAX_CONVn=2,初始化序列器,轉(zhuǎn)換 I1、I2 和 x(空采樣)。
②在中斷服務(wù)子程序 b 和 d 中,完成下列任務(wù):
--從 ADC 結(jié)果寄存器中讀出 I1、I2、x、V1、V2 和 V3 的值。
--復(fù)位排序器。
--重復(fù)第②步。在①中,I1、I2 后的 X 采樣為一個空的采樣,其實并沒有要求采樣。然而利用模式 2 間隔產(chǎn)生中斷請求的特性,可以減小中斷服務(wù)子程序和 CPU 的開銷。
3,排序器覆蓋功能:(開DMA時,需要使能)
通常在運行模式下,排序器 SEQ1、SEQ2 或者級聯(lián) SEQ 用于選擇 ADC 通道, 并將轉(zhuǎn)換的結(jié)果存儲在相應(yīng)的 ADCRESULTn 寄存器中。在 MAX_CONVn 設(shè)置的轉(zhuǎn)換 結(jié)束時,排序器自動返回 0。在使用排序器覆蓋功能時,排序器的自動返回可通 過軟件控制,這由 ADC 控制寄存器 1(ADCCTRL1)的第 5 位控制。例如假定 SEQOVRD 位為 0,ADC 工作在級聯(lián)模式下的連續(xù)轉(zhuǎn)換模式,MAX_CONV1 設(shè)置為 7,通常情況 下,排序器會遞增并將 ADC 轉(zhuǎn)換結(jié)果更新結(jié)果寄存器到 ADCRESULT7 寄存器,然 后返回到 0,。當(dāng) ADCRESULT7 寄存器更新完成后,相應(yīng)的中斷標(biāo)志位被置位。當(dāng) SEQ_OVRD 位被重新置位,排序器在更新 7 個結(jié)果寄存器后不再回繞到 0,而將繼 續(xù)增加,并更新 ADCRESULT8 寄存器,直到 ADCRESULT15 為止。ADCRESULT15 寄 存器更新完畢再返回到 0。這可以將結(jié)果寄存器看成 FIFO,用于 ADC 對連續(xù)數(shù)據(jù) 的捕捉。當(dāng) ADC 在最高數(shù)據(jù)速率下進行轉(zhuǎn)換時,這個功能有助于捕捉 ADC 的數(shù)據(jù)
2.3 如何初始化配置
ADC有8個設(shè)置寄存器,不過使用起來很簡單。
ADC配置步驟:
1,ADC外設(shè)時鐘使能
2,高速外設(shè)時鐘分頻。從系統(tǒng)時鐘進入ADC模塊的,最高25M。
3,ADC初始化。
4,ADC內(nèi)核時鐘分頻。用于ADC轉(zhuǎn)換的。
5,采樣持續(xù)時間。
6,排序器模式
7,采樣方式。
8,設(shè)置輸入通道,開幾個口就設(shè)置幾個。
9,設(shè)置最大通道數(shù)。
10,設(shè)置是否連續(xù)轉(zhuǎn)換。
(11,排序器覆蓋模式使能,開DMA時)
(12,使能SOC觸發(fā)。用SOC信號觸發(fā)模式時)
13,使能排序器。
例程,非DMA模式
#define ADC_MODCLK 3 #define ADC_CKPS 0x1 // ADC module clock = HSPCLK/2*ADC_CKPS = 25.0MHz/(1*2) = 12.5MHz #define ADC_SHCLK 0xf // S/H width in ADC module periods = 16 ADC clocksvoid ADC_Init(void) {// Specific clock setting for this example:EALLOW;SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1; // ADCEDIS;// Specific clock setting for this example:EALLOW;SysCtrlRegs.HISPCP.all = ADC_MODCLK; // HSPCLK = SYSCLKOUT/(2*ADC_MODCLK) 25MEDIS;InitAdc(); // For this example, init the ADC// Specific ADC setup for this example:AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS; //時鐘分頻25/(ADC_CKPS+1)=12.5MAdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK; //采樣持續(xù)時間,最大值A(chǔ)dcRegs.ADCTRL1.bit.SEQ_CASC = 1; // 級聯(lián)模式AdcRegs.ADCTRL3.bit.SMODE_SEL = 0; //順序采樣AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0; //ADC通道0配置AIN0AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 1; //ADC通道0配置AIN1AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 2; //ADC通道0配置AIN2AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 2; //最大轉(zhuǎn)換通道數(shù)AdcRegs.ADCTRL1.bit.CONT_RUN = 0; // 非連續(xù)轉(zhuǎn)換模式AdcRegs.ADCTRL1.bit.SEQ_OVRD = 1; //// Start SEQ1AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1; //使能epwm_SOCA信號的觸發(fā)SQE1AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; //使能SEQ1}Uint16 Read_ADCValue(void) {while (AdcRegs.ADCST.bit.INT_SEQ1== 0);AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;return AdcRegs.ADCRESULT0>>4; }三、DMA
28335的DMA用起來很簡單,只是幾個功能函數(shù)參數(shù)可能有點不好理解。
DMA配置方式:
1,使能DMA外設(shè)時鐘,
2,初始化DMA。
3,配置下面幾個函數(shù):
????????DMACH1AddrConfig
????????DMACH1BurstConfig
????????DMACH1TransferConfig
????????DMACH1WrapConfig
????????DMACH1ModeConfig
4,啟動DMA。
DMACH1BurstConfig:幀函數(shù),一個觸發(fā)信號執(zhí)行一次
三個參數(shù):
數(shù)據(jù)個數(shù)(類型Uint16),
每傳一個數(shù)據(jù),源指針增加量,
每傳一個數(shù)據(jù),目的指針增加量。
DMACH1TransferConfig:傳輸函數(shù),主要設(shè)置幾幀數(shù)據(jù)產(chǎn)生一個中斷
三個參數(shù):
幀個數(shù),達到數(shù)會產(chǎn)生中斷,
每傳一幀,源指針增加量,
每傳一幀,目的指針增加量。
?DMACH1WrapConfig:打包函數(shù),主要設(shè)置返回步長。
四個參數(shù):
執(zhí)行多少幀,源指針將返回,
源指針返回之后,加上一個偏移量。
執(zhí)行多少幀,目的指針將返回,
目的指針返回之后,加上一個偏移量。
(其實不難理解,我們看一下寄存器的說明就清楚了。)
細心的可能發(fā)現(xiàn) DMACH1TransferConfig 和 DMACH1WrapConfig 指針偏移量某些情況下好像有功能重合。數(shù)據(jù)手冊中提到過,DMACH1WrapConfig設(shè)置偏移量時,會忽略DMACH1TransferConfig的偏移量。DMACH1WrapConfig的打包幀個數(shù)大于DMACH1TransferConfig時,DMACH1WrapConfig將失效。?
DMACH1ModeConfig是DMA配置寄存器:
①persel--選擇觸發(fā)源,值為下列選項:
????????DMA_SEQ1INT--------ADC
????????DMA_SEQ2INT--------ADC
????????DMA_XINT1 --------外部中斷
????????DMA_XINT2 --------外部中斷
????????DMA_XINT3 --------外部中斷
????????DMA_XINT4 --------外部中斷
????????DMA_XINT5 --------外部中斷
????????DMA_XINT6 --------外部中斷
????????DMA_XINT7 --------外部中斷
????????DMA_XINT13 --------外部中斷
????????DMA_TINT0 --------CPU 時鐘
????????DMA_TINT1 --------CPU 時鐘
????????DMA_TINT2 --------CPU 時鐘
????????DMA_MXEVTA --------McBSP-A
????????DMA_MREVTA --------McBSP-A
????????DMA_MXREVTB --------McBSP-B
????????DMA_MREVTB --------McBSP-B
②perinte--使能觸發(fā)源,值為 PERINT_DISABLE 或 PERINT_ENABLE。
③oneshot--使能 oneshot 模式,值為 ONESHOT_DISABLE 或 ONESHOT_ENABLE。此模式下,一次觸發(fā)完成全部 burst。
④cont--使能 Continuous 模式,值為 CONT_DISABLE 或 CONT_ENABLE。此模 式下,傳送完畢后 DMA 重新被初始化,并等待觸發(fā)源。
⑤synce--使能外圍設(shè)備同步,值為 SYNC_DISABLE 或 SYNC_ENABLE。
⑥syncsel--同步選擇。值為 SYNC_SRC 或 SYNC_DST。
⑦ovrinte--使能溢出中斷。值為 OVRFLOW_DISABLE 或 OVEFLOW_ENABLE。
⑧datasize--每次傳送位數(shù)。值為 SIXTEEN_BIT 或 THIRTYTWO_BIT。
⑨chintmode--通道中斷產(chǎn)生模式。CHINT_BEGIN:傳送開始發(fā)中斷。 CHINT_END:傳送結(jié)束發(fā)中斷。
⑩chinte--使能通道中斷。值為 CHINT_DISABLE 或 CHINT_ENABL
上例程,
void DMACH1_ADC_Init(volatile Uint16 *DMA_Dest,volatile Uint16 *DMA_Source) {EALLOW;SysCtrlRegs.PCLKCR3.bit.DMAENCLK = 1; // DMA ClockEDIS;// Initialize DMADMAInitialize();// Configure DMA ChannelDMACH1AddrConfig(DMA_Dest,DMA_Source);DMACH1BurstConfig(3,1,1); //每幀傳4個數(shù),每傳一個數(shù)指針加1DMACH1TransferConfig(9,1,1); //傳10幀數(shù)據(jù)觸發(fā)中斷,每幀之間指針加1DMACH1WrapConfig(0ffff,0,0ffff,0); //關(guān)閉打包DMACH1ModeConfig(DMA_SEQ1INT, //觸發(fā)源SEQ1PERINT_ENABLE, //使能觸發(fā)源ONESHOT_DISABLE, //關(guān)閉單次運行CONT_ENABLE, //使能連續(xù)運行SYNC_DISABLE, //關(guān)閉同步SYNC_SRC, //和源設(shè)備同步OVRFLOW_DISABLE, //關(guān)閉溢出中斷SIXTEEN_BIT, //16位傳送CHINT_END, //傳送結(jié)束產(chǎn)生中斷CHINT_ENABLE); //使能中斷通道StartDMACH1(); //啟動DMA}interrupt void local_DINTCH1_ISR(void) // DMA Channel 1 {// To receive more interrupts from this PIE group, acknowledge this interruptPieCtrlRegs.PIEACK.bit.ACK7 = 1;// asm (" ESTOP0");//ok // for(;;); }待續(xù)。。
總結(jié)
以上是生活随笔為你收集整理的DSP28335学习记录(四)——ADC、DMA的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使jets3t支持https
- 下一篇: 记录关于富文本编辑器出现的不能插入图片问