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.

[参考译文] CCS/MSP430F413:接口-时钟和 UART 通信

Guru**** 2596195 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/648134/ccs-msp430f413-interrput---clock-and-uart-communication

大家好、很高兴有人帮助我。

我在使我的代码中的两个中断正常工作时遇到了困难

第一个是指时钟、第二个是指我的 UART 通信

独立的、这两者正常工作、但在同时启用两者时、UART 通信停止正常工作、发送任何数据。

以下是部分代码:

int main (void){

hfsec = 0;
sec = 0;
min = 10;
hour = 21;

WDTCTL = WDTPW + WDTHOLD;//看门狗计时器


FLL_CTL0 = XCAP18PF; //0x0053 - FLL+控制0 =(0x30)- XIN 电容器= XOUT 电容器= 18pf
FLL_CTL1 = SCFQ_64K; //fdco=64k - 0x0054 - FLL+控制1 =
SCFQCTL = 0x28 + 5; //fLCD=fk/64帧频率~30Hz - fMCLK = 2*fACLK
//基本计时器0.5sÖжÏÒ»´Î
IE2 |= 0x80; /*中断使能2 */

LCDCTL = 0x5f; //s0-s11 fuctions as LCD segment lcdson=1 lcddon=1
P5SEL=0xFC; //选择 fuion:R13 R23 r33 com3.2.1

_BIS_SR (GIE);//等于_EINT ();*/
// EINT ();

UartConfig ();

_ bis_SR_register (GIE);

TX (0、"Diogel\r\n");

SPI_setup ();


while (1){ //主循环

lcd_clear ();
varredura = kb_read ();

savePass ();

passRead ();

if (((kb_port_in 和 log)=0){
log (); //此处通过串行通信返回内存的数据


}//循环 while (1)
}// função main



#pragma vector=BASICTIMER_VECTOR
//#pragma vector=TIMER0_A1_vector
//#pragma vector=COMP_B_VECTOR
__INTERRUPT BT_ISR (void){LPM3_OUT+=LED0+





;void
= 0+=^ 0+;void = f0+;void = f0+= f0+;void = f0+= 0+;void = 0+= f0+ // ledÃëµãÉÁ˸
// P6OUT^=LED0;

if (sec=60){
min++;
sec=0;
}

if (min==60){
hour++;
min=0;
}
if (hour==24){
hour=0;
}


SEC_H = tab[sec/10];
SEC_L = tab[sec%10];
min_H = tab[min/10];
min_L = tab[min%10];
hour_H = tab[小时/10];
Hour_L = tab[Hour%10];
}


//计时器 A0中断服务例程
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector=TIMER0_A0_vector
__interrupt void Timer_A (void)
#Elif Defined (__GNU__)(
void TI_Timer_)(void Timer_)(void Timer_)(void TI_interrupt COMPLER_A)(void Timer_)(void Timer_)(void Timer_)(void tim


#endif
{
CCR0 += Bitime;//将偏移添加到 CCR0

// RX
IF (CCTL0和 CCIS0)// CCI0B 上的 RX?
{
if (CCTL0 & CAP)//捕获模式=起始位边缘
{
CCTL0 &=~ CAP;//捕获至比较模式
CCR0 += BiTime_5;
}
否则
{
RXData = RXData >> 1;
IF (CCTL0 & SCCI)//获取接收 RXLATCH 数据
|= 0x80;
BitCntRX - ;//所有位都是 RXed?

if (BitCntRX =0)// se contador do RX zerar
//>>>>> 在此处解码接收到的字节<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
{
if (pBufRxGPRS>=TamBufRxGPRS-2){
pBufRxGPRS=0;
}


if (RXData =<16


){RXEnter = 1;// RXDado = 0;// RXDado =(pBufRxGPRS[pBufRxGPRS-3]<16)|(BufRxGPRS=0






)~
= 0;// pBufRxRxRxGPRS=0> 0;pBuxRxGPRS=0> 0 (pBuf_CCRxGs=0> 0)/pBuxGPRS=0)+ 0;pBuf_0 += 0 (pBuxGPRS=pBuxGPRS=0)+= 0 += 0;pBuf_CC0> 0 += 0;pBuf_CCrgPRS=pBuf_CC0>(pBuxGPRS[b<b<b<b<b<b<b<b<b<

在此处解码接收到的字节<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<><<<<<>}

}
// TX
else
{
if (BitCntTX ==0)
CCTL0 &=~ CCIE;//所有位 TXed、禁用中断
否则
{
CCTL0 |= OUTMOD2;// TX Space
if (TXData & 0x01)
CCTL0 &=~ OUTMOD2;// TX Mark
TXData = TXData >> 1;
BitCntTX


}-}




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

    根据提供的代码、我假设您在两个中断之间遇到竞态条件。 BT ISR 需要花费太多的周期来处理、这样您的 TA ISR 会延迟、从而导致 UART 通信失败。 这种情况或 BT ISR 内部的 LPM3退出会干扰您的代码流。 我建议嵌套中断、增加 MCLK 频率或降低 UART 波特率。 您还可以考虑升级到为硬件 UART 解决方案提供(e) USCI_A 的器件。

    此致、
    Ryan