4315|0

19

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

关于MSP430F249中的UART1模块 [复制链接]

我在学习MSP430F249,使用IAR For MSP430 v5.3,仿真环境Proteus7.9,在使用UART0时可以正常好收发数据,但是在使用UART1的时候,就不知道为什么不行了,下面是详细的代码,麻烦各位帮忙看一下看有什么问题?
#include "io430.h"
// #include "UART_lib.h"

/*===============================全局变量定义============================*/
unsigned char seg7[]={/*0,1,2,3,4,5,6,7,8,9,A,b,C,d,E,F,-,共阴极数码管*/
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x40,
};

/*===============================函数定义================================*/
/*----------------------------------------------------------------------------
/ 函数功能: 设置内部1MHz时钟
/ 参数: 无
/----------------------------------------------------------------------------*/
void SetInternalClock1MHz()
{
if(CALBC1_1MHZ == 0xFF || CALDCO_1MHZ == 0xFF)
{
while(1);                           // If calibration constants erased
                                            // do not load, trap CPU!!
}   
BCSCTL1 = CALBC1_1MHZ;                  // Set DCO
DCOCTL = CALDCO_1MHZ;
}

/*----------------------------------------------------------------------------
/ 函数功能: 设置UART1 源时钟
/ 参数: 源时钟clk1
/----------------------------------------------------------------------------*/
void SetBaudRateSourceClock1(unsigned char clk1)
{
/*UART0 Mode*/
switch(clk1) //波特率时钟源BRclk1
{
case 'u' : 
case 'U' : UCA1CTL1 |= UCSSEL_0; break; // 外部UCLK
case 'a' :
case 'A' : UCA1CTL1 |= UCSSEL_1; break; // 内部ACLK
case 's' : 
case 'S' : UCA1CTL1 |= UCSSEL_2; break; // 内部SMCLK
default : break;
}
}

/*----------------------------------------------------------------------------
/ 函数功能: 设置UART1 波特率
/ 参数: 源时钟clk1, 波特率baud1
/----------------------------------------------------------------------------*/
void SetBaudRate1(unsigned char clk1,unsigned int baud1)
{
UCA1BR0 = 104;
UCA1BR1 = 0;
UCA1MCTL = 1 << 1;
}

/*----------------------------------------------------------------------------
/ 函数功能: UART1初始化
/ 参数: 源时钟clk1, 波特率baud1
/----------------------------------------------------------------------------*/
void UART1_init(unsigned char clk1,unsigned int baud1)
{
UCA1CTL1 |= UCSWRST; // USART Hold Reset
P3SEL |= 0xc0;                   // P3.6, P3.7 = USCI_A1 TXD/RXD
SetBaudRateSourceClock1('s'); //波特率源时钟 SMCLK
SetBaudRate1(clk1,baud1); //源时钟clk1,波特率baud1
UCA1CTL1 &= ~UCSWRST;           // **Initialize USCI state machine**
UC1IE |= UCA1RXIE;              // Enable USCI_A1 RX interrupt
UC1IE |= UCA1TXIE;
}


int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;

SetInternalClock1MHz(); //使用内部8MHz时钟
UART1_init(1,96); //UART1初始化, 源时钟1MHz, 波特率9600
P5DIR=0xff; // P5端口数据方向输出
P5OUT=seg7[0];
// __bis_SR_register(LPM0_bits + GIE);       // Enter LPM0, interrupts enabled
}

/*================================中断函数=======================================*/
/*-------------------------------UART1中断函数-----------------------------------*/
/*UART1接收数据中断函数*/
#pragma vector=USCIAB1RX_VECTOR
__interrupt void USCI1RX_ISR()
{
if((UC1IFG&BIT0) == UCA1RXIFG)
{
if(UCA1RXBUF <= '9') //接收缓冲器中存储的是接收数据的ASCII码
P5OUT=seg7[UCA1RXBUF-'0'];
else
P5OUT=seg7[UCA1RXBUF-'0'-7];
UC1IE |= UCA1TXIE; //开启发送数据中断使能
}
}

/*UART1发送数据中断函数*/
#pragma vector=USCIAB1TX_VECTOR
__interrupt void USCI1TX_ISR()
{
// if((UC1IFG&BIT1) == UCA1TXIFG)
// {
// UCA1TXBUF = 32; //将输入的数据输出到终端中
// UC1IE &= ~UCA1TXIE; //关闭发送数据中断使能
// }
UCA1TXBUF = 32; //将输入的数据输出到终端中
}

 
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表