?? f2812adc_double.c
字號(hào):
//###########################################################################
//
// 文件名稱: F2812ADC_double.c
//
// 功能描述: DSP28 ADC - 測(cè)量?jī)蓚€(gè)模擬輸入電壓,
// 每個(gè)0.1sec由通用定時(shí)器1出發(fā)一次ADC轉(zhuǎn)換;
// 看門狗使能,在主函數(shù)循環(huán)以及ADC的中斷服務(wù)程序中處理
//
//###########################################################################
#include "DSP281x_Device.h"
// 函數(shù)原型聲明.
void Gpio_select(void);
void InitSystem(void);
interrupt void adc_isr(void); // ADC結(jié)果讀取中斷服務(wù)程序
// 全局變量:
int Voltage_A0;
int Voltage_B0;
int ADresult_num = 0;
int ADC_buffer1[512]={0};
int ADC_buffer2[512]={0};
void main(void)
{
unsigned long i;
InitSystem(); // 初始化DSP內(nèi)核寄存器
Gpio_select(); // 配置GPIO復(fù)用寄存器
InitPieCtrl(); // 調(diào)用外設(shè)中斷擴(kuò)展初始化單元 PIE-unit ( 代碼 : DSP281x_PieCtrl.c)
InitPieVectTable(); // 初始化 PIE vector向量表 ( 代碼 : DSP281x_PieVect.c )
InitAdc(); // Function call for basic ADC initialisation
// 重新映射 PIE - Timer 1的比較中斷
EALLOW; // 解除寄存器保護(hù)
PieVectTable.ADCINT = &adc_isr;
EDIS; // 使能寄存器保護(hù)
// 使能ADC中斷: PIE-Group1 , interrupt 6
PieCtrlRegs.PIEIER1.bit.INTx6 = 1;
// 使能 CPU INT1 (連接到CPU-Timer 0中斷)
IER = 1;
// 全局中斷使能和更高優(yōu)先級(jí)的實(shí)時(shí)調(diào)試事件
EINT; // 全局中斷使能INTM
ERTM; // 使能實(shí)時(shí)調(diào)試中斷DBGM
// 配置 ADC
AdcRegs.ADCTRL1.bit.SEQ_CASC = 0; // 雙排序器模式
AdcRegs.ADCTRL1.bit.CONT_RUN = 0; // 非連續(xù)運(yùn)行
AdcRegs.ADCTRL1.bit.CPS = 0; // 預(yù)定標(biāo)系數(shù) = 1
AdcRegs.ADCMAXCONV.all = 0x0001; // SEQ1中設(shè)置2個(gè)轉(zhuǎn)換
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; // 設(shè)置ADCINA0作為第一個(gè)SEQ1變換// 假定在系統(tǒng)初始化中EVA的時(shí)鐘已經(jīng)被使能
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x8; // 設(shè)置ADCINB0作為第二個(gè)SEQ1變換.//由T1/T2邏輯驅(qū)動(dòng) T1PWM / T2PWM
AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1 = 1; // 使能EVASOC啟動(dòng)SEQ1 // GP Timer 1 比較的輸出的有效
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; // 使能SEQ1中斷(每次 EOEvaRegs.GPTCONA.bit.T1PIN = 1);
AdcRegs.ADCTRL3.bit.ADCCLKPS = 2; // HSPCLK進(jìn)行4分頻
// 配置事件管理器 EVA
// Assumes EVA Clock is already enabled in InitSysCtrl();
// 禁止 T1PWM / T2PWM 輸出
EvaRegs.GPTCONA.bit.TCMPOE = 0;
// GP Timer 1 比較輸出強(qiáng)制為低
EvaRegs.GPTCONA.bit.T1PIN = 0;
EvaRegs.GPTCONA.bit.T1TOADC = 2; // 使能事件管理器A的EVASOC
EvaRegs.T1CON.bit.FREE = 0; // 仿真器連接處理器時(shí)模塊處于掛起狀態(tài)
EvaRegs.T1CON.bit.SOFT = 0; // 仿真器連接處理器時(shí)模塊處于掛起狀態(tài)
EvaRegs.T1CON.bit.TMODE = 2; // 連續(xù)遞增模式
EvaRegs.T1CON.bit.TPS = 7; // 預(yù)定標(biāo)系數(shù) = 128
EvaRegs.T1CON.bit.TENABLE = 1; // 使能 GP Timer 1
EvaRegs.T1CON.bit.TCLKS10 = 0; // 內(nèi)部時(shí)鐘
EvaRegs.T1CON.bit.TCLD10 = 0; // 當(dāng)?shù)扔?時(shí)比較重新裝載
EvaRegs.T1CON.bit.TECMPR = 0; // 禁止比較操作
EvaRegs.T1PR = 58594;
while(1)
{
for(i=0;i<1500000;i++)
{
EALLOW;
SysCtrlRegs.WDKEY = 0xAA;
EDIS;
}
}
}
void Gpio_select(void)
{
EALLOW;
GpioMuxRegs.GPAMUX.all = 0x0; // 所有 GPIO 端口配置為I/O
GpioMuxRegs.GPBMUX.all = 0x0;
GpioMuxRegs.GPDMUX.all = 0x0;
GpioMuxRegs.GPFMUX.all = 0x0;
GpioMuxRegs.GPEMUX.all = 0x0;
GpioMuxRegs.GPGMUX.all = 0x0;
GpioMuxRegs.GPADIR.all = 0x0; // GPIO PORT 配置為輸入
GpioMuxRegs.GPBDIR.all = 0x00; // GPIO PORT 配置為輸入
GpioMuxRegs.GPDDIR.all = 0x0; // GPIO PORT 配置為輸入
GpioMuxRegs.GPEDIR.all = 0x0; // GPIO PORT 配置為輸入
GpioMuxRegs.GPFDIR.all = 0x0; // GPIO PORT 配置為輸入
GpioMuxRegs.GPGDIR.all = 0x0; // GPIO PORT 配置為輸入
GpioMuxRegs.GPAQUAL.all = 0x0; // 設(shè)置所有 GPIO 輸入的量化值等于0
GpioMuxRegs.GPBQUAL.all = 0x0;
GpioMuxRegs.GPDQUAL.all = 0x0;
GpioMuxRegs.GPEQUAL.all = 0x0;
EDIS;
}
void InitSystem(void)
{
EALLOW;
SysCtrlRegs.WDCR= 0x00AF; // 配置看門狗
// 0x00E8 禁止看門狗,預(yù)定標(biāo)系數(shù)Prescaler = 1
// 0x00AF 不禁止看門狗, 預(yù)定標(biāo)系數(shù)Prescaler = 64
SysCtrlRegs.SCSR = 0; // 看門狗產(chǎn)生復(fù)位
SysCtrlRegs.PLLCR.bit.DIV = 10; // 配置處理器鎖相環(huán),倍頻系數(shù)為5
SysCtrlRegs.HISPCP.all = 0x1; // 配置高速外設(shè)時(shí)鐘分頻系數(shù): 2
SysCtrlRegs.LOSPCP.all = 0x2; // 配置低速外設(shè)時(shí)鐘分頻系數(shù): 4
// 使用的外設(shè)時(shí)鐘時(shí)鐘設(shè)置:
// 一般不使用的外設(shè)的時(shí)鐘禁止,降低系統(tǒng)功耗
SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;
SysCtrlRegs.PCLKCR.bit.EVBENCLK=0;
SysCtrlRegs.PCLKCR.bit.SCIAENCLK=1; // 使能SCI模塊的時(shí)鐘
SysCtrlRegs.PCLKCR.bit.SCIBENCLK=0;
SysCtrlRegs.PCLKCR.bit.MCBSPENCLK=0;
SysCtrlRegs.PCLKCR.bit.SPIENCLK=0;
SysCtrlRegs.PCLKCR.bit.ECANENCLK=0;
SysCtrlRegs.PCLKCR.bit.ADCENCLK=1;
EDIS;
}
interrupt void adc_isr(void)
{
// 每次定時(shí)器中斷處理看門狗
EALLOW;
SysCtrlRegs.WDKEY = 0x55;
EDIS;
//采樣結(jié)果保存
Voltage_A0 = AdcRegs.ADCRESULT0>>4;
Voltage_B0 = AdcRegs.ADCRESULT1>>4;
if(ADresult_num<512)
{
ADresult_num++;
ADC_buffer1[ADresult_num] = Voltage_A0;
ADC_buffer2[ADresult_num] = Voltage_B0;
}
else{ADresult_num = 0; }
// 為下一個(gè)ADC排序重新初始化
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // 復(fù)位 SEQ1
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; // 清除 INT SEQ1 位
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // 中斷響應(yīng)位置位
}
//===========================================================================
// 代碼結(jié)束
//===========================================================================
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -