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/MSP430FR5994:UART + TIMERA 问题延迟

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/842573/ccs-msp430fr5994-uart-timera-problems-delay

器件型号:MSP430FR5994

工具/软件:Code Composer Studio

您好!

我在 MSP430FR5994上使用 driverLib 的程序时遇到问题。

我将计时器 A 配置为最高1秒的模式、它工作正常(我让中断切换 LED)、但在内部、我通过串行(9600 - 8N1)发送5个字节。  

串行工作正常、但数据每两次到达计时器中断、换句话说、一次中断时我看不到串行上的数据、下一次中断时、我会同时获取延迟的数据和新数据。

这是我的代码。

#include "driverlib.h"

void board_init()
{
//将 DCO 频率设置为1MHz
CS_setDCOFreq (CS_DCORSEL_0、CS_DCOFSEL_0);

//将 MCLK、SMCLK 配置为 DCOCLK 的源
CS_initClockSignal (CS_SMCLK、CS_DCOCLK_SELECT、CS_Clock_divider);
CS_initClockSignal (CS_MCLK、CS_DCOCLK_select、CS_Clock_divider);
//将 GPIO 引脚设置为 OUT
GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN0 + GPIO_PIN1);
//将 GPIO 引脚设置为输入
}

void timer_init()
{
//以 SMCLK 为源的向上计数模式启动定时器
Timer_A_clearTimerInterrupt (timer_A0_BASE);

Timer_A_initUpModeParam ={0};
param.clockSource = TIMER_A_CLOCKSOURCE_SMCLK;
param.clockSourceDivider = TIMER_A_CLOCKSOURCE_divider _40;
param.timerPeriod = 25000;
param.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE;
param.captureCompareInterruptEnable_CCR0_CCIE = TIMER_A_CCIE_CCR0_INTERRUPT_ENABLE;
param.timerClear = timer_a_do _clear;
param.startTimer = false;

Timer_A_initUpMode (timer_A0_BASE、&param);

Timer_A_startCounter (timer_A0_BASE、timer_A_up_mode);

}

void UART_init ()
{
//配置 UART 引脚
//将 P2.0和 P2.1设置为辅助模块功能输入。
/*
*选择端口2D
*将引脚0、1设置为输入次级模块功能(UCA0TXD/UCA0SIMO、UCA0RXD/UCA0SOMI)。
*
GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P2、
GPIO_PIN0 + GPIO_PIN1、
GPIO_secondary 模块功能);

//配置 UART
EUSCI_A_UART_initParam param ={0};
param.selectClockSource = EUSCI_A_UART_CLOCKSOURCE_SMCLK;
param.clockPrescalar = 6;
param.firstModReg = 8;
param.secondModReg = 20;
param.parity = EUSCI_A_UART_NO_parity;
param.msborLsbFirst = EUSCI_A_UART_LSB_FIRST;
param.numerofStopBits = EUSCI_A_UART_Oe_STOP_BIT;
param.uartMode = EUSCI_A_UART_MODE;
param.oversaming= EUSCI_A_UART_oversaming_BAUDRATE_generation;

if (STATUS_FAIL = EUSCI_A_UART_init (EUSCI_A0_BASE、&param))
{
返回;
}

EUSCI_A_UART_ENABLE (EUSCI_A0_BASE);

EUSCI_A_UART_clearInterrupt (EUSCI_A0_BASE、EUSCI_A_UART_receive_interrupt);

//启用 USCI_A0 RX 中断
EUSCI_A_UART_enableInterrupt (EUSCI_A0_BASE、
EUSCI_A_UART_receive_interrupt); //启用中断
}


int main (void)
{
//停止看门狗计时器
WDT_A_HOLD (WDT_A_base);
Board_init();
timer_init();
UART_INIT();

//激活所有引脚更改
PMM_unlockLPM5 ();

_bis_SR_register (GIE);

GPIO_setOutputHighOnPin (GPIO_PORT_P1、GPIO_PIN0);
_bis_SR_register (LPM0_bits);
while (1)
{
_DELAY_CYCLES (250000);//(1/2)段
GPIO_toggleOutputOnPin (GPIO_PORT_P1、GPIO_PIN1);
EUSCI_A_UART_transmitData (EUSCI_A0_BASE、'@Ω');

}
}

char num[4];
int contador = 0;

#pragma vector = TIMER0_A0_vector
__interrupt
void Timer1_A0_ISR (void)
{
如果(contador > 9999)
contador = 0;
num[3]=(int)(contador % 10);
num[2]=(int)((contador / 10)% 10);
num[1]=(int)((contador / 100)% 10);
num[0]=(int)((contador / 1000));

EUSCI_A_UART_transmitData (EUSCI_A0_BASE、num[0]+ 48);
EUSCI_A_UART_transmitData (EUSCI_A0_BASE、num[1]+ 48);
EUSCI_A_UART_transmitData (EUSCI_A0_BASE、num[2]+ 48);
EUSCI_A_UART_transmitData (EUSCI_A0_BASE、num[3]+ 48);
EUSCI_A_UART_transmitData (EUSCI_A0_BASE、10);

//切换 P1.0
GPIO_toggleOutputOnPin (GPIO_PORT_P1、GPIO_PIN0);
contador ++;
}

uint8_t RXData = 0、TXData = 0;

#pragma vector=USCI_A0_vector
_中断 void USCI_A0_ISR (void)
{
开关(__evo_in_range (UCA0IV、USCI_UART_UCTXCPTIFG))
{
USCI_NONE 案例:
中断;
USCI_UART_UCRXIFG 案例:
RXData = EUSCI_A_UART_receiveData (EUSCI_A0_BASE);
GPIO_toggleOutputOnPin (GPIO_PORT_P1、GPIO_PIN1);
交换机(RXData)
{
案例"A":
EUSCI_A_UART_transmitData (EUSCI_A0_BASE、"h");
EUSCI_A_UART_transmitData (EUSCI_A0_BASE、"I");
EUSCI_A_UART_transmitData (EUSCI_A0_BASE、"0");
EUSCI_A_UART_transmitData (EUSCI_A0_BASE、"1");
中断;
默认值:
EUSCI_A_UART_transmitData (EUSCI_A0_BASE、RXData);
中断;
}
中断;
USCI_UART_UCTXIFG 案例:
中断;
USCI_UART_UCSTTIFG 案例:
中断;
USCI_UART_UCTXCPTIFG 案例:
中断;
}
}

谢谢你。

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

    在9600时发送5个字节应该大约为5ms、这不应该干扰任何东西。

    您是否在调试器中运行此操作? 尝试断开调试器(红色框中的按钮)。 许多(大多数? 全部?) 当调试器处于活动状态时、MSP430 Launchpad 会呈现突发反向通道 UART 输出。 USB 缓冲。

    https://e2e.ti.com/support/microcontrollers/msp430/f/166/p/718867/2690901

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

    谢谢、断开调试器可解决 UART 速度问题。