MSP430看门狗和定时器

浅聊看门狗细说定时器

1.看门狗

什么是看门狗?看门狗的作用是什么?

如何配置和使用看门狗?

1.1描述:

看门狗就像守护神防止系统跑飞。用四个子来描述:定时喂狗,狗饿复位。

MSP430默认是开启看门狗的,因此我们在没有配置看门狗的情况下要关掉看门狗防止一直复位。

看门狗有两种模式:定时结束没有喂狗立刻复位,定时结束没有喂狗进入中断不复位。

1.2看门狗寄存器

WDTCTL是一个十六位的寄存器

这就是看门狗的相关内容,下面我们来讲今天的重头戏-定时器

2.定时器

2.1定时器简述:

TimerA由一个十六位寄存器和多路捕获/比较通道组成,MSP430f5529有3个定时器A的子模块,7个捕捉比较模块,它支持多重捕获/比较,PWM,定时,中断等功能。

2.2定时器寄存器简述:

2.2.1TACTL,Timer_A 控制寄存器

这个可以说是最重要的寄存器了,它用于设定定时器的时钟源,工作模式,中断使能等

2.2.2TAxR,当前时刻计数值

2.2.3TACCTLx,捕获/比较控制寄存器

 默认全为0

 2.2.4TAxCCRn比较预设数值

2.2.5TAIVTimer_A 中断向量寄存器

TAEX0 Timer_A 扩展寄存器 0(基本不用)

2.3定时器计数模式

向上计数模式,可以通过设定TAXCARR0来定设定定时器周期,TAXCARR0要小于0FFFFH

这个模式用的最多

连续计数

周期只能由定时器频率来决定,不能提前结束,必须时从0到0FFFFH。

增减计数

从0开始增到TAXCARR0,再从TAXCARR0减到0。

以模式7为例:小于设定值输出高大于输出值输出低电平。一般选择模式七比较符合逻辑规律。

2.3定时器相关库函数 

//*****************************************************************************
//
//!brief 开始Timer_A计数器
//!
//!此函数假定之前已使用
//!Timer_A_initContinuousMode、Timer_A_initUpMode或Timer_A_initUpDownMode。
//!
//!param baseAddress 是 TIMER_A 模块的基址。
//!param timerMode 模式来放置计时器
//!       有效值为:
//!       - b TIMER_A_STOP_MODE
//!       - b TIMER_A_UP_MODE
//!       - b TIMER_A_CONTINUOUS_MODE [默认]
//!       - b TIMER_A_UPDOWN_MODE
//!
//!修改了 b TAxCTL 寄存器的位。
//!
//!return 无
//
//*****************************************************************************
extern void Timer_A_startCounter(uint16_t baseAddress,
                                 uint16_t timerMode);

//*****************************************************************************
//
//!brief 配置Timer_A在连续模式下。
//!
//!param baseAddress 是 TIMER_A 模块的基址。
//!param param 是指向连续模式初始化的结构的指针。
//!
//!修改了 b TAxCTL 寄存器的位。
//!
//!return 无
//
//*****************************************************************************
extern void Timer_A_initContinuousMode(uint16_t baseAddress,
                                       Timer_A_initContinuousModeParam *param);

//*****************************************************************************
//
//!brief 配置Timer_A在启动模式下。
//!
//!param baseAddress 是 TIMER_A 模块的基址。
//!param param 是指向 up 模式初始化的结构的指针。
//!
//!修改了 b TAxCTL 寄存器的位、b TAxCCTL0 寄存器的位和位
//!的 b TAxCCR0 寄存器。
//!
//!return 无
//
//*****************************************************************************
extern void Timer_A_initUpMode(uint16_t baseAddress,
                               Timer_A_initUpModeParam *param);

