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.

[参考译文] MSP430G2955:如何将引脚振荡器输出路由到计时器时钟输入或计时器捕捉通道?

Guru**** 2577385 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/608742/msp430g2955-how-to-route-the-pin-oscillator-output-to-timer-clock-input-or-timer-capture-channel

器件型号:MSP430G2955

您好!

当我处理引脚振荡器并尝试了解电容式触控软件库时、我得出结论:timer0_A3 (用作振荡计数器) 和 Timer1_A3 (用作选通时间)的配置如下:

因此我的问题是、当输入时钟来自 P1.0 (振荡)时、timer0_A3工作正常。 但是、引脚 P1.1 (即使在示波器上看到振荡)不进行计数、这意味着引脚 P1.1不会路由到计时器、我在用户指南上已经阅读过、某些引脚振荡器输出会路由到计时器时钟输入或计时器捕捉通道、 那么、我的问题是如何将引脚振荡器输出路由到计时器时钟输入或带有微控制器上的寄存器的计时器捕捉通道?

#include "msp430g2955.h"
char t=0;
int meas _cnt[8];

void main (void)
{
WDTCTL = WDTPW + WDTHOLD;//停止 WDT 以防止复位
BCSCTL1 = CALBC1_16MHz; //将 DCO 设置为1MHz
DCOCTL = CALDCO_16MHz;

P2DIR |= BIT2; //P2.2输出
while (1){

//******** Timer0_A3作为计数器 //
//配置 Timer0_A3
TA0CTL =tassel_0|ID_3|MC_2|TACLR; // TACLK (PinOsc 时钟源)=tassel_0、ID_0=输入分频器:0、MC_2=继续
TA0CCTL0 =CM_3|CCIS_0|CAP|SCS; //CM_3=正边沿、CCIS_2=GND、CAP=捕获模式
//********* PIN_LOCATOR********* //
//配置端口1按钮的引脚振荡器
P1DIR &=~ BIT1; //P1.1
P1SEL &=~ BIT1;
P1SEL2 |= BIT1;

//******** Timer1_A0作为选通时间 //
TA1CCTL0 |= CCIE; //启用 CCR0中断
TA1CTL |= tassel_2 + MC_1 + ID_3; // SMCLK/8、upmode
TA1CCR0 = 5; //保留与 TA1R (SMCLK/8)/8000 = 250Hz 4ms 进行比较的数据。
_BIS_SR (GIE);//Enter LPM0和中断被启用
while (t = 0);
T = 0;
MEAS_cnt[0]= TA0CCR0; //保存结果
TA1CTL|=TACLR;
P1SEL2 &=~BIT1;

}
}

