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.

[参考译文] MSP430G2553:如何将此计时器类与按钮结合使用?

Guru**** 2578945 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/730230/msp430g2553-how-to-use-this-timer-class-with-a-button

器件型号:MSP430G2553

您好! 我目前正在参加一个嵌入式系统编程课程、我们最近让该器件完成我们的实验/任务。

本周的任务是使用按钮(BIT3)打开和关闭红灯、并使用头文件和类在单独的文件中编写代码。  

不管怎样,我已经有了函数的工作方式,比如按下按钮-->打开,再次按下-->关闭。 我的问题是、我不理解如何使用我们得到的这个 timer.c 类。 我想它的用途是为了解决去抖问题?

这是 timer.c 的代码

#include "project.h"
#include "led.h"

#include "timer.h"

#define divider 8
#define TMRC (DCO_FREQ / divider / 1000 * timer_interval)

static tWord tickCount=0;

void Timer_Init(){

BCSCTL1 = CALBC1_16MHz;
DCOCTL = CALDCO_16MHz;
BCSCTL2 = 0x0;// MCLK 时钟源 DCOCLK、MCLK 分频器1、SMCLK 源 DCOCLK、SMCLK 分频器1

//设置中断和计时器0

//启用定时器上的中断
CCTL0 = CCIE;

//使用时钟 SMCLK、递增计数、8分频
TACTL = TASSEL_2 + MC_1 + ID_3;

//设置比较值
CCR0 = TMRC;
}

__attribute__((interrupt (TIMER0_A0_Vector)) void Timer_A (void){
timer_run ();
}

tWord getTick (){return tickCount;}

timer_run (){
tickCount++;
led_Update ();
}

tWord ==无符号整型

#define TMRC (DCO_FREQ /除法器/1000 * TIMER_INTERVAL)<--在这里,没有定义任何内容,我甚至不明白什么是 DCO_FREQ? 我认为 Timer_interval 必须由我实际执行的主函数进行设置。

LED_Update 由我编写: 

void led_Update(){
if (status=LED_STAT_ON){
RED_LED_PORT |= RED_LED_PIN;
}
否则{
RED_LED_PORT &=~RED_LED_PIN;
}

按下按钮时状态变量会改变。

有人能给我一些关于如何使用计时器课程的提示吗? 我显然还在 主类中使用__enable_interrupt ()。 我已经注意到、如果我手动设置 CCR0 = 10000、Timer_A 中断方法运行得非常频繁;例如...。。

谢谢!

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

    [引用 user="Matheos Mattssn"]#define TMRC (DCO_FREQ /分频器/1000 * timer_interval)<--在这种情况下,没有定义任何内容,我甚至不明白 DCO_FREQ 是什么? 我认为 Timer_interval 必须由我实际执行的主函数设置。

    "DCO_FREQ"应在其中一个头文件中定义、并且应等于 DCO 的频率、DCO 为系统时钟提供时钟源。 如果您使用16MHz 校准系数在 Timer_Init()函数中设置 DCO,我会假设它大约等于16000000。 请搜索您的头文件以确保正确。 我建议将 DCO 配置代码移到 Timer_Init()函数之外并移到系统级 init 函数中。 您可以参考我们的代码示例以确保 DCO 设置正确。

    关于计时器的用途、我不确定它在这里的用途。 可以去抖、但我也看到了您可以使用计时器以按按钮的速度指示的频率使 LED 闪烁的位置。 您按下它的速度越快、LED 的闪烁速度就越快。 同样、如果您对如何使用计时器有疑问、可以参考我们的代码示例。

    此致、

    James

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在我的任何头文件中都没有定义 DCO_FREQ (即使您引用 MSP430.h 也是如此)。 计时器的头文件如下所示
    #ifndef _timer_H
    #define _timer_H

    #include "project.h"

    void Timer_Init();

    void timer_run();

    tWord getTick();

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

    [引用 USER="Matheos Mattsson"]DCO_FREQ 未在我的任何头文件中定义(即使您引用 MSP430.h 也不定义)。[/引用]

    它必须在某处定义。 TMRC 等于什么? 您将使用它在代码中设置 CCR0。 如果您使用的是 CCS、请尝试按住"Ctrl"键、选择鼠标光标、然后单击"DCO_FREQ"定义。 它应该会将您转至定义它的文件。 如果没有、您可以将其突出显示并在 CCS 中搜索其源代码或定义。 您是否知道应该如何使用计时器?

    此致、

    James