📄 uart.c
字号:
/*****************************************************************************\
文件名: main.c
描述: 用于MSP430F149。
异步通讯。
版本:1.0 2007-8-15
\*****************************************************************************/
#include <MSP430x14x.h>
#define USART_DIR P3DIR
#define USART_SEL P3SEL
#define USART_IN P3IN
#define USART_OUT P3OUT
#define UTXD0 BIT4
#define URXD0 BIT5
#define UTXD1 BIT6
#define URXD1 BIT7
#define CTL1 BIT6
#define CTL2 BIT5
unsigned char RxBuff[60]; //接收数据缓冲区
unsigned char N_RxBuff=0;
unsigned char TxBuff[60]; //发送数据缓冲区
unsigned char N_TxBuff=0;
unsigned char I_Flag=0;
unsigned char State=0; //工作状态
void PortInit(void);
void UartInit(void);
void TimerInit(void);
void SendUart(unsigned char *pBuffer,unsigned char n_byte);
void AddUsData(unsigned char sq0);
void InitSys(void);
/*****************************************************************************
主函数
******************************************************************************/
int main( void )
{
unsigned char q0;
unsigned char *pq0;
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
InitSys(); //初始化
pq0=&TxBuff[0];
while(1)
{
switch()
//发送数据
if(q0!=0)
{
SendUart(pq0,q0);
}
LPM3;
}
}
/*****************************************************************************
系统初始化
******************************************************************************/
void InitSys(void)
{
unsigned int iq0;
BCSCTL1&=~XTOFF; //打开XT2振荡器
do
{
IFG1 &= ~OFIFG; // 清除振荡器失效标志
for (iq0 = 0xFF; iq0 > 0; iq0--); // 延时,等待XT2起振
}
while ((IFG1 & OFIFG) != 0); // 判断XT2是否起振
BCSCTL2 =SELM1;
//选择MCLK为XT2
PortInit();
UartInit();
TimerInit();
//初始化USART0
_EINT(); //打开全局中断控制,若不需要打开,可以屏蔽本句
}
void PortInit(void)
{
P1DIR=0X0FF;
P2DIR=0X0FF;
P3DIR=0X0FF;
P4DIR=0X0FF;
P5DIR=0X0FF;
P6DIR=0X0FF;
P1OUT=0X0FF;
P2OUT=0X0FF;
P3OUT=0X0FF;
P4OUT=0x0FF;
P5OUT=0x0FF;
P6OUT=0x0FF;
USART_SEL|=(UTXD0+URXD0+UTXD1+URXD1);//设置管脚为第二功能
USART_DIR|=(UTXD0+UTXD1);
USART_DIR &=~(URXD0+URXD1);
P2OUT|=(CTL1+CTL2);
}
void UartInit(void)
{
UCTL0 = CHAR+PENA+SWRST; //8位数据,1位停止位,无校验
UTCTL0 = SSEL0; //选择UCLK = ACLK
UBR00 = 0x3; //设置波特率4800bit/s
UBR10 = 0;
UMCTL0 = 0x4A;
UCTL0 &= ~SWRST;
ME1 |= UTXE0 + URXE0; //打开模块USART0
IE1 |= URXIE0; //打开USART0接收中断
}
void TimerInit(void)
{
}
/*****************************************************************************
向接收缓冲区中增加一个数据
******************************************************************************/
void AddUsData(unsigned char sq0)
{
if(N_RxBuff<60)
{
RxBuff[N_RxBuff]=sq0;
N_RxBuff++;
}
}
/*****************************************************************************
发送函数。采用查询方式。
pBuffer:指向发送数据缓冲区的指针
n_byte:发送的字节数
******************************************************************************/
void SendUart(unsigned char *pBuffer,unsigned char n_byte)
{
unsigned char q0;
for(q0=0;q0<n_byte;q0++)
{
while((IFG1&UTXIFG0)==0); //查询是否发送完毕
TXBUF0=*pBuffer;
pBuffer++;
}
}
/*****************************************************************************
定时器A中断函数
中断源:CC0
******************************************************************************/
interrupt [TIMERA0_VECTOR] void Timer_A0(void)
{
I_Flag++;
if(I_Flag>4)
{
I_Flag=0;
}
LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽
}
/*****************************************************************************
USART0接收中断函数
******************************************************************************/
interrupt[UART0RX_VECTOR] void usart0_rx (void)
{
AddUsData(RXBUF0);
LPM3_EXIT;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -