请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:MSP430FR5994 工具/软件:Code Composer Studio
您好!
我正在研究 MSP430FR5994 Launchpad 的标准 UART 收发器示例。 我正在尝试将端口从6更改为2。 我已经完成了所有需要的更改,但它不像原来那样工作。 我是否遗漏了任何东西
#include
无符号字符数= 0;
//*********
//引脚配置
//
#define LED_OUT P1OUT
#define LED_DIR P1DIR
#define LED0_PIN BIT0
#define LED1_PIN BIT1
//*********
// UART 初始化
//
#define SMCLK_115200 0
#define SMCLK_9600 1
#define ACLK_9600 2
#define UART_MODE SMCLK_115200
void initUART()
{
//将 USCI_A3配置为 UART 模式
UCA0CTLW0 = UCSWRST; //将 eUSCI 置于复位
#if UART_MODE = SMCLK_115200
UCA0CTLW0 |= UCSSEL_SMCLK; // CLK = SMCLK
//波特率设置
//使用系列用户指南中的表30-5
UCA0BR0 = 8;
UCA0BR1=0;
UCA0MCTLW |= UCOS16 | UCBRF_10 | 0xF700;//0xF700为 UCBRSx = 0xF7
#Elif UART_MODE = SMCLK_9600
UCA3CTLW0 |= UCSSEL_SMCLK; // CLK = SMCLK
//波特率设置
//使用系列用户指南中的表30-5
UCA3BR0 = 104;
UCA3BR1=0;
UCA3MCTLW |= UCOS16 | UCBRF_2 | 0xD600;//0xD600为 UCBRSx = 0xD6
#Elif UART_MODE = ACLK_9600
UCA3CTLW0 |= UCSSEL_ACLK; // CLK = ACLK
//波特率计算
// 32768/(9600)= 3.4133
//分数部分= 0.4133
//使用系列用户指南中的表24-5
UCA3BR0=3; // 32768/9600
UCA3BR1=0;
UCA3MCTLW |= 0x9200;//0x9200为 UCBRSx = 0x92
#else
#错误"请将波特率指定为115200或9600 "
#endif
UCA0CTLW0 &=~UCSWRST; //初始化 eUSCI
UCA0IE |= UCRXIE; //启用 USCI_A3 RX 中断
}
//*********
//设备初始化
//
void initGPIO()
{
//LED
LED_DIR |= LED0_PIN | LED1_PIN;
LED_OUT &=~(LED0_PIN | LED1_PIN); //关闭 LED
//配置 UART
P2SEL1 &=~(BIT0 | BIT1); // USCI_A3 UART 操作
P2SEL0 |= BIT0 | BIT1;
//为外部晶体振荡器配置 PJ.5 PJ.4
PJSEL0 |= BIT4 | BIT5; //表示 XT1
//禁用 GPIO 上电默认高阻抗模式以激活
//先前配置的端口设置
PM5CTL0 &=~LOCKLPM5;
}
void initClockTo16MHz ()
{
//根据 MCLK 的器件数据表的要求配置一个 FRAM 等待状态
//在配置时钟系统之前在8MHz 以上运行。
FRCTL0 = FRCTLPW | NWAITS_1;
//时钟系统设置
CSCTL0_H = CSKKEY_H; //解锁 CS 寄存器
CSCTL1 = DCOFSEL_0; //将 DCO 设置为1MHz
//设置 SMCLK = MCLK = DCO、ACLK = LFXTCLK (如果 VLOCLK 不可用)
CSCTL2 = SELA_LFXTCLK | SELESS__DCOCLK | SELM_DCOCLK;
//每个器件勘误表在将频率更改为之前将分频器设置为4
//防止因过冲瞬态而超出规格运行
CSCTL3 = DIVA__4 | DIVM_4;//针对勘误表将所有相应的时钟源设置为4分频
CSCTL1 = DCOFSEL_4 | DCORSEL; //将 DCO 设置为16MHz
//延迟~10us 以使 DCO 稳定。 60个周期= 20个周期缓冲器+(10us /(1/4MHz))
_DELAY_CYCLLES (60);
CSCTL3 = DIVA__1 | DIVM_1 | DIVM__1;//针对16MHz 运行将所有分频器设置为1
CSCTL4 &=~LFXTOFF;
操作
{
CSCTL5 &=~LFXTOFFG; //清除 XT1故障标志
SFRIFG1 &=~OFIFG;
} while (SFRIFG1&OFIFG); //测试振荡器故障标志
CSCTL0_H = 0; //锁定 CS 寄存器
}
//*********
//主要内容
如果使用 SMCLK、//进入 LPM0并等待 UART 中断。 如果使用 ACLK *
//、则器件将改为进入 LPM3模式。 UART RX 中断处理*
//接收到的字符并进行回波。 *
//*********
int main (void)
{
WDTCTL = WDTPW | WDTHOLD; //停止看门狗
initGPIO();
initClockTo16MHz ();
initUART();
//_enable_interrupts ();
#if UART_MODE = ACLK_9600
_bis_SR_register (LPM3_bits + GIE); //由于 ACLK 是源,所以进入 LPM3,中断被使能
#else
_bis_SR_register (LPM0_bits + GIE); //由于 SMCLK 是源,因此进入 LPM0,中断被启用
#endif
__no_operation(); //调试
器}
//*********
// UART 中断
//
#if defined (__TI_Compiler_version__)|| defined (__IAR_systems_icc_)
#pragma vector=USCI_A0_vector
__interrupt void USCI_A0_ISR (void)
#Elif defined (__GNU__)
void __attribute__(interrupt (USCI_A3_vector)))(不
支持 USCI_A3编译器#void!
#endif
{
switch (__even_in_range (UCA0IV、USCI_UART_UCTXCPTIFG))
}{
USCI_NONE 案例:中断;
USCI_UART_UCRXIFG 案例:
while (!(UCA0IFG&UCTXIFG));
UCA0TXBUF = UCA0RXBUF;
//UCA3TXBUF =计数;
__no_operation();
中断;
案例 USCI_UART_UCTXIFG:中断;
案例 USCI_UART_UCSTTIFG:中断;
案例 USCI_UART_UCTXCPTIFG:break;
}
}
此致、
Prudhvi Sagar