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:CCS/MSP430i2041

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

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

器件型号:MSP430I2041

工具/软件:Code Composer Studio

尊敬的所有人:

因此、我已经准备好了两个示例代码、这里是:

#include "driverlib.h"

uint16_t results[4]; // SD24转换和温度结果
//结果[0]=原始 SD24结果
//结果[1]=以 K 为单位的温度
//结果[2]= C 中的温度
// results[3]= F
uint8_t Flag_1中的 temp = 0; 针对 ADC
unsigned int Flag_2 = 0的//Flag 1; //针对计时


器#define TIMER_PERIOD 10
的标志2 unsigned int TIMER_PERIOD_PERIOD = 0;

void main (void){
//停止 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_single_mode;
param.groupEnable = SD24_not _grouped;
param.inputChannel = SD24_INPUT_CH_TEMRATURE;
param.dataFormat = SD24_data_format_2COMPLEMENT;
param.interruptDelay = SD24_Four_SAMPLE_INTERRUPT;
param.oversample.Ratio = SD24_oversample_256;
param.gain = SD24_gain_1;
SD24_initConverterAdvanced (SD24_BASE、&param);
SD24_enableInterrupt (SD24_BASE、SD24_converter_0、SD24_converter_interrupt);

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

//将 P2.1设置为输出引脚以驱动 LED
GPIO_setAsOutputPin (GPIO_PORT_P2、GPIO_PIN1);

// Timer_A 设置
Timer_A_initUpModeParam upModeConfig =
{
Timer_A_CLOCKSOURCE_SMCLK、 // SMCLK 时钟源
Timer_A_CLOCKSOURCE_divider _1、 // SMCLK/8 = 256kHz
Timer_Period、 // 250ms
Timer_A_TAIE_INTERRUPT_DISABLE、 //禁用溢出 ISR
Timer_A_CCIE_CCR0_INTERRUPT_ENABLE、//启用 CCR0中断
Timer_A_do 清除 //清除计数器
};

while (1){
//开始转换
SD24_startConverterConversion (SD24_BASE、SD24_converter_0);
//输入带中断的 LPM0
//_bis_SR_register (LPM0_bits | GIE);
//用于调试器
__no_operation();
如果(Flag_1 ==1)//中断例程完成
{

Flag_2 = 1;
GPIO_setOutputLowOnPin (GPIO_PORT_P2、GPIO_PIN1);//打开 LED
//将计时器配置为使用 ACLK 并在计时器到达 CCR0时中断
Timer_A_initUpMode (timer_A0_BASE、&upModeConfig);
Timer_A_startCounter (timer_A0_BASE、timer_A_up_mode);
//计算不同刻度的温度
results[1]=(无符号长整型) results[0]* 1200)/70711;
results[2]= results[1]- 273;
结果[3]=(结果[2]* 9/5)+ 32;
FLAG_2 = 0;

_DELAY_CYCLES (1000);
__no_operation();
Timer_Period_Period = 0;
GPIO_setOutputHighOnPin (GPIO_PORT_P2、GPIO_PIN1);//关闭 LED
FLAG_1 = 0;
//Flag_2 = 0;

}
_bis_SR_register (LPM0_bits | GIE);
//GPIO_setOutputHighOnPin (GPIO_PORT_P2、GPIO_PIN1);
//计算不同刻度的温度
//results[1]=(无符号长整型) results[0]* 1200)/70711;
//results[2]= results[1]- 273;
//results[3]=(results[2]* 9/5)+ 32;

__no_operation(); //在此设置断点


}
}//------------------

//中断函数
///-------------------------------------------------------
//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)
结果[0]= SD24_getHighWordResults (SD24_BASE、SD24_converter_0);
中断;
案例 SD24IV_SD24MEM1:中断;
案例 SD24IV_SD24MEM2:中断;
案例 SD24IV_SD24MEM3:中断;
默认值:break;
}
FLAG_1 = 1;
//__ BIC_SR_REGISTER_ON_EXIT (LPM0_Bits); //从 LPM0唤醒}//Timer_A--><!--kadov_tag{</spaces>}--><!--kadov_tag{</spaces>}--><!--kadov_tag{</spaces>}}-->




#if defined (__TI_Compiler_version__)|| defined (__IAR_systems_icc_)
#pragma vector=TIMER0_A0_vector
__interrupt
#elif defined (__GNU__)
__attribute__(interrupt (TIMER0_A0_vector)))
#endif
ISR (void TA0_void)
// TIMER0_A0_Vector 仅包含 CCR0中断
//无需检查/清除中断标志,切换 LED 以显示达到的 ISR
//GPIO_toggleOutputOnPin (GPIO_PORT_P1、GPIO_PIN4);
如果(Flag_2 = 1)
{
Timer_Period_Period = Timer_Period_Period +1;
}

}

目的是对将无符号长整型转换为开尔文、凯尔西斯和华氏的计算操作进行计时、并反复计时(以实现一致性)。  

Flag_1会检查新的 ADC 数据是否可用。

Flag_2是停止 TIMER_PERIOD_PERIOD 计数器。

因此、所花费的时间应为= 61.04 (ns)* 10 (timer_period)* timer_period_period。

我很确定、这是处理此问题的错误方法、因此我们希望获得任何帮助、我将断点放在哪里以读取 TIMER_PERIOD_PERIOD 值?

谢谢你。

此致、