//*****************************************************************************
//
//!brief 在向上向下模式下配置Timer_A。
//!
//!param baseAddress 是 TIMER_A 模块的基址。
//!param param 是指向用于上下模式初始化的结构的指针。
//!
//!修改了 b TAxCTL 寄存器的位、b TAxCCTL0 寄存器的位和位
//!的 b TAxCCR0 寄存器。
//!
//!return 无
//
//*****************************************************************************
extern void Timer_A_initUpDownMode(uint16_t baseAddress,
                                   Timer_A_initUpDownModeParam *param);

//*****************************************************************************
//
//!brief 初始化捕获模式
//!
//!param baseAddress 是 TIMER_A 模块的基址。
//!param param 是指向用于捕获模式初始化的结构的指针。
//!
//!修改了 b TAxCCTLn 寄存器的位。
//!
//!return 无
//
//*****************************************************************************
extern void Timer_A_initCaptureMode(uint16_t baseAddress,
                                    Timer_A_initCaptureModeParam *param);

//*****************************************************************************
//
//!brief 初始化比较模式
//!
//!param baseAddress 是 TIMER_A 模块的基址。
//!param param 是指向 struct 的指针,用于比较模式初始化。
//!
//!修改了 b TAxCCRn 寄存器的位和 b TAxCCTLn 寄存器的位。
//!
//!return 无
//
//*****************************************************************************
extern void Timer_A_initCompareMode(uint16_t baseAddress,
                                    Timer_A_initCompareModeParam *param);

//*****************************************************************************
//
//!brief 启用定时器中断
//!
//!不清除中断标志
//!
//!param baseAddress 是 TIMER_A 模块的基址。
//!
//!修改了 b TAxCTL 寄存器的位。
//!
//!return 无
//
//*****************************************************************************
extern void Timer_A_enableInterrupt(uint16_t baseAddress);

//*****************************************************************************
//
//!brief 禁用定时器中断
//!
//!param baseAddress 是 TIMER_A 模块的基址。
//!
//!修改了 b TAxCTL 寄存器的位。
//!
//!return 无
//
//*****************************************************************************
extern void Timer_A_disableInterrupt(uint16_t baseAddress);

//*****************************************************************************
//
//!brief 获取计时器中断状态
//!
//!param baseAddress 是 TIMER_A 模块的基址。
//!
//!return 下列项之一:
//!        - b TIMER_A_INTERRUPT_NOT_PENDING
//!        - b TIMER_A_INTERRUPT_PENDING
//!        n 指示Timer_A中断状态
//
//*****************************************************************************
extern uint32_t Timer_A_getInterruptStatus(uint16_t baseAddress);

//*****************************************************************************
//
//!brief 启用捕获比较中断
//!
//!不清除中断标志
//!
//!param baseAddress 是 TIMER_A 模块的基址。
//!param captureCompareRegister 是选定的捕获比较寄存器
//!       有效值为:
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_0
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_1
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_2
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_3
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_4
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_5
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_6
//!
//!修改了 b TAxCCTLn 寄存器的位。
//!
//!return 无
//
//*****************************************************************************
extern void Timer_A_enableCaptureCompareInterrupt(uint16_t baseAddress,
                                                  uint16_t captureCompareRegister);

//*****************************************************************************
//
//!brief 禁用捕获比较中断
//!
//!param baseAddress 是 TIMER_A 模块的基址。
//!param captureCompareRegister 是选定的捕获比较寄存器
//!       有效值为:
//!        - \b TIMER_A_CAPTURECOMPARE_REGISTER_0
//!        - \b TIMER_A_CAPTURECOMPARE_REGISTER_1
//!        - \b TIMER_A_CAPTURECOMPARE_REGISTER_2
//!        - \b TIMER_A_CAPTURECOMPARE_REGISTER_3
//!        - \b TIMER_A_CAPTURECOMPARE_REGISTER_4
//!        - \b TIMER_A_CAPTURECOMPARE_REGISTER_5
//!        - \b TIMER_A_CAPTURECOMPARE_REGISTER_6
//!
//!修改了 b TAxCCTLn 寄存器的位。
//!
//! \return None
//
//*****************************************************************************
extern void Timer_A_disableCaptureCompareInterrupt(uint16_t baseAddress,
                                                   uint16_t captureCompareRegister);

