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.

[参考译文] MSP430FR2532:MSP430FR2532 ADC10 -无值...

Guru**** 2534850 points
Other Parts Discussed in Thread: MSP430FR2532, MSP-FET, CC3200

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/568373/msp430fr2532-msp430fr2532-adc10---no-value

器件型号:MSP430FR2532
主题中讨论的其他器件: MSP-FETMSP430WARECC3200

您好!

我在 MSP430FR2532上配置了 ADC10、但当我获得中断时、ADC 输入上没有任何值、因为我会检查序列的每个模拟端口。 我在一个端口上施加电压、并使用电压表进行测量、但 ADC 转换中没有显示任何内容。 我将 MSP FET 连接到 A6/A5/A4 (TDI/TS/TCK)引脚、不知道这是不是问题。

MAIN ()

(笑声)

ADCCTL0 &=~ADCENC;//确保 ENC 清零

// 64个时钟周期、自动转换的上升沿、ADC 开启、
ADCCTL0 = ADCSHT_4 + ADCMSC + ADCON;

// sampnhold src 选择 ADCSC 位、SAMPCON src SAMP 计时器、ADCCLK/4、ADC clk SMCLK、通道序列不重复
ADCCTL1 = ADCSHS_0 + ADCSHP + ADCDIV_3 + ADCSSEL_2 + ADCCONSEQ_1;

//清除所有 ADC12通道 int 标志
ADCIV = ADCIV_NONE;

/ADC 分辨率10位
ADCCTL2 = ADCRES_1;

// 000b ={VR+= AVCC 和 VR–= AVSS}、设置序列读取的最高模拟输入端口(A6)
ADCMCTL0 = ADCSREF_0 + ADCINCH_6;

//为 ADC 启用中断
ADCIE |= ADCIE0;

CSCTL1 |= DCORSEL_5;//设置 DCO 设置- 16MHz
CSCTL2 &=(~FLLD0);//当使用来自 REF0CLK 的 DCO 时、这将把 DCO 分频
CSCTL3 = SELMS_REFOCLK;
CSCTL4 = SELA_REFOCLK + SELMS_DCOCLKDIV;// ACLK = REF0CLK (32kHz)、SMCLK/MCLK = DCODIV = 16MHz 内部
CSCTL5 = DIVM_0 + DIVS_3;// MCLK 分频器(0)= 12MHz 或16MHz 来自内部、SMCLK 分频器(8)= 1.5MHz 或2MHz 内部 DCO 分频

(笑声)

void __attribute__((interrupt (ADC_vector))) ADC_ISR (void)//将此声明用于 mspgcc 编译器

unsigned int ADC_Result = 0;


ADCCTL0 &=~ADCIFG;//清除中断标志

//ADC 按顺序配置、每个转换的通道都将读取一个中断
//ADC 将从 ADC 通道6 - 0进行倒计数

