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.

[参考译文] MSP430FR5994:从 tb0触发 adc12b 样本

Guru**** 2534260 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/726474/msp430fr5994-trigger-adc12b-sample-from-tb0

器件型号:MSP430FR5994

我花了太多的时间敲我的头,需要从一个直接的问题得到一个直接的答案。  我的目标是从运行在向上计数模式下的定时器 tb0触发转换、以比较寄存器中的速率翻转、ADC 结果进入 ADD 存储器寄存器0、然后通过 DMA 传输到缓冲器。  我已经使用软件触发的转换连续测试了 A/D。  现在、我已经尽可能地设置了计时器、添加和 DMA。  以下是初始化代码:

   //设置在计时器和上触发的单通道转换

  //数据发送到 FRAM 缓冲区。

  setPortField (ADC12CTL0、1、0);   //禁用 ADC

  setPortField (ADC12CTL0、4、1);   //打开 ADC

  setPortField (ADC12CTL0、15、12、0);// ADC12SHT1x 4个时钟

  setPortField (ADC12CTL0、11、8、0); // ADC12SHT0x 4个时钟

  setPortField (ADC12CTL1、12、10、2);  //采样/保持触发源2选择、TB0、CCR0

  setPortField (ADC12CTL1、9、1);   // ADC12SHP 脉冲模式

  setPortField (ADC12CTL1、4、3、0b11); //时钟源= SMCLK

  setPortField (ADC12CTL1、2、1、0);   // ADC12CONSEQx ->单 通道、单次转换

  setPortField (ADC12CTL3、4、0、0);   //转换结果为 mem 0

  setPortField (ADC12MCTL0、4、0、5);  //为通道中的测量值0选择 A5、P1.5单端

  //设置定时器 TB0

  setPortField (TB0CTL、9、8、0B10);   //选择 SMCLK

  setPortField (TB0CCTL0、8、0);   // CAP = 0、比较模式

  常量浮点频率= 100e3;       // 200kHz

  const float CLK = 16e6;      //计时器时钟

  浮点周期寄存器=(CLK/FREQ)- 1;

  TB0CCR0 =(周期寄存器+ 0.5);

  setPortField (TB0CTL、2、1);  //清除计时器

  //配置 p1.5,输入的模拟输入,没有上拉电阻

  setPortField (P1DIR、5、5、0);   //输入

  setPortField (P1REN、5、5、0);   //上拉或下拉被禁用

  //设置 DMA,默认情况下,字传输,边沿触发

  setPortField (DMACTL0、4、0、26); // DMA 通道0、触发26 (ADC EOC)

  setPortField (DMA0CTL、14、12、0); //单次传输

  setPortField (DMA0CTL、11、10、3); //目标地址递增

  setPortField (DMA0CTL、9、8、0);  //源地址不变

  setPortField (DMA0CTL、7、7、0);  //字目的

  setPortField (DMA0CTL、6、0);  //字源

  DMA0DA =(_SFR_FARPTR)(unsigned long) bigArray;  //起始目标地址

  DMA0SA =(_SFR_FARPTR)(无符号长整型)&ADC12MEM0; //当前 ADC 结果的地址

  DMA0SZ = array_size;       //块大小

  setPortField (DMACTL4、2、0、0b001);

setPortField 是我编写的函数、用于将第四个参数值写入由参数2至3指定的字段中、并写入由第一个参数指定的位置。  通过广泛的测试和调试、我知道该函数工作正常。

当我运行程序时、我可以看到计时器正在调试器中运行、并且计时器中断标志正在设置 我不太理解的是将 A/D 触发器与计时器达到比较寄存器设置的机制。  我可以从相应的 msp30用户和数据表手册中看出、根据文档、a/d 采样保持源应设置为源2、TB0、CCR0。

以下代码启动正在进行的操作、并在填充缓冲区后循环等待 DAM 中断。

   setPortField (ADC12CTL0、1、1);   //启用 ADC

  setPortField (DMA0CTL、4、4、1);     //启用 DMA

  setPortField (TB0CTL、5、4、1);     //启动 ADC 触发计时器

  //进行测试

  //等待 DMA 突发完成

  volatile unsigned int dmaFlags = DMAIV;

  while (dmaFlags =0)

  {

    dmaFlags = DMAIV;

  }

循环永远不会退出、因此我暂停调试器以查看寄存器值。 我看到没有迹象表明 A/D 曾经触发过。

我缺少什么、 这是什么?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我确信您确切地知道 setPortField 的功能、但我不知道。 (对我来说)什么是"场"数字根本不明显、也不是为什么有两个数字。 而将魔法数字用于字段值意味着(我)深入研究书籍、试图猜测它们是否正确。

    所有这些字段/值都有名称、在"寄存器级别"示例程序(例如 SLAC710A)中看到的分配样式除了透明外实际上非常简单。

    只需内插、我看不到任何对以下内容的引用:
    1) 1)设置 OUTMOD 以生成到 ADC 的脉冲序列(您可能需要 OUTMOD_4、因为这是 CCR0、但您需要将周期减半)
    2) 2)设置 MC 以启动计时器(您可能希望 MC_1用于向上计数模式)

    此外、如果您希望从 SMCLK 运行 ADC、请确保其小于5.4MHz (数据表(SLASE54B)表5-24)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我忘记添加:是的、SHS=2对于 TB0.0是正确的。 (某些数据表具有单独的 SHS 表、这更方便。)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢 Bruce 抽出时间并做出回应。

    void setPortField (volatile unsigned int &port、int msbBit、int lsbBit、unsigned int Value)


    unsigned int mask = 0;
    for (int i = lsbBit;i <= msbBit;i++)

    掩码<= 1;
    遮罩+= 1;

    掩码<<= lsbBit;
    //清除端口字段
    port &=~掩码;
    //将值移位以匹配字段
    值<<= lsbBit;
    //字段掩码
    value &=掩码;
    //将字段添加到端口
    port |=值;


    msbBit 和 lsbBit 定义位字段的范围。 值被写入该字段。 端口是对寄存器的引用。 我在调用中使用的名称来自头文件。 我知道、定义掩码和执行逻辑位运算的函数都是在运行时设置的、而头文件中的宏主要是在预编译和编译时设置的。 这对速度非常重要。 但是、我使用此函数可以更好地了解正在发生的情况以及可靠性和可调试性、因为宏因意外行为和副作用而臭名昭著、难以调试。

    我将为 TB0 CCR0设置一个输出函数。 当我希望比较结果操作一个输出端口位时、我就这样做了、但在我看来、这并不是内部耦合到 ADC 所需的。 在文档中对我不清楚。 此外、由于某种原因、我无法找到合适的示例、我已经尝试过。

    我在数据表中看到了最大 ADC 时钟的规格、但我认为它可以在高达16的电压下运行。 我将对其进行缩放、感谢您的提示。

    将让您了解它是如何工作的。

    Fred
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    足够公平、但你让人们更容易帮助你、你得到的志愿者就越多。

    我希望一切都能顺利完成。