//*****************************************************************************
//
//!brief 返回捕获比较中断状态
//!
//!param baseAddress 是 TIMER_A 模块的基址。
//!param captureCompareRegister 是选定的捕获比较寄存器
//!       有效值为:
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_0
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_1
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_2
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_3
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_4
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_5
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_6
//!param mask 是中断状态的掩码
//!       掩码值是以下任一项的逻辑 OR:
//!       - b TIMER_A_CAPTURE_OVERFLOW
//!       - b TIMER_A_CAPTURECOMPARE_INTERRUPT_FLAG
//!
//!return 以下任何项的逻辑 OR:
//!        - b TIMER_A_CAPTURE_OVERFLOW
//!        - b TIMER_A_CAPTURECOMPARE_INTERRUPT_FLAG
//!        n 指示屏蔽中断的状态
//
//*****************************************************************************
extern uint32_t Timer_A_getCaptureCompareInterruptStatus(uint16_t baseAddress,
                                                         uint16_t captureCompareRegister,
                                                         uint16_t mask);

//*****************************************************************************
//
//!brief 复位/清除定时器时钟分频器、计数方向、计数
//!
//!param baseAddress 是 TIMER_A 模块的基址。
//!
//!修改了 b TAxCTL 寄存器的位。
//!
//!return 无
//
//*****************************************************************************
extern void Timer_A_clear(uint16_t baseAddress);

//*****************************************************************************
//
//!brief 获取同步捕获比较输入
//!
//!param baseAddress 是 TIMER_A 模块的基址。
//!param captureCompareRegister
//!       有效值为:
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_0
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_1
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_2
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_3
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_4
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_5
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_6
//!param 已同步
//!       有效值为:
//!       - b TIMER_A_READ_SYNCHRONIZED_CAPTURECOMPAREINPUT
//!       - b TIMER_A_READ_CAPTURE_COMPARE_INPUT
//!
//!return 下列项之一:
//!        - b TIMER_A_CAPTURECOMPARE_INPUT_HIGH
//!        - b TIMER_A_CAPTURECOMPARE_INPUT_LOW
//
//*****************************************************************************
extern uint8_t Timer_A_getSynchronizedCaptureCompareInput(uint16_t baseAddress,
                                                          uint16_t captureCompareRegister,
                                                          uint16_t synchronized);

//*****************************************************************************
//
//!brief 获取输出模式的输出位
//!
//!param baseAddress 是 TIMER_A 模块的基址。
//!param captureCompareRegister
//!       有效值为:
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_0
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_1
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_2
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_3
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_4
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_5
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_6
//!
//!return 下列项之一:
//!        - b TIMER_A_OUTPUTMODE_OUTBITVALUE_HIGH
//!        - b TIMER_A_OUTPUTMODE_OUTBITVALUE_LOW
//
//*****************************************************************************
extern uint8_t Timer_A_getOutputForOutputModeOutBitValue(uint16_t baseAddress,
                                                         uint16_t captureCompareRegister);

//*****************************************************************************
//
//!brief 获取当前捕获比较计数
//!
//!param baseAddress 是 TIMER_A 模块的基址。
//!param captureCompareRegister
//!       有效值为:
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_0
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_1
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_2
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_3
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_4
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_5
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_6
//!
//!return 当前计数为uint16_t
//
//*****************************************************************************
extern uint16_t Timer_A_getCaptureCompareCount(uint16_t baseAddress,
                                               uint16_t captureCompareRegister);

