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/MSP430I2041:msp430i2041

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/751091/ccs-msp430i2041-msp430i2041

器件型号:MSP430I2041

工具/软件:Code Composer Studio

尊敬的所有人:

我很难理解"SD24中断"的完整过程。 那么、这是我一直使用的以下代码:

#include "driverlib.h"

uint16_t results[320]; // SD24转换和温度结果
//结果[0]=原始 SD24结果
//结果[1]=以 K 为单位的温度
//结果[2]= C 中的温度
// results[3]= F
uint8_t Flag_1中的 temp = 0; 针对 ADC
uint8_t Flag_2 = 0的//Flag 1; //数据就绪标志2
uint16_t start_timer_counter;
uint16_t stop_timer_counter;
uint16_t ticks timer_counter;

uint16_t result0_adc;
uint16_t square_adc;
uint16_t sum_square_adc;


void main (void)
{
uint16_t i = 0;
//停止 WDT
WDT_HOLD (WDT_BASE);

//内部参考
SD24_init (SD24_BASE、SD24_REF_INTERNAL);

//Ch0单模式内部温度传感器
SD24_initConvertterAdvancedParam param ={0};
param.converter = SD24_converter_0;
param.conversionMode = SD24_Continuous_mode;
param.groupEnable = SD24_not _grouped;
param.inputChannel = SD24_INPUT_CH_ANALOG;
param.dataFormat = SD24_data_format_binary;
param.interruptDelay = SD24_Four_SAMPLE_INTERRUPT;
param.oversample.Ratio = SD24_oversample_256;
param.gain = SD24_gain_16;
SD24_initConverterAdvanced (SD24_BASE、&param);
SD24_enableInterrupt (SD24_BASE、SD24_converter_0、SD24_converter_interrupt);

//对于1.2V 基准电压稳定、延迟~200us
_delay_cycles (3200);

//开始转换
SD24_startConverterConversion (SD24_BASE、SD24_converter_0);

while (1)
{
_bis_SR_register (LPM0_bits | GIE);
__no_operation();
如果(Flag_1 = 1)
{
flag_1 = 0;
}
}//------------------



//中断函数
///-------------------------------------------------------
//ADC
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector=SD24_vector
__interrupt void SD24_ISR (void){
#elif defined (__GNU__)
void __attribute__((interrupt (SD24_vector)))) SD24_ISR


(void))不支持!
#endif
开关(__evo_in_range (SD24IV、SD24IV_SD24MEM3))
{
案例 SD24IV_NONE:break;
案例 SD24IV_SD24OVIFG:中断;
案例 SD24IV_SD24MEM0:
//保存 CH0结果(清除 IFG)
result0_adc = SD24_getHighWordResults (SD24_BASE、SD24_converter_0);
results[i]= result0_adc;
i=i+1;
如果(i>319)
{
I = 0;
flag_1 = 1;
}
__no_operation();//断点
中断;
案例 SD24IV_SD24MEM1:中断;
案例 SD24IV_SD24MEM2:中断;
案例 SD24IV_SD24MEM3:中断;
默认值:break;
}

_BIC_SR_REGISTER_ON_EXIT (LPM0_BITS); //从 LPM0唤醒

}

我认为正在发生的情况是:SD24在进入 while 循环之前开始转换、一旦数据就绪、就会产生中断、SD24开始下一次转换。 在下一次转换开始时、会执行中断例程;即将 ADC 值存储到数组中、检查 i>319、最后提高/唤醒 CPU。

2. CPU 被唤醒后、它会检查标志并返回到 LPM0。

如果我错了、请纠正我的错误、并在上面显示更多信息。

此

致
、Neal

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我认为正在发生的情况是:SD24在进入 while 循环之前开始转换、一旦数据就绪、就会产生中断、SD24开始下一次转换。 在下一次转换开始时、会执行中断例程;即将 ADC 值存储到数组中、检查 i>319、最后提高/唤醒 CPU。

    2. CPU 被唤醒后、它会检查标志并返回到 LPM0。

    如果我错了、请纠正我的错误、并在上面显示更多信息。

    谢谢你

    此致、
    Neal
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我想您已经对它进行了完整的描述。

    一旦 FLAG_1 = 1、您就有一个完整的缓冲区(320个样本)可供使用。 您可能应该很快获取结果[0]、因为下一次转换(ISR 调用)将覆盖它。