This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28377S:具有 CPU 定时器的 ADC 触发器

Guru**** 2460850 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/653006/tms320f28377s-adc-trigger-with-cpu-timer

器件型号:TMS320F28377S

您好!

有人能告诉我我的错误在哪里。 我尝试使用 CPU 定时器0触发 ADC、ADC ISR 不会运行。

#define _LAUNCHXL_F28377S 1
#include "F28x_Project.h"


#define DAC_num 1


//
//函数原型
//
_ interrupt void CPU_timer0_ISR (void);
void configureDAC (void
);void ConfigureADC (void);
void SetupADC_tint (uint16 channel);
_ void CONFIG1 interrupt (void);void _adc (void 1 interrupt)



volatile struct dac_regs* dac_ptr[4]={0x0、&DacaRegs、&DacbRegs、&DaccRegs};

uint16 stejt = 0;

void main (void)
{
//
//步1. 初始化系统控制:
// PLL、看门狗、启用外设时钟
//此示例函数位于 F2837xS_SYSCTRL.c 文件中。
//
InitSysCtrl();

//
//步骤2。 初始化 GPIO:
//此示例函数位于 F2837xS_GPIO.c 文件中,
//说明了如何将 GPIO 设置为其默认状态。
//
InitGpio();


////
步骤3. 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
//
Dint;

//
//将 PIE 控制寄存器初始化为默认状态。
//默认状态是禁用所有 PIE 中断并
清除标志//。
//此函数位于 F2837xS_PIECTRL.c 文件中。
//
InitPieCtrl();

//
禁用 CPU 中断并清除所有 CPU 中断标志:
//
IER = 0x0000;
IFR = 0x0000;

//
//初始化 PIE 矢量表,其中包含指向 shell 中断
//服务例程(service routines,ISR)的指针。
//这将填充整个表,即使在
本示例中未使用中断//也是如此。 这对于调试很有用。
//可以在 F2837xS_DefaultIsr.c 中找到 shell ISR 例程
//此函数可在 F2837xS_PieVect.c 中找到
//
InitPieVectTable();

//
//此示例中使用的中断被重新映射到
这个文件中的// ISR 函数。
//
EALLOW;//这是写入 EALLOW 受保护寄存器所必需的
PieVectTable.ADCA1_INT =&adca1_ISR;
PieVectTable.ADCA_EVT_INT =&adca1_ISR;
PieVectTable.TIMER0_INT =&CPU_timer0_ISR;

EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需

的//
//步骤4。 初始化器件外设。 此函数可以是
// 可在 F2837xS_CpuTimers.c
//中找到
InitCpuTimer();//对于此示例,只初始化 CPU 计时器
ConfigCpuTimer (&CpuTimer0、200、22.675);
ConfigureADC();

SetupADC_tint (2);
//configureDAC ();
//
将 CPU 定时器0、1和2配置为每秒中断一次:
// 200MHz CPU 频率,1秒周期(以 uSeconds 为单位)
//
//ConfigCpuTimer (&CpuTimer0、200、11.338);



//
为了确保精确计时、请使用只写指令写入
//整个寄存器。 因此、如果
// ConfigCpuTimer 和 InitCpuTimers (在 F2837xS_cputimervars.h 中)中的任何配置位发生更改、也
必须更新以下//设置。
//
CpuTimer0Regs.TCR.ALL = 0x4000;


//
//步骤5。 用户特定代码、启用中断:
//

//
启用连接到 CPU 定时器0的 CPU INT1、
连接到 CPU 定时器1的 CPU INT13 //和连接
到 CPU 定时器2的 CPU int 14:
//
IER |= M_INT1;

//
//在 PIE 中启用 TINT0:组1中断7
//
PieCtrlRegs.PIEIER1.bit.INTx7 = 1;

//
启用全局中断和更高优先级的实时调试事件:
//
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM

//
//步骤6。 空闲循环。 只需坐下来循环(可选):
//


CpuTimer0.RegsAddr->TCR.bit.tie = 1;
while (1)
{
//GPIO_WritePin (13、stejt);
//DAC_PTR[DAC_num]->DACVALS.all = stejt;

}
}


__interrupt void cpu_timer0_ISR (void)
{
CpuTimer0.InterruptCount++;
//stejt = 4095 - stejt;
//
确认此中断以接收来自组1的更多中断
//
////stejt = 4000;
PieCtrlRegs.PIEACK.all = PIEACK_ADC1;


void}(void)

EALLOW;

//
//写入配置
//
AdcaRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4
AdcSetMode (ADC_ADCA、ADC_resolution_12位、ADC_SIGNALMODE_SINGLE);

//
//将脉冲位置设置为晚期
//
AdcaRegs.ADCCTL1.bit.INTPULSEPOS=1;

//
//为 ADC 加电
//
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;

//
//延迟1ms 以允许 ADC 加电时间
//
DELAY_US (1000);

EDIS;
}

void SetupADC_tint (uint16通道)
{


//
//选择要转换的通道和转换结束标志
//
EALLOW;
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 2;//SOC0将转换引脚 A2
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 14;//采样窗口为100个 SYSCLK 周期- 12位
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 1;// CPU 定时器0上的触发
AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0;// SOC0结束将设置 INT1标志
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用 INT1标志
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除
EDIS;
}


中断 void adca1_ISR (void)
{
//DAC_PTR[DAC_num]->DACVALS.ALL = AdcaResultRegs.ADCRESULT0;
//stejt = AdcaResultRegs.ADCRESULT2;
stejt = 4000;
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;
}

void configureDAC()
{
EALLOW;
DAC_PTR[DAC_num]->DACCTL.bit.DACREFSEL = 1;
DAC_PTR[DAC_num]->DACOUTEN 位.DACOUTEN = 1;
DAC_PTR[DAC_num]->DACVALS.ALL = 0;
DELAY_US (10);//缓冲 DAC 加电延迟
EDIS;
}


////
文件结束
//

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    本讨论是本主题的延续:

    您好、Nakon、

    阅读器件技术参考手册(spruhx5e)的中断(PIE 模块)部分。  您可以看到、这是两个感兴趣的 PIE 位置:

    您通过以下命令为第1行启用了中断:

    IER |= M_INT1;

    并且您通过以下命令启用了针对电池 INT1.7 (CPU 定时器0)的中断:

    PieCtrlRegs.PIEIER1.bit.INTx7=1;

    但我看不到会为单元 INT1.1 (ADCAINT1)启用中断的类似命令