Neal

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

    我建议采取更直接的方法:

    在连续模式下运行 timer_A0、因为这将简化算术。

    然后、用如下所示的内容括住您想要计时的序列:
    > uint16_t start、stop、ticks;
    >开始= Timer_A_getCounterValue (timer_A0_BASE);//之前的 TA0R
    [您想定时的东西]
    >停止= Timer_A_getCounterValue (timer_A0_BASE);// TA0R
    >节拍数=停止-开始;//执行时间、以定时器节拍为单位(1.024MHz)

    如果计数器寄存器同时溢出到0 (并非不可能)、则无符号减法将处理此问题。

    如果您想要的时间超过6556/1.024=64毫秒(我不认为会)、定时器将循环、您将获得奇数结果。 如果发生这种情况、增加时钟分频器、例如 TIMER_A_CLOCKSOURCE_DEVIDER_2。

    [编辑:如果您想知道:在这种情况下、您不需要计时器 ISR。]

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

    尊敬的 Bruce:

    感谢一位吨级的伴侣、它的工作方式就像一种魅力。  如果我错了、请纠正我的问题、但计时器计数器不使用 CPU 内核、而是它自己的补充功能吗?

    这是最终代码:



    #include "driverlib.h"
    
    uint16_t results[4]; // SD24转换和温度结果
    //结果[0]=原始 SD24结果
    //结果[1]=以 K 为单位的温度
    //结果[2]= C 中的温度
    // results[3]= F
    uint8_t Flag_1中的 temp = 0; //针对 ADC
    uint16_t start、stop、ticks 的 Flag 1;
    
    
    
    void main (void){
    //停止 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_single_mode;
    param.groupEnable = SD24_not _grouped;
    param.inputChannel = SD24_INPUT_CH_TEMRATURE;
    param.dataFormat = SD24_data_format_2COMPLEMENT;
    param.interruptDelay = SD24_Four_SAMPLE_INTERRUPT;
    param.oversample.Ratio = SD24_oversample_256;
    param.gain = SD24_gain_1;
    SD24_initConverterAdvanced (SD24_BASE、&param);
    SD24_enableInterrupt (SD24_BASE、SD24_converter_0、SD24_converter_interrupt);
    
    //对于1.2V 基准电压稳定、延迟~200us
    _delay_cycles (3200);
    
    //将 P2.1设置为输出引脚以驱动 LED
    GPIO_setAsOutputPin (GPIO_PORT_P2、GPIO_PIN1);
    
    // Timer_A 设置
    Timer_A_initContinuousModeParam continuousModeConfig =
    {
    Timer_A_CLOCKSOURCE_SMCLK、 // SMCLK 时钟源
    Timer_A_CLOCKSOURCE_divider _1、 // SMCLK/8 = 256kHz
    //timer_period、 // 250ms
    Timer_A_TAIE_INTERRUPT_DISABLE、 //禁用溢出 ISR
    Timer_A_CCIE_CCR0_INTERRUPT_DISABLE、//启用 CCR0中断
    Timer_A_do 清除 //清除计数器
    };
    
    Timer_A_initContinuousMode (timer_A0_BASE、&continuousModeConfig);
    
    while (1)
    {
    //开始转换
    SD24_startConverterConversion (SD24_BASE、SD24_converter_0);
    
    //用于调试器
    __no_operation();
    如果(Flag_1 ==1)//中断例程完成
    {
    GPIO_setOutputLowOnPin (GPIO_PORT_P2、GPIO_PIN1);//打开 LED
    //
    START = Timer_A_getCounterValue (timer_A0_BASE);//填充之前的 TA0R
    //计算不同刻度的温度
    results[1]=(无符号长整型) results[0]* 1200)/70711;
    results[2]= results[1]- 273;
    结果[3]=(结果[2]* 9/5)+ 32;
    STOP = Timer_A_getCounterValue (timer_A0_BASE);//在填充之后为 TA0R
    节拍数=停止-开始;//执行计时器节拍数(1.024MHz)
    
    
    _DELAY_CYCLES (1000);
    __no_operation();
    GPIO_setOutputHighOnPin (GPIO_PORT_P2、GPIO_PIN1);//关闭 LED
    flag_1 = 0;
    
    }
    _bis_SR_register (LPM0_bits | GIE);
    
    
    __no_operation(); //在此设置断点
    
    
    }
    }//------------------
    
    //中断函数
    ///-------------------------------------------------------
    //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)
    结果[0]= SD24_getHighWordResults (SD24_BASE、SD24_converter_0);
    中断;
    案例 SD24IV_SD24MEM1:中断;
    案例 SD24IV_SD24MEM2:中断;
    案例 SD24IV_SD24MEM3:中断;
    默认值:break;
    }
    flag_1 = 1;
    _BIC_SR_REGISTER_ON_EXIT (LPM0_BITS); //从 LPM0唤醒
    
    }
    
    

    此致、

    Neal

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

    计时器不是 CPU 的一部分、但 SMCLK 和 MCLK 来自相同的基准时钟、因此它们处于同步状态。 如果它们具有相同的分频值(您的分频值)、SMCLK 等于 CPU 时钟(MCLK)。

    我忘记了在启动时如何设置时钟。 MCLK/SMCLK 分频器为/1 (不是/16、正如我记忆中的那样)、所以定时器计数1/16.384MHz、并且它的范围为4ms。 [参考用户指南(SLAU335)秒 4.2.1.1]

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

    再次感谢。 是的、时钟、我一直想、无论如何、我只需将我的节拍数乘以61.04ns、我认为这就是诀窍。

    再次感谢您的观看。

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

    我很高兴听到 Bruce 已经解决了您的问题!
    快乐编码、
    Britta