📄 adc_fir.c
字号:
#include "DSP281x_Device.h"
// 函数声明
void Gpio_select(void);
void InitSystem(void);
interrupt void T1_Compare_isr(void); // EVA-T1 比较中断
interrupt void ADC_FIR_INT_ISR(void); // ADC 服务中断
void main(void)
{
InitSystem(); // 初始化DSP内核寄存器
Gpio_select(); // 设置GPIO工作模式
InitPieCtrl(); // 初始化 PIE单元 ( code : DSP281x_PieCtrl.c)
InitPieVectTable(); // 初始化PIE中断向量表 ( code : DSP281x_PieVect.c )
InitAdc(); // 初始化ADC
// 从新映射EVA-T1比较和ADC中断
EALLOW;
PieVectTable.T1CINT = &T1_Compare_isr;
PieVectTable.ADCINT = &ADC_FIR_INT_ISR;
EDIS;
// 使能EVA-T1CMPR INT (位于组2中断5)
PieCtrlRegs.PIEIER2.bit.INTx5 = 1;
// 使能CPU INT1 (ADC) 和INT2(EVA-Timer1 比较):
IER |= 3;
// 全局使能中断
EINT;
ERTM;
// 配置事件管理器EVA
// T1/T2驱动T1PWM / T2PWM输出逻辑
EvaRegs.GPTCONA.bit.TCMPOE = 1;
// GP Timer 1比较设置为地有效
EvaRegs.GPTCONA.bit.T1PIN = 1;
// timer2 周期标志启动ADC
EvaRegs.GPTCONA.bit.T2TOADC = 2;
EvaRegs.T1CON.all = 0x1002; // 配置T1为递增计数模式
EvaRegs.T1PR = 37500; // 2KHz PWM
EvaRegs.T1CMPR = EvaRegs.T1PR/2; // 50% 占空比
EvaRegs.EVAIMRA.bit.T1CINT = 1; // 使能T1CMPR中断
EvaRegs.T1CON.bit.TENABLE = 1; // 启动定时器
EvaRegs.T2CON.all = 0x0000; / 禁止定时器2
EvaRegs.T2CNT = 0x0000; // 清楚定时器2计数寄存器
EvaRegs.T2PR = 1499; // 50KHz (HSPCLK = 2和T2TPS = 1)
EvaRegs.T2CON.all = 0x1040; // 使能定时器
while(1)
{
EALLOW;
SysCtrlRegs.WDKEY = 0xAA; // 看门狗处理
EDIS;
}
}
void Gpio_select(void)
{
EALLOW;
GpioMuxRegs.GPAMUX.all = 0x0; // 所有GPIO设置为I/O
GpioMuxRegs.GPAMUX.bit.T1PWM_GPIOA6 = 1; // T1PWM 有效
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 = 0x0; // 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; // 设置GPIO输入量化值为0
GpioMuxRegs.GPBQUAL.all = 0x0;
GpioMuxRegs.GPDQUAL.all = 0x0;
GpioMuxRegs.GPEQUAL.all = 0x0;
EDIS;
}
void InitSystem(void)
{
EALLOW;
SysCtrlRegs.WDCR= 0x00AF; // 配置看门狗
// 0x00E8 禁止看门狗,预定标系数Prescaler = 1
// 0x00AF 不禁止看门狗, 预定标系数Prescaler = 64
SysCtrlRegs.SCSR = 0; // 看门狗产生复位
SysCtrlRegs.PLLCR.bit.DIV = 10; // 配置处理器锁相环,倍频系数为5
SysCtrlRegs.HISPCP.all = 0x1; // 配置高速外设时钟分频系数: 2
SysCtrlRegs.LOSPCP.all = 0x2; // 配置低速外设时钟分频系数: 4
// 使用的外设时钟时钟设置:
// 一般不使用的外设的时钟禁止,降低系统功耗
SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;
SysCtrlRegs.PCLKCR.bit.EVBENCLK=0;
SysCtrlRegs.PCLKCR.bit.SCIAENCLK=0;
SysCtrlRegs.PCLKCR.bit.SCIBENCLK=0;
SysCtrlRegs.PCLKCR.bit.MCBSPENCLK=0;
SysCtrlRegs.PCLKCR.bit.SPIENCLK=0; //使能SPI时钟
SysCtrlRegs.PCLKCR.bit.ECANENCLK=0;
SysCtrlRegs.PCLKCR.bit.ADCENCLK=1;
EDIS;
}
interrupt void T1_Compare_isr(void)
{
// 中断处理服务程序处理看门狗
EALLOW;
SysCtrlRegs.WDKEY = 0x55;
EDIS;
// 响应EVA-Timer1比较中断
EvaRegs.EVAIFRA.bit.T1CINT = 1;
// 响应该中断,准备接收更多的中断
PieCtrlRegs.PIEACK.all = PIEACK_GROUP2;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -