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.
工具/软件:Code Composer Studio
我正在使用2个计时器(Timer_A0和 Timer_A1)对 MSP-EXP430F5529LP (LaunchPad)进行编程、条件如下:
Timer_A0:内部时钟(ACLK)、向上计数模式、捕获/比较中断被启用、定时器中断被禁用
Timer_A1:外部时钟(P1.6)、中断禁用、连续模式
Timer_A0工作正常(相应地生成中断)。
Timer_A1:我有问题。 我连接 P1.6悬空、接地和 VCC、并且计数器仍在这3个条件(浮点、GND、VCC)下运行、这意味着当我读取 TA1R (计时器计数器寄存器)时、我获得不同的值。 它应该仅在我将 P1.6放置到信号时进行计数、如果 P1.6接地、读数应该返回零。
我是否对这些计时器的工作方式有误解? 下面是用于初始化器件的代码的摘要。 欢迎提供任何帮助。
GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P1、GPIO_PIN6); // TA1CLK
Timer_A_initUpModeParam gTimerA0params ={0};
Timer_A_initContinuousModeParam gTimerA1params ={0};
// Timer_A0
gTimerA0params.clockSource =定时器_A_CLOCKSOURCE_ACLK; //使用 ACLK 作为定时器内部时钟
gTimerA0params.clockSourceDivider = TIMER_A_CLOCKSOURCE_DEVIDER_1; //将时钟频率除以1
gTimerA0params.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE; //在 TAxCTL 寄存器中禁用计时器中断
gTimerA0params.captureCompareInterruptEnable_CCR0_CCIE = TIMER_A_CAPTURECOMPARE 中断_ENABLE; //在 TAxCCTL0寄存器中启用捕捉比较中断
gTimerA0params.timerClear =定时器_A_DO 清除; //清除时间计数器 TAxR 寄存器
gTimerA0params.startTimer =错误; //尚未启动计时器。
gTimerA0params.timerPeriod = 500; //设置计时器周期
我打包了代码并在 F5529 Launchpad 上运行、但看不到您描述的行为。 我在 P1.2上以 TA0频率输出方波、并将其修补为 P1.6、TA1计数正确。 如果我将 P1.6连接到 GND、它不会计数。
我不知道我们在做什么不同。
作为参考(我将 TA0CNT0与 TA1R 进行了比较):
#include "driverlib.h" int main (void) { WDT_A_HOLD (WDT_A_base); GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P1、GPIO_PIN6);// TA1CLK Timer_A_initUpModeParam gTimerA0params ={0}; Timer_A_initContinuousModeParam gTimerA1params ={0}; // Timer_A0 gTimerA0params.clockSource = TIMER_A_CLOCKSOURCE_ACLK;//使用 ACLK 作为定时器内部时钟 gTimerA0params.clockSourceDivider = TIMER_A_CLOCKSOURCE_divider;//将时钟频率除以1 gTimerA0params.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE;//在 TAxCTL 寄存器中禁用计时器中断 gTimerA0params.captureCompareInterruptEnable_CCR0_CCIE = Timer_A_CAPTURECOMPARE INTERRUPT_ENABLE;//在 TAxCCTL0寄存器中启用捕捉比较中断 gTimerA0params.timerClear = TIMER_A_DO _清除;//清除时间计数器 TAxR 寄存器 gTimerA0params.startTimer = false; //尚未启动计时器。 gTimerA0params.timerPeriod = 500; //设置计时器周期 //清除挂起中断(在 TAxCTL 寄存器中清除标志 TAIFG) Timer_A_clearTimerInterrupt (timer_A0_BASE); //使用以前的参数初始化 TimerA0 Timer_A_initUpMode (timer_A0_BASE、&gTimerA0params); //*** Init TimerA1 *** gTimerA1params.clockSource = TIMER_A_CLOCKSOURCE_EXTERNAL_TXCLK;//使用 P1.6作为外部时钟源 gTimerA1params.clockSourceDivider = TIMER_A_CLOCKSOURCE_divider;//将时钟频率除以1 gTimerA1params.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE;//在 TAxCTL 寄存器中禁用计时器中断 gTimerA1params.timerClear = TIMER_A_DO _CLEAR;//清除时间计数器 TAxR 寄存器 gTimerA1params.startTimer = false; //尚未启动计时器。 //初始化 TimerA1 Timer_A_initContinuousMode (timer_A1_base、&gTimerA1params); //为 TA1进行计数 //跳线 P1.2到 P1.6以查看其计数 TA0CCR1 = TA0CCR0/2; // 50%的占空比,没有真正的理由 TA0CCTL1 = OUTMOD_7; //复位/置位提供方波 P1SEL |= BIT2; //根据 SLAS590N 表6-46在 P1.2上输出 TA0.1 P1DIR |= BIT2; Timer_A_startCounter (timer_A0_BASE、timer_A_up_mode); Timer_A_startCounter (timer_A1_base、timer_A_Continuous_mode); _enable_interrupt (); LPM0; //永久睡眠 返回(0); } 无符号 TA0CNT0; #pragma vector=TIMER0_A0_VECTOR __INTERRUPT void TA0_CCR0_ISR (void) { ++TA0CNT0; 返回; }
您好、Francisco、
我还在 MSP430F5529LP Launchpad 上测试了您的代码,没有做任何更改,一切都正常工作,在将 P1.6连接到时钟信号时,计数正常, 如果我将 P1.6连接到 GND 或悬空,则计数不正确。
此致、
Johnson He
Bruce、
非常感谢您的澄清。 我想确保我对 MSP430F5529计时器的理解是正确的。 在你的反馈之后、我返回到我的代码(比我发送的代码大)、因为我也在使用 USB 通信 API。 我放置在上面的代码是完成调用一个 C 函数来初始化定时器、然后我调用 API USB_setup (true、true)、所有这些都来自 main()。 当我更改了调用顺序时,首先调用 USB_setup(),然后初始化计时器,然后计时器开始正常工作。 在计时器初始化导致这种神秘的行为之后,它看起来像是调用 USB_setup()。 我将尝试详细了解 USB_setup() API 以进行确认,并确保它不是我所做的导致这种神秘行为的其他事情。
非常感谢您的快速支持
Shuai、
在你的反馈之后、我返回到我的代码(比我发送的代码大)、因为我也在使用 USB 通信 API。 在主函数中,我正在调用我的函数来初始化计时器,然后调用 USB_setup() API。 更改调用顺序后,首先是 USB_setup(),然后是我的计时器初始化,所有(计时器)都开始正常工作。
非常感谢您的快速响应。