//*****************************************************************************
//
//!brief 设置输出模式的输出位
//!
//!param baseAddress 是 TIMER_A 模块的基址。
//!param captureCompareRegister
//!       有效值为:
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_0
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_1
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_2
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_3
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_4
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_5
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_6
//!param outputModeOutBitValue 是要为 out 位设置的值
//!       有效值为:
//!       - b TIMER_A_OUTPUTMODE_OUTBITVALUE_HIGH
//!       - b TIMER_A_OUTPUTMODE_OUTBITVALUE_LOW
//!
//!修改了 b TAxCCTLn 寄存器的位。
//!
//!return 无
//
//*****************************************************************************
extern void Timer_A_setOutputForOutputModeOutBitValue(uint16_t baseAddress,
                                                      uint16_t captureCompareRegister,
                                                      uint8_t outputModeOutBitValue);

//*****************************************************************************
//
//!brief 生成一个 PWM,其中计时器在启动模式下运行
//!
//!param baseAddress 是 TIMER_A 模块的基址。
//!param param 是指向 PWM 配置的结构的指针。
//!
//!修改了 b TAxCTL 寄存器的位、b TAxCCTL0 寄存器的位、
//!b TAxCCR0 寄存器和 b TAxCCTLn 寄存器的位。
//!
//!return 无
//
//*****************************************************************************
extern void Timer_A_outputPWM(uint16_t baseAddress,
                              Timer_A_outputPWMParam *param);

//*****************************************************************************
//
//!brief 停止计时器
//!
//!param baseAddress 是 TIMER_A 模块的基址。
//!
//!修改了 b TAxCTL 寄存器的位。
//!
//!return 无
//
//*****************************************************************************
extern void Timer_A_stop(uint16_t baseAddress);

//*****************************************************************************
//
//!brief 设置捕获-比较寄存器的值
//!
//!param baseAddress 是 TIMER_A 模块的基址。
//!param compareRegister 选择正在使用的捕获寄存器。指
//!       数据表,以确保器件具有捕获比较寄存器
//!       正在使用。
//!       有效值为:
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_0
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_1
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_2
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_3
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_4
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_5
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_6
//!param compareValue 是在比较模式下要与之进行比较的计数
//!
//!修改了 b TAxCCRn 寄存器的位。
//!
//!return 无
//
//*****************************************************************************
extern void Timer_A_setCompareValue(uint16_t baseAddress,
                                    uint16_t compareRegister,
                                    uint16_t compareValue);

//*****************************************************************************
//
//!brief 设置输出模式
//!
//!设置计时器的输出模式,即使计时器已在运行。
//!
//!param baseAddress 是 TIMER_A 模块的基址。
//!param compareRegister 选择正在使用的比较寄存器。
//!       有效值为:
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_0
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_1
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_2
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_3
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_4
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_5
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_6
//!param compareOutputMode 指定输出模式。
//!       有效值为:
//!       - b TIMER_A_OUTPUTMODE_OUTBITVALUE [默认]
//!       - b TIMER_A_OUTPUTMODE_SET
//!       - b TIMER_A_OUTPUTMODE_TOGGLE_RESET
//!       - b TIMER_A_OUTPUTMODE_SET_RESET
//!       - b TIMER_A_OUTPUTMODE_TOGGLE
//!       - b TIMER_A_OUTPUTMODE_RESET
//!       - b TIMER_A_OUTPUTMODE_TOGGLE_SET
//!       - b TIMER_A_OUTPUTMODE_RESET_SET
//!
//!修改后的位是 b TAxCCTLn 寄存器的 b OUTMOD。
//!
//!return 无
//
//*****************************************************************************
extern void Timer_A_setOutputMode(uint16_t baseAddress,
                                  uint16_t compareRegister,
                                  uint16_t compareOutputMode);

//*****************************************************************************
//
//!brief 清除计时器 TAIFG 中断标志
//!
//!param baseAddress 是 TIMER_A 模块的基址。
//!
//!修改后的位是 b TAxCTL 寄存器的 b TAIFG。
//!
//!return 无
//
//*****************************************************************************
extern void Timer_A_clearTimerInterrupt(uint16_t baseAddress);

