我在学习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;
//将输入的数据输出到终端中}
此帖出自
小平头技术问答
一周热门 更多>