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/MSP430FR5857:ADC12处于重复自动扫描模式。

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/681757/ccs-msp430fr5857-adc12-in-repeat-autoscan-mode

器件型号:MSP430FR5857
主题中讨论的其他器件:MSPWARE

工具/软件:Code Composer Studio

/*-版权所有-、BSD_EX
*版权所有(c) 2012、德州仪器(TI)公司
*保留所有权利。
*
*
只要
符合以下条件*、允许以源代码和二进制形式重新分发和使用:
*
*源代码的重新分发必须保留上述版权
声明*、此条件列表和以下免责声明。
*
***二进制形式的再发行必须在

*随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
*
***未经

事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。
*
*本软件由版权所有者和贡献者"按原样"提供
*、

不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或
*贡献者都不对任何直接、间接、偶然、特殊、
*模范、 或相应的损害(包括但不限于
*采购替代产品或服务;丧失使用、数据或利润;
*或业务中断)、但出于任何责任理论
、*无论是在合同中、严格责任还是由于
使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他)
、*即使已获悉可能会发生此类损坏。
*
***
*
* MSP430代码示例免责声明
*
* MSP430代码示例是自包含的低级程序
,通常*以
高度*简明的方式演示单个外设功能或器件功能。 为此、代码可能依赖于器件的加电默认
值*寄存器值和时钟配置等设置、
并且在组合多个示例中的代码时必须*小心以避免潜在的副作用
*。 另请参阅 www.ti.com/grace 了解 GUI、并参阅 www.ti.com/msp430ware
*了解外设配置的 API 函数库方法。
*
*--/版权--*
//*********
// MSP430FR59xx 演示- ADC12,样本 A1,AVcc 参考,如果 A1 > 0.5*AVcc,则设置 P1.0
//
说明:在 A1上以 AVcc 为基准进行单个样本。
//软件设置 ADC12SC 来启动采样和转换- ADC12SC
//在 EOC 上自动清除。 ADC12内部振荡器乘以采样(16x)
//和转换。 在主循环中、MSP430在 LPM0中等待节能、直到 ADC12
//转换完成、ADC12_ISR 将在主循环中强制从 LPM0中退出//
恢复。 如果 A1 > 0.5*AVcc,P1.0置位,否则复位。
还显示了对//和 ADC12中断的完全正确的处理。
//
//
//////// MSP430FR5969
// --------
// /|\| XIN|-
// || |
// -|RST XOUT|-
// | |
// --|P1.1/A1 P1.0|->LED
////
T.Witt/P. Thanigai
//德州仪器公司
// 2013年11月
//使用 IAR 嵌入式工作平台 V5.60和 Code Composer Studio v5.5构建
//*********
#include 

int main (void)
{
WDTCTL = WDTPW | WDTHOLD; //停止 WDT

// GPIO 设置
P2OUT &=~BIT2; //清除 LED 以启动
P2DIR |= BIT2; //将 P1.0/LED 设置为输出
P3OUT &=~BIT7; //清除 LED 以启动
P3DIR |= BIT7;
P1SEL1 = BIT0|BIT1; //为 ADC
P1SEL0 = BIT0|BIT1配置 P1.1;

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

//配置 ADC12
ADC12CTL0 = ADC12SHT0_2 | ADC12MSC ADC12ON| ADC12MSC; //采样时间、S&H=16、ADC12CTL1上的 ADC12
= ADC12SHP| ADC12CONSEQ_3; //使用采样计时器
ADC12CTL2 |= ADC12RES_2; // 12位转换结果
ADC12MCTL0 |= ADC12INCH_0; // A1 ADC 输入选择;Vref=AVCC
ADC12MCTL1 = ADC12INCH_1|ADC12EOS; // A1 ADC 输入选择;Vref=AVCC
ADC12IER0 = ADC12IE0| ADC12IE1; //启用 ADC 转换完成中断

ADC12CTL0 |= ADC12ENC | ADC12SC; //在
(1)
时开始采样/转换{
//__delay_cycles (5000);
ADC12CTL0 |= ADC12ENC | ADC12SC; //开始采样/转换

_bis_SR_register (LPM0_bits | GIE); // LPM0、ADC12_ISR 将强制退出
__no_operation(); //对于调试器*/
}
#if