//*****************************************************************************
//
//!brief 清除捕获-比较中断标志
//!
//!param baseAddress 是 TIMER_A 模块的基址。
//!param captureCompareRegister 选择 Capture-compare 寄存器
//!       使用。
//!       有效值为:
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_0
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_1
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_2
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_3
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_4
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_5
//!       - b TIMER_A_CAPTURECOMPARE_REGISTER_6
//!
//!修改后的位是 b TAxCCTLn 寄存器的 b CCIFG。
//!
//!return 无
//
//*****************************************************************************
extern void Timer_A_clearCaptureCompareInterrupt(uint16_t baseAddress,
                                                 uint16_t captureCompareRegister);

//*****************************************************************************
//
//!brief 读取当前计时器计数值
//!
//!读取计时器的当前计数值。实行多数投票制
//!以确认返回的准确值。The TIMER_A_THRESHOLD
//!可以修改相应头文件中的 #define,以便投票
//!必须更紧密地联系在一起才能达成共识。
//!
//!param baseAddress 是 TIMER_A 模块的基址。
//!
//!return 计时器计数值的多数投票
//
//*****************************************************************************
extern uint16_t Timer_A_getCounterValue(uint16_t baseAddress);

//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************

3.定时器中断配置

中断向量的用法:

 对定时器中断向量的解释

TIMER0_A0_VECTOR ->表示TA0的通道0的中断向量和TAIFG的中断向量

TIMER0_A1_VECTOR ->表示TA0的通道1~4的中断向量和TAIFG的中断向量

3.1定时器A

 1.使用通道0 我们设置每0.5s翻转一次电平。

/*
 * MyTimerAInterrupt.c
 *
 *  Created on: 2024年5月20日
 *      Author: 17334
 */
//TimerA控制寄存器
#include <msp430f5529.h>
void Set_TA0CTL()
{
    //TA0CTL=(~0xFFFF&TA0CTL)|(TASSEL_2|ID_1|MC__UP|TACLR);//选择SMCLK作为时钟,选用向上增模式,关闭TAIFG中断
    //TA0CTL  &= ~TAIFG;//向上计数模式下用不到
    TA0CTL=(~0xFFFF&TA0CTL)|(TASSEL_2|ID_3|MC__UP|TACLR);//选择SMCLK作为时钟,选用向上增模式,关闭TAIFG中断
}

unsigned int Get_TA0R()
{
   return TA0R;
}

//只设置一个通道的比较值,之后在中断子函数里判断是这个通道的中断,再进行中断回调!
void set_TA0CCTLx()
{
    TA0CCTL0 = CCIE;
    //TA0一共四个通道0~4个通道

}
void set_TACCR0(unsigned int CCR)
{
    TA0CCR0 = CCR;//MSclk为78125HZ,5ms进入中断,3906
    //0~4个通道
    //CCIFG在中断里要将这个标志位清0否则会进入这个中断
}


void TimerA0Interruptinit()
{
    set_TA0CCTLx();
    set_TACCR0(62500);
    Set_TA0CTL();
    //Enter LPM0, enable interrupts
    __bis_SR_register(LPM0_bits + GIE);

    //For debugger
    __no_operation();
}
#pragma vector = TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR(void)
{
    P1OUT ^= BIT0;
   // TA0CCTL0 &= ~CCIFG;
}

 使用通道0和通道1同时产生中断

void Set_TA0CTL()
{
    TA0CTL=(~0xFFFF&TA0CTL)|(TASSEL_2|ID_3|MC__UP|TACLR);//选择SMCLK作为时钟,选用向上增模式,关闭TAIFG中断

}

unsigned int Get_TA0R()
{
   return TA0R;
}

void set_TA0CCTLx()
{
    TA0CCTL1 = CCIE;
    TA0CCTL0 = CCIE;
    //TA0一共五个通道0~4个通道

}
void set_TACCR0(unsigned int CCR_CCR0,unsigned int CCR_CCR1)
{
    TA0CCR0 = CCR_CCR0;//MSclk为78125HZ,5ms进入中断,3906
    TA0CCR1 = CCR_CCR1;
    //0~4个通道
}