if (adc_count = 6){
ADC_SAMPLE_temp = 0;
ADC_SAMPLE_temp = ADCMEM0;
adcB3V_SAMPLE[ADC_POS]= ADC_SAMPLE_temp;

如果(ADC_COUNT = 5){、则为其他位
ADC_SAMPLE_temp = 0;
ADC_SAMPLE_temp = ADCMEM0;
adcB2V_SAMPLE[ADC_POS]= ADC_SAMPLE_temp;

如果(ADC_COUNT = 4){、则为其他位
ADC_SAMPLE_temp = 0;
ADC_SAMPLE_temp = ADCMEM0;
adcB1V_SAMPLE[ADC_POS]= ADC_SAMPLE_temp;

否则{

ADC_Result = ADCMEM0;//对于所有未使用的其它通道、忽略采样

if (adc_count = 0){
ADC_COUNT = 6;//复位 ADC 通道计数

否则{
ADC_COUNT--;//递减中断计数

SAMPLE_COUNT_ADC_SEQ++;//让主代码知道采样已完成、7 SAMPLE_COUNT =每个通道1个采样(A6 - A0)
ADCCTL0 |= ADCENC + ADCSC;//触发下一次转换


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

    Mark、您好!

    您将电压施加到哪个输入端、您看到的 ADCMEM0中的值是多少?

    如果您尝试测量 A6/A5/A4上的电压、我认为这些引脚上的 MSP-FET 肯定会影响任何测量。 不过、我不知道您会期望什么值。

    最后、在 ISR 结束时、我看到无论您是否在序列的末尾、都会触发另一个转换。 您可以在单序列模式下设置 ADC。 在这种情况下、采样从通道 A6开始、然后在转换完成后自动移至下一个通道、最后在通道 A0上结束。 无需重新触发通道间的转换。 我认为这可能会对您的采样产生不利影响。

    此致、
    Caleb Overbay

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

    我尝试在 A4 1.65V 上施加较小的电压、但我正在读取0 FALL 转换 A6-A4。 根据用户指南、它将1024 x (1.65V - 0V)/(3.3V - 0V)= 512 (或10位 ADC 最大读数的一半)。

    是的、最初我以为我会有8个中断 A6 - A0、但我只得到1个中断、然后它永远不会返回到 ADC ISR。 然后、我读出 ADC 应重新触发以获取其余样本。 不确定此芯片是我的新芯片、TI 对此不提供太多支持。 我发现、MSP FET 工具可能不允许在其连接的模拟端口上读取数据、但如果 FET 运行代码、它可能会读取模拟信号。

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

    感谢您提供详细信息。 您无需重新触发 ADC 即可获取其余样本。 重新触发 ADC 的唯一时间是序列完成后。

    我还注意到、在 ISR 开始时、您清除了 ADCCTL0中的 ADCIFG、但中断标志不在该寄存器中。 该操作将 ADCCTL0寄存器中的位清零、这可能是意外操作的原因。

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

    您好!

    好的、注意这一点。 我将线路更改为、但仍然没有中断序列。 然后、我将 ADCCTL1更改为 ADCCONSEQ_3 (sequnce 重复、然后重复中断)、我得到的值为1021、它接近 V+轨3V3、因此这可能是由于 FET 连接到这些线路所致。 我在网上看到、其他器件有一个寄存器可以保存所有转换、它与 FR2532一样吗? 我只想在使用一个序列的主程序期间的需要时调用 ADC 转换。 此外、我还认为该序列会为当前设置生成8个中断 A6-A0?

    ADCIFG &=~ADCIFG0; //清除中断标志

     

    ADCCTL1 = ADCSHS_0 + ADCSHP + ADCDIV_3 + ADCSSEL_2 + ADCCONSEQ_3;

     

    太棒了!

    标记

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

    Mark、您好!

    这是一些奇怪的行为。 典型行为是一个由7个中断(A6-A0)组成的序列。 每个中断应该在一个通道的 ADC 转换结果被写入 ADCMEM0后触发、从 A6开始、到 A0结束。 您能否尝试从 MSP430Ware 中为 该器件加载单序列 ADC 示例、并让我知道您是否遇到了仅触发一个中断的相同问题?

    如果您已经下载并安装了 MSP430Ware、可在 CCS 的 View -> TI Resource Explorer -> MSP430Ware -> Devices -> MSP430FR2xx/4xx -> Code Examples -> MSP430FR253x 下找到该工具。 在那里、名为 msp430fr243x_ADC10_10.c 的示例是单序列示例。

    此致、  
    Caleb Overbay

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

    您好!


    好的、我将尝试该示例。 是的、我安装了 MSP430SWare。 我正在为客户设计新的电池充电产品、这是我完成固件之前需要检查的最后一件事、如果我不知道发生了什么、我可能会转到单个 ADC 通道呼叫来加快速度。 由于具有低功耗和 FRAM 功能、还希望在能量收集模块设计中使用此 IC。

    太棒了!

    标记

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

    Mark、您好!

    在仔细检查代码之后、我看不到 ADC 引脚的任何配置。 在 MSP430FR25xx 器件上、ADC 引脚与 I/O 功能复用、并且必须禁用 I/O 功能以避免功能冲突。 这是通过将 SYSCFG2寄存器中相应的 ADCPTCLx 位置位来完成的。 《MSP430FR4xx 和 MSP430FR2xx 系列用户指南 》的第1.12.3.3节提供了有关此主题的更多详细信息。

    此致、

    Caleb Overbay

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

    是的、我不认为我将其放置在帖子中、但我确实有 SYSCFG2 = ADCPCTL_4 + ADCPCTL_5 + ADCPCTL_6;用于配置我已连接的 ADC 通道。

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

    我在 MSP430Ware 中找不到代码示例。 我使用的版本是 v:3.60.00.10。

    我转到"Devices"->"MSP430FR2xx/4xx"->"(然后只是 PN 列表)"->MSP430FR2532

    然后有3个文件夹文档、外设示例和中间件。

    我在这里看不到任何代码示例。

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

    您必须使用新的 Resource Explorer。 与 Resource Explorer Classic 相比、它周围的导航略有变化。 我遵循了上面描述的路径、似乎不会向您介绍示例、这不是很直观。 为此、我很抱歉、我将与 CCS 团队合作解决这个问题。

    同时,您可以转到 View -> Resource Explorer Classic,然后按照前面所述的路径访问示例。 请告诉我您是否有任何其他困难。

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

    Resource Explorer Classic 仅显示用于 C200和 SimpleLink 无线 MCU 的 TI-ToD。 我以前安装过应用程序、因为我在另一个设计中使用 CC3200。 当我转到"Devices"下拉列表时、它仅将 ARM 和 C2000显示为选项。 我正在尝试了解如何安装 FRAM 软件包?

    标记
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    抱歉... 即 TI-RTOS 和 C2000。 您是否有示例的链接、或者我可以在某个位置下载?

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

    Mark、您好!

    请参阅以下 CCS 项目:

    e2e.ti.com/.../msp430fr243x_5F00_adc10_5F00_10.zip

    您可以通过 Project -> Import CCS Projects -> Select Archive File 来将其导入到 CCS 中并浏览到下载的文件。  

    此致、  
    Caleb Overbay

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

    我会尝试一下、并为您提供一些反馈。 尝试导入时遇到编译器错误...

    请参阅下面的详细信息。
    导入项目'm 430fr243x_ADC10_10.c'失败、因为其编译器定义不可用。 请在导入此项目之前安装 MSP430v16.9编译器-单击'View > CCS App Center'以检查编译器更新是否可用、或手动安装编译器并通过'Preferences > CCS > Build > Compilers'将其注册到 CCS。


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

    看起来我们正在使用不同版本的编译器。 您最简单的操作是在 CCS 中创建一个新的空 MSP430FR2532项目、然后将 main.c 文件替换为您刚才下载的项目中的 msp430fr243x_ADC10_10.c 文件。 我对这种混乱表示歉意。

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

    您好!

    好的、我已经加载了代码并运行了程序。 我在 ADC ISR 中放置一个断点、它仅中断一次。 我将 ADC_Result 数组更改为"int"、以便我可以看到该值、然后将断点移动到主代码中、当它停止时、数组中的值为[92、103、122]。 我认为、在 ADC ISR 中放置一个断点会导致其他中断丢失、因为程序已在中断中停止、因此只会获得一个中断。 我还注意到、配置寄存器时、它们使用"|"符号而不是"+"。 不确定这是否起作用。 如果查看定义的十六进制值、则会使用+符号进行加法。  

    我将修改我的代码以查看它是否与序列一同工作。 不确定这个函数在做什么...

    switch (__evo_in_range (ADCIV、ADCIV_ADCIFG))

    是否有必要使用此开关语句、因为可能会发生任何这些中断?

    太棒了!

    标记

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

    ISR 内的断点可能会导致您错过其他中断。 很棒的地方!

    使用"+"或"|"配置寄存器之间没有有效差异。 至于 switch 语句、ADC 中断向量与多个其他中断(例如 ADCIV_ADCOVIFG、ADCIV_ADCTOVIFG 等)共享。 此 switch 语句检查中断是否来自正确的源、然后再对其执行操作。 虽然您的代码不是正常工作所必需的、但我建议您将其作为最佳编码实践。

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

    现在我会遇到其他错误、它会变得更糟。 即使我恢复到原始代码、也无法读取 ADC。 它现在挂起了。

    MSP430无法读取0x0200执行状态阻止访问

    您知道是什么导致了这种情况吗?

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

    我添加了断点、但它们似乎不再工作、但现在我暂停运行的代码。 我从我用来测量中断的 ADC 变量中获得正确的序列计数7、而 ADC 缓冲器都读取了正确的值。

    您知道为什么断点会停止工作吗?

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

    断点在代码中无法正常工作的原因可能有多种。 首先、您可以设置的断点数量有限制。 如果代码中有大量内容、请尝试禁用不使用的代码。 其次、由于编译器优化而被删除的代码部分会自动禁用断点。 如果断点工作正常、则在禁用断点时应显示为蓝色而不是灰色。

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

    这是我现在使用的代码。 我在主循环中设置一些断点、它在两个断点处停止一次、但一旦进入 ADC ISR、似乎永远不会返回主循环。

    int main (void){



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

    PM5CTL0 &=~LOCKLPM5; //禁用 GPIO 上电默认高阻抗模式
    //激活先前配置的端口设置

    //设置 ADC 控制寄存器
    // ADC 计算 Nadc = 1024 x (Vin - VR-)/(VR+- VR-)
    //我们已将 VR+= Vcc = 3.3V、VR-= AVSS = 0V 设置为以下
    //例如 Nadc = 1024

    SYSCFG2 = ADCPCTL4 + ADCPCTL5 + ADCPCTL6;//启用 ADC A4/A5/A6输入
    ADCCTL0 &=~ADCENC;//确保 ENC 清零
    ADCCTL0 |= ADCSHT_4 + ADCMSC + ADCON; // 64个时钟周期、自动转换的上升沿、ADC 开启、

    ADCCTL1 |= ADCSHS_0 + ADCSHP + ADCDIV_3 + ADCSSEL_2 + ADCCONSEQ_1;//sapnhld src SEL ADCSC、SAMPCON src SAMP 计时器、ADCCLK/4、ADC clk SMCLK、通道序列不重复
    ADCCTL2 |= ADCRES_1;//ADC 分辨率为10位
    ADCMCTL0 |= ADCSREF_0 + ADCINCH_6;// 000b ={VR+= AVCC 和 VR–= AVSS}、设置序列读取的最高模拟输入端口(A6)
    ADCIE |= ADCIE0;//为 ADC 启用中断


    P1SEL0 &=~BIT0;//设置 GPIO 的 P1.0 SEL (CHRG_B0)
    P1SEL1 &=~BIT0;
    P1DIR |= BIT0 + BIT1 + BIT2 + BIT3;//将 P1.0 - P1.3设置为输出
    P1OUT &=~BIT0;//将 P1.0设置为低电平

    P1SEL0 &=~BIT1;//设置 GPIO 的 P1.1 SEL (CHRG_B1)
    P1SEL1 &=~BIT1;
    P1OUT &=~BIT1;//将 P1.1设置为低电平

    P1SEL0 &=~BIT2;//设置 GPIO 的 P1.2 SEL (LOAD_B0)
    P1SEL1 &=~BIT2;
    P1OUT &=~BIT2;//将 P1.2设置为低电平

    P1SEL0 &=~BIT3;//设置 GPIO 的 P1.3 SEL (LOAD_B1)
    P1SEL1 &=~BIT3;
    P1OUT &=~BIT3;//将 P1.3设置为低电平

    CSCTL1 |= DCORSEL_5;//设置 DCO 设置-16MHz
    CSCTL2 &=(~FLLD0);//当使用来自 REF0CLK 的 DCO 时、这将把 DCO 分频
    CSCTL3 = SELMS_REFOCLK;
    CSCTL4 = SELA_REFOCLK + SELMS_DCOCLKDIV;// ACLK = REF0CLK (32kHz)、SMCLK/MCLK = DCODIV = 16MHz 内部
    CSCTL5 = DIVM_0 + DIVS_3;// MCLK 分频器(0)= 12MHz 或16MHz 来自内部、SMCLK 分频器(8)= 1.5MHz 或2MHz 内部 DCO 分频


    __ENABLE_INTERRUPT ();//Enable Global Interrupts -->



    //PMMCTL0_H = PMMPW_H; //解锁 PMM 寄存器
    //PMMCTL2 &=~(TSENSOREN);//关闭温度
    //while (ADCCTL1和 ADCBUSY);
    ADCCTL0 |= ADCENC + ADCSC;//启用 ADC 并开始转换

    while (1){

    if (((sample_count_adc_seq == 7)&&(sample_count < 10)){

    SAMPLE_COUNT_ADC_SEQ = 0;
    SAMPLE_COUNT++;
    ADC_pos++;//移动到 ADC 缓冲器采样数组中的下一个位置

    //while (ADCCTL1和 ADCBUSY); //等待 ADC 内核处于活动状态
    //ADCCTL0 |= ADCENC + ADCSC;//启用 ADC 并开始转换


    否则、如果(sample_count = 10){


    SAMPLE_COUNT = 0;
    ADC_pos = 0;//将 ADC 缓冲器采样位置设置回第一个字节


    否则{

    //__no_operation(); //仅用于调试
    //__delay_cycles (1000);
    sample_count = sample_count;






    返回0;



    //ADC 中断服务例程
    //#pragma vector=ADC_vector
    //_INTERRUPT void ADC_ISR (void)

    void __attribute__((interrupt (ADC_vector))) ADC_ISR (void)//将此声明用于 mspgcc 编译器



    ADCIFG &=~ADCIFG0;//清除中断标志


    if (adc_count = 6){
    adcB3V_SAMPLE[ADC_POS]= ADCMEM0;

    如果(ADC_COUNT = 5){、则为其他位
    adcB2V_SAMPLE[ADC_POS]= ADCMEM0;

    如果(ADC_COUNT = 4){、则为其他位
    adcB1V_SAMPLE[ADC_POS]= ADCMEM0;

    否则{
    ADC_SAMPLE_temp = ADCMEM0;


    if (adc_count = 0){
    ADC_COUNT = 6;//复位 ADC 通道计数

    否则{
    ADC_COUNT--;//递减中断计数


    SAMPLE_COUNT_ADC_SEQ++;//让主代码知道采样已完成、7 SAMPLE_COUNT =每个通道1个采样(A6 - A0)


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

    这是我现在使用的代码。 我在主循环中添加了两个断点、它们执行一次、但一旦程序进入 ADC ISR、它就永远不会返回主循环。

    int main (void){



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

    PM5CTL0 &=~LOCKLPM5; //禁用 GPIO 上电默认高阻抗模式
    //激活先前配置的端口设置

    //设置 ADC 控制寄存器
    // ADC 计算 Nadc = 1024 x (Vin - VR-)/(VR+- VR-)
    //我们已将 VR+= Vcc = 3.3V、VR-= AVSS = 0V 设置为以下
    //例如 Nadc = 1024

    SYSCFG2 = ADCPCTL4 + ADCPCTL5 + ADCPCTL6;//启用 ADC A4/A5/A6输入
    ADCCTL0 &=~ADCENC;//确保 ENC 清零
    ADCCTL0 |= ADCSHT_4 + ADCMSC + ADCON; // 64个时钟周期、自动转换的上升沿、ADC 开启、

    ADCCTL1 |= ADCSHS_0 + ADCSHP + ADCDIV_3 + ADCSSEL_2 + ADCCONSEQ_1;//sapnhld src SEL ADCSC、SAMPCON src SAMP 计时器、ADCCLK/4、ADC clk SMCLK、通道序列不重复
    ADCCTL2 |= ADCRES_1;//ADC 分辨率为10位
    ADCMCTL0 |= ADCSREF_0 + ADCINCH_6;// 000b ={VR+= AVCC 和 VR–= AVSS}、设置序列读取的最高模拟输入端口(A6)
    ADCIE |= ADCIE0;//为 ADC 启用中断


    P1SEL0 &=~BIT0;//设置 GPIO 的 P1.0 SEL (CHRG_B0)
    P1SEL1 &=~BIT0;
    P1DIR |= BIT0 + BIT1 + BIT2 + BIT3;//将 P1.0 - P1.3设置为输出
    P1OUT &=~BIT0;//将 P1.0设置为低电平

    P1SEL0 &=~BIT1;//设置 GPIO 的 P1.1 SEL (CHRG_B1)
    P1SEL1 &=~BIT1;
    P1OUT &=~BIT1;//将 P1.1设置为低电平

    P1SEL0 &=~BIT2;//设置 GPIO 的 P1.2 SEL (LOAD_B0)
    P1SEL1 &=~BIT2;
    P1OUT &=~BIT2;//将 P1.2设置为低电平

    P1SEL0 &=~BIT3;//设置 GPIO 的 P1.3 SEL (LOAD_B1)
    P1SEL1 &=~BIT3;
    P1OUT &=~BIT3;//将 P1.3设置为低电平

    CSCTL1 |= DCORSEL_5;//设置 DCO 设置-16MHz
    CSCTL2 &=(~FLLD0);//当使用来自 REF0CLK 的 DCO 时、这将把 DCO 分频
    CSCTL3 = SELMS_REFOCLK;
    CSCTL4 = SELA_REFOCLK + SELMS_DCOCLKDIV;// ACLK = REF0CLK (32kHz)、SMCLK/MCLK = DCODIV = 16MHz 内部
    CSCTL5 = DIVM_0 + DIVS_3;// MCLK 分频器(0)= 12MHz 或16MHz 来自内部、SMCLK 分频器(8)= 1.5MHz 或2MHz 内部 DCO 分频


    __ENABLE_INTERRUPT ();//Enable Global Interrupts -->



    //PMMCTL0_H = PMMPW_H; //解锁 PMM 寄存器
    //PMMCTL2 &=~(TSENSOREN);//关闭温度
    //while (ADCCTL1和 ADCBUSY);
    ADCCTL0 |= ADCENC + ADCSC;//启用 ADC 并开始转换

    while (1){

    if (((sample_count_adc_seq == 7)&&(sample_count < 10)){

    SAMPLE_COUNT_ADC_SEQ = 0;
    SAMPLE_COUNT++;
    ADC_pos++;//移动到 ADC 缓冲器采样数组中的下一个位置

    //while (ADCCTL1和 ADCBUSY); //等待 ADC 内核处于活动状态
    //ADCCTL0 |= ADCENC + ADCSC;//启用 ADC 并开始转换


    否则、如果(sample_count = 10){


    SAMPLE_COUNT = 0;
    ADC_pos = 0;//将 ADC 缓冲器采样位置设置回第一个字节


    否则{

    //__no_operation(); //仅用于调试
    //__delay_cycles (1000);
    sample_count = sample_count;






    返回0;



    //ADC 中断服务例程
    //#pragma vector=ADC_vector
    //_INTERRUPT void ADC_ISR (void)

    void __attribute__((interrupt (ADC_vector))) ADC_ISR (void)//将此声明用于 mspgcc 编译器



    ADCIFG &=~ADCIFG0;//清除中断标志


    if (adc_count = 6){
    adcB3V_SAMPLE[ADC_POS]= ADCMEM0;

    如果(ADC_COUNT = 5){、则为其他位
    adcB2V_SAMPLE[ADC_POS]= ADCMEM0;

    如果(ADC_COUNT = 4){、则为其他位
    adcB1V_SAMPLE[ADC_POS]= ADCMEM0;

    否则{
    ADC_SAMPLE_temp = ADCMEM0;


    if (adc_count = 0){
    ADC_COUNT = 6;//复位 ADC 通道计数

    否则{
    ADC_COUNT--;//递减中断计数


    SAMPLE_COUNT_ADC_SEQ++;//让主代码知道采样已完成、7 SAMPLE_COUNT =每个通道1个采样(A6 - A0)


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

    好的、断点似乎工作一次、然后代码进入 ADC ISR、从不返回。

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

    您是否正在使用低功耗模式(LPM)并在 ISR 结束时正确退出 LPM? 此外、如果 ISR 不能正确返回、则可能会导致信号堆栈溢出。 您能否发布 ADC ISR 的内容进行审核?

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

    不确定 LPM。 因此、我需要始终打开 CPU 时钟以进行监控和计时功能。 我没有将 MSP 设置为任何 LPM 模式、它是否默认为关闭? 我在您提供的示例中看到、它们在主循环中设置了_ bis_SR_register (LPM0_bits | GIE)、然后在 ADC ISR 中退出两个读数。 在用户指南中、LMP0-4关闭 CPU 和其他时钟。 我需要它始终处于激活模式。 本产品不是由电池供电的、并且使用适配器供电。

    当我在 main while 循环中设置断点、然后单步执行时、它将进入每一行、甚至是注释、看起来它会以某种方式偏移。 最初、它会转到与我使用过的其他 IDE 调试器类似的代码语句。 我试图发布整个计划、但回复不会成功。

    void __attribute__((interrupt (ADC_vector))) ADC_ISR (void)//将此声明用于 mspgcc 编译器



    ADCIFG &=~ADCIFG0;//清除中断标志


    if (adc_count = 6){
    adcB3V_SAMPLE[ADC_POS]= ADCMEM0;

    如果(ADC_COUNT = 5){、则为其他位
    adcB2V_SAMPLE[ADC_POS]= ADCMEM0;

    如果(ADC_COUNT = 4){、则为其他位
    adcB1V_SAMPLE[ADC_POS]= ADCMEM0;

    否则{
    ADC_SAMPLE_temp = ADCMEM0;


    if (adc_count = 0){
    ADC_COUNT = 6;//复位 ADC 通道计数

    否则{
    ADC_COUNT--;//递减中断计数


    SAMPLE_COUNT_ADC_SEQ++;//让主代码知道采样已完成、7 SAMPLE_COUNT =每个通道1个采样(A6 - A0)





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

    Mark、您好!

    如果您不使用 LPM、这是可以的。 除非使用_bis_SR_register (LPM0_Bits | GIE)等命令显式告知 CPU、否则不会输入它们。

    你的中断对我来说看起来很好。 通常、当我遇到断点问题时、这是因为编译器优化。 您能否尝试暂时删除编译器优化并再次尝试断点?

    此致、
    Caleb Overbay

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

    好的、这很好。 我计划在其他一些电池供电产品上使用 LPM、因此了解它们的工作原理也很有用。

    我将其关闭、并且不存在优化。 我还启动了一个新项目并复制了一些代码。 我设置一个断点、然后开始单步执行。 在 ADC ISR 之后、它抛出错误

    在 H:/CCS 工作区\NiCd_chrgr\Debug\NiCd_chrgr.out:{3}0xe040{4}"处没有可用于"__crt0_call_exit()的源文件

    我以前遇到过类似的错误、但通过在单击调试图标后加载程序来修复这些错误。 CCS6似乎确实存在问题。

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

    我已决定将我的代码移至您发送给我的示例、因为断点存在问题、可能是错误。 我使用这些设置进行了变通、并将 SYSCFG2 |=...4+...5+...6、将事先模拟参考更改为 AVCC (注释掉了内部参考部分)、并将 ADC 时钟留给 ACLK。 我在缓冲区中获得所有7个读数、断点现在工作正常。 当我将 ADC 更改为 SMCLK 时、转换后它似乎没有从 ADC ISR 返回。 我看不到他们在他们的代码中配置了任何时钟。

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

    现在、使用您发送给我的示例程序、一切似乎都正常、因此我只想介绍我的计时器设置和中断代码。 您是否有指向所有其他 MSP430FR2532示例程序的链接、以便我可以在需要时查看参考。 还有没有地方可以检查我在器件上留下了多少空间? 这是我在控制台中看到的信息吗...写入闪存/FRAM 的字节...

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

    Mark、您好!

    很高兴听到一切正常。 对于到目前为止的任何困惑、我深表歉意、我将致力于解决您在此过程中发现的错误。

    MSP430WARE 中还有更多 MSP430FR2532示例。 由于您在新 Resource Explorer 中发现的错误、您需要通过提供的链接安装软件、然后使用 Resource Explorer Classic 来访问它们。 这可能还需要在安装后重新启动 CCS。  

    此致、  

    Caleb Overbay

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    还可以! 卡勒布。 如果没有你们的帮助,我就不会有这么远的距离了。 非常感谢并很高兴知道 TI 在其器件、尤其是新器件背后提供了巨大的支持。 我在设计中使用了大量 TI 器件、我刚刚设计的最后一款 RFID 产品包含7个器件、其中包括用于 USB Type C 控制的新 TUB320。 我将从您提供的链接安装示例。

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

    我很高兴一切顺利、您在系统中使用了如此多的 TI 器件。 我们始终会尽力提供帮助。

    我将关闭此主题、但如果您有其他相关问题、请随时答复、我将回答。

    此致、
    Caleb Overbay