主题中讨论的其他器件: MSP430F5438
我在 MSP430F5438A 上有一个应用、它使用中断处理程序对数字输入上的脉冲进行计数。
MSP 时钟为20MHz、中断在上升沿设置。
当脉冲较慢(即大约20Hz)时、应用程序会工作、但如果脉冲较快、则看起来我正在丢失脉冲。
我的中断处理程序的代码是:
PORT1_ISR:
;*------------------------------------------------------------ *
PUSHM.A #1、R15;
OR.B #2、&PDOUT_H+0
NOP
MOV.W &P1IV+0、R15
ADD.W #1、&COUNTER+0
XOR.B #16、&PDOUT_H+0
BIC.B #2、&PDOUT_H+0
POPM.A #1、R15
RETI
我本以为在20MHz 时,该处理程序不会处理超过20Hz 的脉冲。
应用程序的完整代码附在底部。
谢谢、Nadav
#include
#include "HAL_UCS.h"
#define MHZ20 1
void InitIoConfig (void){
P1DIR=0;
P1OUT=0;
P1IE=BIT4;
P2DIR = BIT0 | BIT1 | BIT2 | BIT2 | BIT4 | BIT4 | BIT6 | BIT4;
P2OUT = BIT7
;PIT0 | BIT2
| BIT3 | BIT7 | BIT0 | BIT7 | BIT0 | BIT0 | BIT0 | BIT0 | BIT7 // RT 选择 XT1
P8DIR = BIT0 | BIT1 | BIT2 | BIT3 | BIT4 | BIT5 | BIT6;
P8OUT = BIT1 | BIT4;
P9SEL = BIT4 | BIT5;
P10DIR = BIT0 | BIT1 | BIT2 | BIT3 | BIT3
= BIT7;BIT7 | BIT6}
//红色 LED
内联 void RedOn (){P8OUT|=BIT4;}
内联 void RedOff (){P8OUT|=~BIT4;}
内联 void RedToggle (){P8OUT^
~
^=BIT4;}//绿色 LED 内联 void GreeneF (){P8OUT|=BIT1;}inline ZL
(= CLRBR1);
{= ZEP8CL1 (= BITEF);}Inline Z1 (= BCL1);}Inline Z1 (= BCL1)
#ifdef MHZ20
Init_FLL_settle (19988、610);//~ 610*32768 = 19988480
__no_operation ();
#else
Init_FLL_settle (7995、244);//~ 244*32768 = 7995392
#endif
}
void InitUart (){UCA2UCSRST
|= 7995392WCTL1; //**将状态机复位**
UCA2CTL1 &=~UCSSEL_3;
UCA2CTL1 |= UCSSEL_SMCLK; // CLK = SMCLK
#ifdef MHZ20
UCA2BR0 = 173; // 8MHz/115200 (请参阅用户指南)
UCA2BR1 = 0; // 8MHz/115200
UCA2MCTL = UCBRS_5 + UCBRF_0; //调制 UCBRSx=4、UCBRFx=0
__NO_OPERATION ();
#else
UCA2BR0 = 69; // 8MHz/115200 (请参阅用户指南)
UCA2BR1 = 0; // 8MHz/115200
UCA2MCTL = UCBRS_4 + UCBRF_0; //调制 UCBRSx=4、UCBRFx=0
#endif
UCA2CTL1 &=~UCSWRST; //**初始化 USCI 状态机**
UCA2IE |= UCRXIE; //启用 USCI_A0 RX 中断
}
void send (char c){
while (!(UCA2IFG & UCTXIFG)
); // USCI_A0 TX 缓冲器就绪?
UCA2TXBUF = c; // TX -> RXed 字符
}
void sendZ(char* p){
while (*p){
send(*p);
p++;
}
void sendN(short c){
__no_operation();
if (c=0){
sendZ("0");
} else {
char buffer[7];{*=p=10(=p_);}*=n=0_char (n=0);}=char
缓冲区缓冲区缓冲区缓冲区缓冲区(7);
char* end=buffer+6;
while (end!=p){
__no_operation();
send (*p);
++p;
}
__no_operation();
}
}
volatile short counter=0;
volatile short readFlag=0;
volatile short readflags2=0;
int gotchar (){
short f=readFlags2;
if (f!=readflags2=f
;
return 1;
}
return 0;
}
int main (void){
/int c;
WDTCTL = WDTPW + WDTHOLD; //停止 WDT
InitIoConfig();
InitClock();
InitUart();
Greenoff();
RedOff ();
_ENABLE_INTERRUPT ();
sendZ ("\r\n115200、8N1\r\n");
while (1){
if (gotChar ())
}{
short n=counter;
counter=0;
sendN (n);
sendZ ("\r\n\r\n);
ready}//返回 RXECD 字符、{=USCI_INTERRUECT_A2_RECODE_RE_SION_SION_INTER
(#USCI_SIR_SIB_NOT_RECODE_ECTOR = 0);void = USCI_RE_RE_RE_SIT_RE_SIT_RECO_ECTOR = 0 (n_SIT_RE_SIT_RECO_RE_RE_RE
//向量0 -无中断
情况2: //向量2 - RXIFG
// while (!(UCA2IFG&UCTXIFG)); // USCI_A0 TX 缓冲器就绪?
//UCA2TXBUF = UCA2RXBUF; // TX -> RXED 字符
发送(UCA2RXBUF);
readFlag++;
中断;
情况4:
中断; //向量4 - TXIFG
默认值:
break;
}
//MarkInterruptInt (INT_USART_RS232);
//LPM0_EXIT;
}
#pragma vector=Port1_vector
_interrupt void Port1_ISR (void)
{
GreenOn ();
__no_operation ();
int iv=P1IV;
counter++;
Redtoggle (RedToggle);
Greenoff();
}