void TimerA0Interruptinit()
{
    set_TA0CCTLx();
    set_TACCR0(62500,31250);
    Set_TA0CTL();
    //Enter LPM0, enable interrupts
    __bis_SR_register(LPM0_bits + GIE);
    //For debugger
    __no_operation();
}
/**
 * main.c
 */
int main(void)
{
	WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer
	P4DIR |= BIT7;
	P4SEL &= ~BIT7;   //设置为I/O模式
//	P2SEL |= BIT2;    //设置为复用模式
//	P1DIR |= BIT0;    // ACLK set out to pins
//	P1SEL |= BIT0;
    P1SEL &= ~BIT0;   //设置为I/O模式
    P1DIR |= BIT0;    //设置方向为输出
	SystemClock_init();
	TimerA0Interruptinit();
	//PWM_TA0();
	while(1)
	{



	}
}


#pragma vector = TIMER0_A1_VECTOR
__interrupt void TIMER0_A1_ISR(void)
{
    switch (TA0IV)
        {
        case TA0IV_NONE:break;
        case TA0IV_TACCR1:P4OUT ^= BIT7; break;
        case TA0IV_TACCR2:break;
        case TA0IV_TACCR3:break;
        case TA0IV_TACCR4:break;
        case TA0IV_5:break;
        case TA0IV_6:break;
        case TA0IV_TAIFG:break;
        }

}



#pragma vector = TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR(void)
{

    P1OUT ^= BIT0;
    //TA0CTL=(~0xFFFF&TA0CTL)&(~TAIFG);
}

注意:

1.使用向上计数模式下不需要中断分类直接在中断子函数里执行我们的定时任务即可。因此在使用向上计数,定时时我们这个定时器就不能用作于其他的功能了。

2.      TIMERx_A0_VECTOR 由TAxCCR0CCIFG引起的中断

        TIMERx_A1_VECTOR 有TAxCCRnCCIFG和TAIFG引起的中断

        CCIFG->通道溢出中断

        TAIFG->定时器计数溢出中断TAxR的值为0就会产生

5.定时器捕获/比较

Timer_A中存在多达七个相同的捕获/比较块TAxCCRn(其中n=0到7)。这些块中的任何一个都可以用于捕获定时器数据或生成时间间隔。

5.1输入捕获简介:

当CAP的控制位置1时,捕获/比较模块配置为捕获模式。捕获输入CCIXA和CCIXB可连接外部引脚或内部信号,这需要通过CCIS控制位进行配置。可通过CM控制位将捕获输入信号选择为上升沿捕获,下降沿捕获,两者都捕获。如果捕获事件产生,定时器将完成以下工作。

1.主计数器计数值将复制到TAXCCRn寄存器中。

2.置位CCIFG中断标志位。

定时器的输入捕获功能可以用来测量外部输入信号的周期,频率,脉宽,占空比等。

本次我们来增计数模式测量输入脉冲的周期

 我们测量时有两种情况:两次下降沿测得有定时器溢出,或无定时器溢出:我们将两种情况进行合并得到的公式为:测量脉冲的周期=(N2-N1)+n*CCR0)*TAclk,有人会想那如果下一次N2小于N1怎么办下面这个公式会给你答案 :(CCR0-N1+(n-1)*CCR0+N2)

n为进入中断的次数。TAclk为定时器A的时钟周期,CCR0是通道0的阈值。

实验目的:使用TA1工作在捕获模式,上升沿触发捕获,参考时钟选择SMCLK,通过中断检测到上升沿就将LED进行翻转。定时器溢出中断使另一个LED电平翻转。

