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.

[参考译文] MSP430FG6426:CTSD16和 DMA

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/959857/msp430fg6426-ctsd16-and-dma

器件型号:MSP430FG6426

您好!

帮助了解问题。 通过 DMA 从 ADC 传输数据在位设置"GIE"时不起作用。
在程序的结果文本和全局中断禁用//"_bis_SR_register (GIE+LPM0_Bits)"中、所有操作都正常。
在中断解决时、包含"_ bis_SR_register (GIE)"行、不会传输数据。 中断的发生和处理。 但数据迁移不存在。
对于构成的测试、线路"_ bis_SR_register (LPM0_bits)";在这种情况下、数据传输中断会发生、但对我来说、传输中断不会发生。 如何绕过它? 我不是真的。 在 slau208q 中、被告知所有器件都应在任何模式下工作。 不清楚的是、在没有数据的情况下、为什么会有中断 DMA?

文本测试程序:

int main( void ){


WDTCTL = WDTPW + WDTHOLD; //停止看门狗计时器

//模拟单元的配置
OA0CTL0|=OAM;
OA1CTL0|=OAM;
OA0PSW|=PSW0;
OA1PSW|=PSW0;
OA0NSW|=NSW0;
OA1NNSW|=NSW0;
P6SEL|=BIT4+BIT5;
P7SEL|=BIT4+BIT5+BIT6+BIT7;

//REF 配置
REFCTL0|=REFON+REFOUT;
P5SEL|=BIT0;
//配置 ADC
CTSD16CTL|=CTSD16REFS;
CTSD16INCTL0|=CTSD16INCH_15+CTSD16GAIN_16;
volatile int AdcWave1 [31];
unsigned int i;

//Configuration DMA
DMACTL0=DMA0TSEL_24;//DMA 0触发器选择 CTSD16。
__data20_write_long ((unsigned int)&DMA0SA、(unsigned long)&CTSD16MEM0);
__data20_write_long (unsigned int)&DMA0DA、(unsigned long)&AdcWave1);
DMA0SZ = 31;
DMACTL4|=DMARMWDIS;
DMA0CTL|=DMADD_0|DMADSTINCR_3|DMAIE;
DMA0CTL&&~DMAIFG;
DMA0CTL|=DMAEN;
CTSD16CCTL0|=CTSD16SC; //启动 ADC 
_bis_SR_register (GIE+LPM0_bits);//so works //_bis_SR_register (GIE);// SO NOT works } #pragma vector=dma_vector __interrupt void Interrupt_dma (void) { unsigned int mem=DMAIV; switch (mem){ case 0x0:{break; }case 0x2:{case:} DMA0CTL&=~DMAIE; CTSD16CCTL0&=~CTSD16SC; //停止 ADC 中断; } 案例0x4:{break;} 案例0x6:{break;} 案例0x8:{break;} 案例0xA:{break;} 案例0xC:{break;} 案例0xE:{break;} 案例0x10:{break;} }} 返回; }

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

    当您进入 LPM0时、执行会在那里暂停。

    如果不使用 LPM0,则会返回 main()函数,该函数会将栈与 AdcWave1[]数组一起撤消。 (当然、内存仍然存在、但很难找到。) 从 main()返回后,启动代码将调用 exit(),该函数将其自身的数据放在栈上,最有可能擦除阵列内存中的任何内容。

    进入 LPM0实际上是等待 ADC 完成的一种非常好的方法。 另一种选择是 while (1){}、这也会阻止 main ()返回、但它会更忙。  

    无论您选择哪一个,我建议(作为一般做法)将 DMA 使用的任何数组放在全局变量中,即在 main()之外声明它。

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

    感谢您的回答!
    我在存储中找到了覆盖的迹线! 感谢您的回答!
    通过数组传递到全局变量来做出决策很有帮助! 谢谢!


    问题№2. 在勘误表 msp430FG6426 SLAZ669N 中、DMA4、DMA7、DMA0上有数据。 控制器中有6通道内部 DMA。 在这种情况下、数字4、7、10是什么意思?

    问题№3. 在文档 SLAU208Q 用户指南(DMA)控制器模块中、未告知控制器 DMA 如何通过与慢速器件的操作来运行。 模式 DMADT = 0。 例如、UART 的速度为300位/秒。 它将一直保持 CPU 处于停止模式、同时 DMA0SZ 寄存器! = 0? 还是在接受的字节之间将释放总线 CPU 以进行数据处理?

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

    2) 4、7、10没有特别的意义、它们只是用于识别相应勘误表的标签。 有人认为、例如 Errata DMA5和 DMA6同时存在、但已修复。

    3) 3)在用户指南图11-3中、关注点是显示"hold CPU"的椭圆、这是影响 CPU 的唯一步骤。 在"2x MCLK"周期之后、路径会进入"等待触发"或"空闲"、每个周期相对较长。

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

    感谢您的回答。 一切都很清楚。 关闭主题 I。