//计时器 A1中断服务例程
#pragma vector=Timer1_A0_vector
__interrupt void Timer_A (void)
{
t=1;
//TA0CCTL0 ^= CCIS0; //创建 CCR0
TA1CCTL0的软件捕获&&~ CCIE; //禁用 CCR0中断

} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    void TI_CTS_fRO_PINOSC_TA0_TA1_HAL (const 结构传感器*组、uint16_t *计数)
    {
    uint8_t i;
    
    /*
    *上下文保存
    *状态寄存器:GIE
    * TIMERA0:TA0CTL、TA0CCTL0、TA0CCR0
    * TIMERA1:TA1CTL
    端口:PxSEL、PxSEL2
    *
    uint8_t contextSaveSR;
    uint16_t contextSaveTA0CTL、contextSaveTA0CCTL0、contextSaveTA0CCR0;
    uint16_t contextSaveTA1CTL;//、contextSaveTA1CCTL0、contextSaveTA1CCR0;
    uint8_t contextSaveSel、contextSaveSel2;
    
    contextSaveSR =__get_SR_register ();
    contextSaveTA0CTL = TA0CTL;
    contextSaveTA0CCTL0 = TA0CCTL0;
    contextSaveTA0CCR0 = TA0CCR0;
    contextSaveTA1CTL = TA1CTL;
    // contextSaveTA1CCTL0 = TA1CCTL0;
    // contextSaveTA1CCR0 = TA1CCR0;
    
    //**设置测量计时器*********
    //选项为 TA0、TA1、TB0、TB1、TD0、TD1这些选项被向上推入
    //电容式触控层。
    
    //使用 TimerA0精确地配置测量间隔 I uSD
    TA0CCR0 =(group->accumulationCycles);
    /*
    *来自 sourceScale 定义的 INCLK、IDX 设置
    *
    TA0CTL = tassel_3 + group->sourceScale;
    TA0CCTL0 = CCIE;
    
    //配置和开始测量时间 A1
    // TA1CTL = group->measGateSource + MC_2 + TACLR;//继续精确;y 我使用的内容
    // TA1CCTL0 = CM_3+CCIS_2+CAP+SCS; // Pos&Neg、GND、Cap、Sync
    
    对于(i = 0;i<(group->numElements,);i++)
    {
    //上下文保存
    contextSaveSel =*((group->arrayPtr[i])->inputPxselRegister);
    contextSaveSel2 =*((group->arrayPtr[i])->inputPxsel2Register);
    //为张弛振荡器配置端口
    *((group->arrayPtr[i])->inputPxselRegister )和=~((group->arrayPtr[i])->inputBits );
    *((group->arrayPtr[i])->inputPxsel2Register)|=((group->arrayPtr[i])->inputBits );
    
    //配置并启动测量时间器 A1
    TA1CTL = group->measGateSource + MC_2 + TACLR;//续
    TA1CTL &=~TAIFG;
    TA0CTL |=(TACLR + MC_1);//清除计时器、向上计数模式
    /*
    *在此配置中,measGateSource 表示测量值
    *定时器 TIMERERA1的源、它可以来自 TACLK、ACLK、
    * SMCLK 或 INCLK。
    *
    if (group->measGateSource =timer_ACLK)
    {
    _bis_SR_register (LPM3_bits+GIE);
    }
    其他
    {
    _bis_SR_register (LPM0_bits+GIE);
    }
    TA1CTL &=~MC_2;
    TA0CTL &=~MC_1; //停止计时器
    IF (TA1CTL 和 TAIFG)
    {
    /*
    *如果定时器发生翻转、则将计数设置为
    * 0。 这将防止错误数据进入基线
    *跟踪算法。
    *
    Counts[i]= 0;
    }
    其他
    {
    Counts[i]= TA1R; //保存结果
    }
    // TA1CCTL0 &=~CCIFG;
    //上下文恢复
    *((group->arrayPtr[i])->inputPxselRegister)= contextSaveSel;
    *((group->arrayPtr[i])->inputPxsel2Register)= contextSaveSel2;
    } //结束循环
    //上下文恢复
    if (!(contextSaveSR & GIE))
    {
    _BIC_SR_register (GIE);
    }
    TA0CTL = contextSaveTA0CTL;
    TA0CCTL0 = contextSaveTA0CCTL0;
    TA0CCR0 = contextSaveTA0CCR0;
    TA1CTL = contextSaveTA1CTL;
    } 

    您好、Ryan、

    我刚刚了解了它、现在我了解了它们在库中的表现、但当我对引脚 P1.1使用相同的配置时、引脚振荡不会馈送 timer0_A3

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

    您不能同时提供(CCR0)和 TACLK (TACLK) TA0。 这就是该函数使用 TA0和 TA1的原因、您的应用需要执行相同的操作。 如果您打算使用 P1.1作为源、则 TACLK 需要向 P2.0/TA1CLK 或 P4.7/TB0CLK 供电。

    线程后面提供了更好的说明。

    此致、
    Ryan

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

    Ryan、您好、您是说我无法通过引脚 P1.1产生的振荡来提供 timer0_A3、但仅通过引脚 P2.0提供、如果是这样、 因此、无法以某种方式使用引脚 P1.1的引脚振荡器配置、因为我们只是使引脚具有振荡、并且微控制器的任何寄存器都无法使用。

    我想总结一下 TA0.0代表 CCR0、依此类推、直到 TA0.2、 这意味着、对于我来说、我只能通过引脚 P1.1为输入捕捉通道 TA0.0供源、并且我无法使用计时器对引脚 P1.1的振荡数量进行计数、因为它不像引脚 P1.0中那样进行路由。 那么、我们如何从未路由到计时器的引脚的引脚振荡中获得好处呢? 为什么、当我在 ti.wiki processors.wiki.ti.com/.../MSP430_Low_Cost_PinOsc_Capacitive_Touch_Keypad 和用户指南第330页中重新将具有引脚振荡器特性的所有引脚路由到计时器时、实际上并不是这样?

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

    让我们后退一步、通过阅读概述页面来了解频率生成(PinOsc GPIO)、测量(Timer0_A3)和扫描(Timer1_A3)之间的差异、从而消除一些混淆: processors.wiki.ti.com/.../MSP430_Low_Cost_PinOsc_Capacitive_Touch_Overview

    传感器元件连接到 PinOsc GPIO。 TA0CLK 被内部连接至 PinOsc 以进行测量。 这种情况下、单独的定时器 TA1也仅在内部使用、便于进行定期扫描。 因此、您的传感器通过 PinOsc 外设而不是计时器输入连接到 MSP430。 您的所有计时器配置均用于内部控制、不会直接影响传感器引脚的驱动。 无需更改 TI_CTS_fRO_PINOSC_TA0_TA1_HAL 函数、但您需要修改它接收到的传感器输入。 如果我以前的答复中没有明确说明这一点,我表示歉意。

    重复: 请勿更改 HAL 函数、请更改传感器元件输入。  可以使用数据表中确定的具有电容式感应功能的任何引脚 OSC 引脚。  使用 TI 提供的代码示例作为指南。

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Ryan、我完全了解、我已经使用引脚 P1.1尝试过此代码、但代码无法正常工作、这意味着传感器元件连接到 pinOsc P1.1、但 TA0CLK 内部未连接以进行测量(Timer0_A3)、 TA1工作得非常完美。所以我知道我的传感器是通过 PinOsc 外设连接的、正如您所说的、不是计时器输入、而是针对这个引脚 P1.1和它的 PinOsc 外设没有到计时器的内部连接、这就是为什么它不测量任何内容、我们可以看到 我的结论是、我们可以启用 PinOsc 外设、但不能用于那些没有到 PinOsc 外设的 TA0CLK 内部连接的引脚、以便它们可以进行测量、否则它会像 P1.0引脚那样工作