void TimA1_Input()
{
    P2DIR &=~BIT0;
    P2SEL |= BIT0;
    TA1CTL = (~0xFFFF&TA1CTL)|(TASSEL__SMCLK|ID__8|MC__CONTINUOUS|TACLR|TAIE);//连续计数模式下,选择SMCLK作为参考时钟源
    TA1CCTL1 = CM_1|SCS|CAP|CCIE|CCIS_0;// CM_1选择上升捕获,同步捕获,CAP捕获模式,CCIE使能捕获溢出中断,CCIS_0使用TimerA1的A通道进行捕获
    __bis_SR_register(LPM0_bits + GIE);
}



#pragma vector=TIMER1_A1_VECTOR
__interrupt void TimA1GetSignal(void)
{
if(TA1IV == TA1IV_TACCR1)
       P4OUT ^= BIT7;
else
{
    P1OUT ^= BIT0;
    TA1CTL &=~TAIFG;
}
}
int main(void)
{
	WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer
	P4DIR |= BIT7;
	P4SEL &= ~BIT7;   //设置为I/O模式
//	P2SEL |= BIT2;    //设置为复用模式
//	P1DIR |= BIT0;    // ACLK set out to pins
//	P1SEL |= BIT0;
    P1SEL &= ~BIT0;   //设置为I/O模式
    P1DIR |= BIT0;    //设置方向为输出
	SystemClock_init();
//	TimerA0Interruptinit();
//	PWM_TA0();
	TimA1_Input();
	while(1)
	{
	}
}

捕获使用注意事项:

1:在捕获模式下更改捕获输入可能会导致意外的捕获事件。为了避免这种情况,只有在禁用捕获模式时(CM={0}或CAP=0),才应更改捕获输入。

2:在捕获模式下更改捕获输入可能会导致意外的捕获事件。对于这种情况,不需要在VCC和GND之间切换捕获输入,禁用捕获模式。

3:捕获信号可以与定时器时钟异步,并导致竞争条件。设置SCS位可使捕获与下一个计时器时钟同步。建议设置SCS位以使捕获信号与计时器时钟同步

5.2定时器比较功能

当CAP=0时,选择比较模式。比较模式用于以特定的时间间隔生成PWM输出信号或中断。当TAxR计数到TAxCCRn中的值时,其中n表示特定的捕获/比较寄存器。

•设置了中断标志CCIFG。

•内部信号EQUn=1。

•EQ根据输出模式影响输出。

•输入信号CCI被锁存到SCCI中。

在比较模式下,当TAxR与TAxCCRn的值相等时,就会产生中断,中断使能位和中断标志位分别是TAxCCTLn的CCIE和CCIFG

5.2.1比较模式下输出PWM 

例程采用向上计数模式,out模式为模式7。

PWM的周期由定时器的参考频率和CCR0的值决定。

PWM的占空比由其他通道的值(不能超过CCR0的值)和CCR0的值决定。

void PWM_TA0()
{
    P1DIR |=BIT2|BIT3;
    P1SEL |=BIT2|BIT3;
    TA0CCR0 = 512-1;
    TA0CCTL1 = OUTMOD_7;
    TA0CCR1 = 256-1;
    TA0CCTL2 = OUTMOD_7;
    TA0CCR2 = 128-1;
    TA0CTL = TASSEL_1 + MC_1 +TACLR;
    //Enter LPM0, enable interrupts
    __bis_SR_register(LPM3_bits);
    //For debugger
    __no_operation();
}

若果想使用TAx产生PWM只需要修改x的值,和对应输出通道引脚即可 

5.2.2比较模式下产生中断

待添加,暂时用不到

6.问题记录

6.1只能使用TA0的CCR0来进行定时器中断,其他定时器的通道0无法实现,并且T0的其他通道也无法用于向上计数模式下的中断。

从官方函数中可以看出向上计数只针对于CCR0而言的其他通道无法使用向上计数产生中断的。

修改:通过定时器中断例程与解释,之前用不了是因为中断向量的使用错误导致。

  • 27
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值