MSP430 TIMERA1 中断
MSP430 TIMERA1 Interrupt
快速提问。如何使用此特定中断设置 10 秒 1 分钟的中断?我试过使用下面的计数器,但它不起作用。就此程序而言,它会中断 1 秒。这种时候我通常会去找教授,但是他在日本.... .... ....
#include <msp430.h>
#define RedLED BIT0
#define GreenLED BIT6
#define RedLEDToggle (P1OUT ^= RedLED)
#define GreenLEDToggle (P1OUT ^= GreenLED)
unsigned int i = 0;
void main(void)
{
WDTCTL = WDTPW|WDTHOLD;
P1DIR = RedLED|GreenLED;
P1OUT = RedLED|GreenLED;
TACTL = TASSEL_2|ID_3|MC_3|TAIE;
TACCR0 = 62500;
_enable_interrupts();
LPM1;
}
#pragma vector=TIMER0_A1_VECTOR
__interrupt void Timer_A(void){
if (int i == 10)
{
switch(TAIV)
{
case 0x02: break;
case 0x04: break;
case 0x0A: RedLEDToggle|GreenLEDToggle;;
break;
}
}
else
{
i++;
}
}
要实现10秒的中断间隔,需要对定时器应用输入分频器。没有外设支持是不可能达到1分钟的(但是可以用软件计数器实现)。
问题是 msp430 微控制器有 16 位寄存器,不能保存大于 65535 的数值。使用 32768 Hz 的低频振荡器 运行(这是典型的 - 你不提供有关系统硬件时钟源的任何详细信息,如果它们具有不同的频率,请说明)除非应用输入分频器,否则寄存器每 2 秒溢出一次。 MSP430x2xxx 系列 MCU 上输入分频器的最大值为 8,因此以后不可能将硬件定时器设置为超过 8 * 2 = 16 秒。有关详细信息,请参阅 MSP430x2xxx family user's guide。
此代码每 10 秒调用一次中断:
#include <msp430.h>
#define RedLED BIT0
#define GreenLED BIT6
#define RedLEDToggle (P1OUT ^= RedLED)
#define GreenLEDToggle (P1OUT ^= GreenLED)
// 10 seconds, assuming 32768 Hz ACLK source and divider 8
#define TIMER_PERIOD (10u * (32768 / 8))
void main(void)
{
WDTCTL = WDTPW | WDTHOLD;
P1DIR = RedLED | GreenLED;
P1OUT = RedLED | GreenLED;
// reset timer A config (not strictly needed)
TACTL = TACLR;
// ACLK as clock source, divider 8, continuous mode, interrupt enabled
TACTL = TASSEL_1 | ID_3 | MC_2 | TAIE;
// set the period
TACCR1 = TIMER_PERIOD;
// enable capture/compare interrupts for CCR1
TACCTL1 = CCIE;
_enable_interrupts();
LPM1;
}
#pragma vector=TIMER0_A1_VECTOR
__interrupt void Timer_A(void)
{
switch (TAIV) {
case TA0IV_TACCR1:
// CCR1 interrupt
RedLEDToggle;
GreenLEDToggle;
// set the time of the next interrupt
TACCR1 += TIMER_PERIOD;
break;
}
}
快速提问。如何使用此特定中断设置 10 秒 1 分钟的中断?我试过使用下面的计数器,但它不起作用。就此程序而言,它会中断 1 秒。这种时候我通常会去找教授,但是他在日本.... .... ....
#include <msp430.h>
#define RedLED BIT0
#define GreenLED BIT6
#define RedLEDToggle (P1OUT ^= RedLED)
#define GreenLEDToggle (P1OUT ^= GreenLED)
unsigned int i = 0;
void main(void)
{
WDTCTL = WDTPW|WDTHOLD;
P1DIR = RedLED|GreenLED;
P1OUT = RedLED|GreenLED;
TACTL = TASSEL_2|ID_3|MC_3|TAIE;
TACCR0 = 62500;
_enable_interrupts();
LPM1;
}
#pragma vector=TIMER0_A1_VECTOR
__interrupt void Timer_A(void){
if (int i == 10)
{
switch(TAIV)
{
case 0x02: break;
case 0x04: break;
case 0x0A: RedLEDToggle|GreenLEDToggle;;
break;
}
}
else
{
i++;
}
}
要实现10秒的中断间隔,需要对定时器应用输入分频器。没有外设支持是不可能达到1分钟的(但是可以用软件计数器实现)。
问题是 msp430 微控制器有 16 位寄存器,不能保存大于 65535 的数值。使用 32768 Hz 的低频振荡器 运行(这是典型的 - 你不提供有关系统硬件时钟源的任何详细信息,如果它们具有不同的频率,请说明)除非应用输入分频器,否则寄存器每 2 秒溢出一次。 MSP430x2xxx 系列 MCU 上输入分频器的最大值为 8,因此以后不可能将硬件定时器设置为超过 8 * 2 = 16 秒。有关详细信息,请参阅 MSP430x2xxx family user's guide。
此代码每 10 秒调用一次中断:
#include <msp430.h>
#define RedLED BIT0
#define GreenLED BIT6
#define RedLEDToggle (P1OUT ^= RedLED)
#define GreenLEDToggle (P1OUT ^= GreenLED)
// 10 seconds, assuming 32768 Hz ACLK source and divider 8
#define TIMER_PERIOD (10u * (32768 / 8))
void main(void)
{
WDTCTL = WDTPW | WDTHOLD;
P1DIR = RedLED | GreenLED;
P1OUT = RedLED | GreenLED;
// reset timer A config (not strictly needed)
TACTL = TACLR;
// ACLK as clock source, divider 8, continuous mode, interrupt enabled
TACTL = TASSEL_1 | ID_3 | MC_2 | TAIE;
// set the period
TACCR1 = TIMER_PERIOD;
// enable capture/compare interrupts for CCR1
TACCTL1 = CCIE;
_enable_interrupts();
LPM1;
}
#pragma vector=TIMER0_A1_VECTOR
__interrupt void Timer_A(void)
{
switch (TAIV) {
case TA0IV_TACCR1:
// CCR1 interrupt
RedLEDToggle;
GreenLEDToggle;
// set the time of the next interrupt
TACCR1 += TIMER_PERIOD;
break;
}
}