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.

[参考译文] CCS/TMS320F28379D:外部中断

Guru**** 2595805 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/673120/ccs-tms320f28379d-external-interrupt

器件型号:TMS320F28379D

工具/软件:Code Composer Studio

大家好、

        这是圣阿斯。 我对 C2000微控制器系列非常陌生。 我正在使用 PWM 模块进行 ADC 触发、该操作已成功完成。 我已将代码中的 ADC 结果缓冲器值标准化。 我尝试仅使用外部中断(来自比较器)来触发标准化代码。

可以通过将比较器输出连接到外部中断引脚来实现它吗???    

请在下面找到我的代码。

#include "F28x_Project.h"

//
函数原型
//
void ConfigureADC (void);

void ConfigureEPWM (void);

void SetupADCepwm (uint16通道);

中断 void adca1_ISR (void);

float corr ();

//
//定义
//

#define results_buffer_size 256

//
//全局
//

uint16 AdcaResults[results_buffer_size];

uint16 resultsIndex;

volatile Uint16 bufferFull;

int float index=0;

float normalized_array[results_buffer_size]={0};

float filter[400]=039,0000.01256,0000.01256=080,0000.01256=080,0000.080,0000.080-01048,0000.080-01048,0000=0=0=080,0000.01256=080,0000.0=0=080,0000.080,0000.01256=0=080,0000.01256=080,0000.080-010













对于(i = 0;i < 256;i++)

{
索引=((i +结果索引+ 1)% 256);

OUT = OUT +(归一化_array[index-1]* filter[i]);

}

返回 OUT;

}



void main (void)

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

InitSysCtrl();

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

InitGpio();//针对本例跳过

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

Dint;

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

InitPieCtrl();

//
禁用 CPU 中断并清除所有 CPU 中断标志:
//

IER = 0x0000;

IFR = 0x0000;

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

InitPieVectTable();

//
//映射 ISR 函数
//

EALLOW;

PieVectTable.ADCA1_INT =&adca1_ISR;//针对 ADCA 中断1的函数

EDIS;

//
//配置 ADC 并为其加电
//
ConfigureADC();

//
配置 ePWM
//

ConfigureEPWM ();

//
//将 ADC 设置为通道0上的 ePWM 触发转换
//

SetupADCepwm (0);

//
//启用全局中断和更高优先级的实时调试事件:
//
IER |= M_INT1;//启用组1中断

EINT;//启用全局中断 INTM

ERTM;//启用全局实时中断 DBGM

//
初始化结果缓冲
区//
for (resultsIndex = 0;resultsIndex < results_buffer_size;resultsIndex++)

{

AdcaResults[resultsIndex]= 0;

}

resultsIndex = 0;

bufferIndex = 0;

bufferFull = 0;

//
//启用 PIE 中断
//
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;

//
同步 ePWM
//

EALLOW;

CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;

//
//在循环中无限期地进行转换
//
操作

{
//
//启动 ePWM
//

EPwm1Regs.ETSEL.bit.SOCAEN = 1;//启用 SOCA

EPwm1Regs.TBCTL.bit.CTRMODE = 0;//取消冻结、并进入递增计数模式

//
//等待、而 ePWM 导致 ADC 转换、然后导致中断、
//填充结果缓冲区,最终设置 bufferFull
//flag
//

while (!bufferFull);

bufferFull = 0;//清除缓冲区已满标志

//
//停止 ePWM

//

EPwm1Regs.ETSEL.bit.SOCAEN = 0;//禁用 SOCA

EPwm1Regs.TBCTL.bit.CTRMODE = 3;//冻结计数器

//
//此时,AdcaResults[]包含一系列转换
//从所选通道
//

//
//软件断点,再次点击运行以获取更新的转换
//
asm (" ESTOP0");

}while (1);

}

//
配置 ADC -写入 ADC 配置并为这两
个//都加电 ADC ADC A 和 ADC B
//

void ConfigureADC (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;
}