defined (__TI_Compiler_version__)|| defined (__IAR_systems_ICC__)
#pragma vector = ADC12_vector
__interrupt void ADC12_ISR (void)
#elif defined (__GNU__)
void COMPILE_attribute__(interrupt (interrupt (interrupt (ADC12_ISR))#vector (void

)#ADC12_error!
#endif
{
switch (__even_in_range (ADC12IV、ADC12IV_ADC12RDYIFG))
}
ADC12IV_NONE 案例: 中断; //向量0:无中断
案例 ADC12IV_ADC12OVIFG:中断; //向量2:ADC12MEMx 溢出
ADC12IV_ADC12TOVIFG 案例:中断; //向量4:转换时间溢出
案例 ADC12IV_ADC12HIIFG:break; //向量6:ADC12BHI
ADC12IV_ADC12LOIFG 案例:中断; //向量8:ADC12BLO
ADC12IV_ADC12INIFG 案例:中断; //向量10:ADC12BIN
ADC12IV_ADC12IFG0案例: //向量12:ADC12MEM0中断
IF (ADC12MEM0 >= 0x7ff) // ADC12MEM0 = A1 > 0.5AVcc?
P2OUT |= BIT2; // P1.0 = 1
其他
P2OUT &=~BIT2; // P1.0 = 0
_BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//退出活动 CPU
中断; //将 CPUOFF 位从0 (SR)清零
ADC12IV_ADC12IFG1案例: //向量14:ADC12MEM1
IF (ADC12MEM1 >= 0x7ff) // ADC12MEM0 = A1 > 0.5AVcc?
P3OUT |= BIT7; // P1.0 = 1
其他
P3OUT &=~BIT7; // P1.0 = 0
_BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//退出活动 CPU
中断;
ADC12IV_ADC12IFG2案例:中断; //向量16:ADC12MEM2
ADC12IV_ADC12IFG3案例:中断; //向量18:ADC12MEM3
ADC12IV_ADC12IFG4案例:中断; //向量20:ADC12MEM4
ADC12IV_ADC12IFG5案例:中断; //向量22:ADC12MEM5
ADC12IV_ADC12IFG6案例:中断; //向量24:ADC12MEM6
ADC12IV_ADC12IFG7案例:中断; //向量26:ADC12MEM7
ADC12IV_ADC12IFG8案例:中断; //向量28:ADC12MEM8
ADC12IV_ADC12IFG9案例:中断; //向量30:ADC12MEM9
ADC12IV_ADC12IFG10案例:中断; //向量32:ADC12MEM10
ADC12IV_ADC12IFG11案例:中断; //向量34:ADC12MEM11
ADC12IV_ADC12IFG12案例:中断; //向量36:ADC12MEM12
ADC12IV_ADC12IFG13案例:中断; //向量38:ADC12MEM13
ADC12IV_ADC12IFG14案例:中断; //向量40:ADC12MEM14
ADC12IV_ADC12IFG15案例:中断; //向量42:ADC12MEM15
ADC12IV_ADC12IFG16案例:中断; //向量44:ADC12MEM16
ADC12IV_ADC12IFG17案例:中断; //向量46:ADC12MEM17
ADC12IV_ADC12IFG18案例:中断; //向量48:ADC12MEM18
ADC12IV_ADC12IFG19案例:中断; //向量50:ADC12MEM19
ADC12IV_ADC12IFG20案例:中断; //向量52:ADC12MEMM20
ADC12IV_ADC12IFG21案例:中断; //向量54:ADC12MEM21
ADC12IV_ADC12IFG22案例:中断; //向量56:ADC12MEM22
ADC12IV_ADC12IFG23案例:中断; //向量58:ADC12MEM3
ADC12IV_ADC12IFG24案例:中断; //向量60:ADC12MEM24
ADC12IV_ADC12IFG25案例:中断; //向量62:ADC12MEM25
ADC12IV_ADC12IFG26案例:中断; //向量64:ADC12MEM26
ADC12IV_ADC12IFG27案例:中断; //向量66:ADC12MEM27
ADC12IV_ADC12IFG28案例:中断; //向量68:ADC12MEM28
ADC12IV_ADC12IFG29案例:中断; //向量70:ADC12MEM29
ADC12IV_ADC12IFG30案例:中断; //向量72:ADC12MEM30
ADC12IV_ADC12IFG31案例:中断; //向量74:ADC12MEM31
案例 ADC12IV_ADC12RDYIFG:break; //向量76:ADC12RDY
默认值:中断;
}
}

上面给出的是我根据 MSPWare 中给出的示例编辑的代码。 我尝试了自动扫描模式(通道序列)、它工作正常、但重复自动扫描(重复通道序列) 代码错误不工作。 帮助我解决我的问题。

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

    我读出以下内容:使用 ADC12SHT_2时、每次转换需要16+13+1=30个 ADC 时钟。 我记得、在启动时、MCLK 为~1MHz、MODOSC (ADC12SSEL_0)为~5MHz、因此在中断之间是30/5=6个 CPU 周期、或者大约两个 CPU 指令。 您可能只需为进入/退出 ISR 预算至少30个 CPU 指令。

    简而言之:ADC 为您提供了大量数据(!) 处理速度更快。 由于 ADC12IV_ADC12IFG0具有更高的优先级、因此您将(永远)仅处理通道 A0数据、因此我希望 A1看起来不工作。 如果是、解决方案是降低 ADC 的速度、即(a)较慢的时钟(ACLK?) 或者(b)返回 CONSEQ=1并使用软件或定时器触发器(ADC12SHS)对其进行步速。

    但这只是我。 如果您描述不起作用的内容、可能是最好的。