请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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、¶m);
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、¶m))
{
返回;
}
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 案例:
中断;
}
}
谢谢你。