//
// ConfigureEPWM -配置 ePWM SOC 和比较值
//

void ConfigureEPWM (void)

{
EALLOW;

//假设 ePWM 时钟已启用

EPwm1Regs.ETSEL.bit.SOCAEN = 0;//禁用组上的 SOC

EPwm1Regs.ETSEL.bit.SOCASEL = 4;//在递增计数时选择 SOC

EPwm1Regs.ETPS.bit.SOCAPRD = 1; //在发生第一个事件时生成脉冲

EPwm1Regs.CMPA.bit.CMPA = 142; //将比较 A 值设置为2048个计数

EPwm1Regs.TBPRD = 248; //将周期设置为4096个计数

EPwm1Regs.TBCTL.bit.CTRMODE = 3; //冻结计数器

EDIS;

}

//
SetupADCepwm - Setup ADC ePWM acquisition window
//

void SetupADCepwm (uint16 channel)

{
uint16 acqps;

//
//根据分辨率确定最小采集窗口(在 SYSCLKS 中)
//

if (adc_resolution_12bit = AdcaRegs.ADCCTL2.bit.resolution)

{

acqps = 14;//75ns

}

否则、//分辨率为16位

{

acqps = 63;//320ns

}

//
//选择要转换的通道和转换结束标志
//

EALLOW;

AdcaRegs.ADCSOC0CTL.bit.CHSEL =通道;//SOC0将转换引脚 A0

AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps;//采样窗口为100个 SYSCLK 周期

AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5;// ePWM1 SOCA/C 上的触发

AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0;// SOC0结束将设置 INT1标志

AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用 INT1标志

AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除

EDIS;

}

//
// adca1_ISR -在 ISR 中读取 ADC 缓冲
区//

中断 void adca1_ISR (void)

{
AdcaResults[resultsIndex]= AdcaResultRegs.ADCRESULT0;

normalized_array[resultsIndex]=(2.0*AdcaResults[resultsIndex])/4095.0)-1.0;//我只想在有一个外部中断时触发这个代码

Result[resultsIndex]=corr();

结果索引++;

bufferIndex++;

if (results_buffer_size <= resultIndex && bufferIndex <= results_buffer_size)

{
resultsIndex = 0;

bufferFull = 1;

bufferIndex = 0;

}

AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 INT1标志

PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;

}

如果有人能给我一些关于如何处理它的建议、那将会非常有帮助。

谢谢你。

此致、

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

    F28379D 有5个外部中断信号:XINT1、XINT2、XINT3、XINT4和 XINT5。 每个引脚都可以通过输入 X-Bar 架构映射到任何 GPIO 引脚。 然后、您的外部信号可以连接到分配的 GPIO 引脚、当被触发时、将运行 ISR。 有关 GPIO 引脚和 X-BAR 的更多信息、请参阅 F28379D TRM (spruhm8g.pdf)中的第7章和第8章。 此外、以下研讨会可能对您有所帮助:

    processors.wiki.ti.com/.../C2000_Multi-Day_Workshop

    模块5包含有关输入 X-BAR 的信息、您还将找到使用 ePWM 触发 ADC 的实验练习。

    但愿这对您有所帮助。 如果您的问题得到了解答、请单击绿色的"验证答案"按钮。 谢谢。

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

    感谢 Ken 的即时响应。 您的建议对我帮助很大。 实际上、我不断将 ADC 值存储到缓冲区中、并且仅当存在外部中断时才会触发规范化指令。 每当发生中断时、我希望继续执行标准化指令9毫秒以上。 您能不能建议我如何处理它。

    非常感谢。

    此致、

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

    请注意、"已启用"的中断会立即得到服务(进入 ISR 时会有延迟)。 我完全相信您提出的问题。 是否要在 ISR 中使标准化指令运行9ms? 如果是、请在具有延迟函数的循环中运行标准化指令。

    但愿这对您有所帮助。 如果您的问题得到了解答、请单击绿色的"验证答案"按钮。 谢谢。

    - Ken