What
单片机可以与其他机器(像上位机,我们所用的上位机就是我们的PC)进行数据之间的传输也就是通信。而通信具有不同的通信模式,这一节主要讨论单片机(MSP430)的UART通信模式。
MSP430G2553只有一个USCI_A0和USCI_B0模块
UART通信模式是一种异步串行通信模式。所谓异步,就是收发双方的时钟并不同步,发送方以一定的方式发出数据,接收方也以类似的方式接收数据,对数据的传输及发送时间没有要求,而同步通信模块需要收发双方时钟相同,接收和发送有时钟要求;所谓串行通信模式直观理解就是通信只有一条道路,数据位按顺序依次通过,而并行通信模式就是有多条道路,数据位并排一起过去。
UART典型数据格式如下
其他内容参考手册相关部分内容。再写我怕写错了。
How
当UCSYNC位被清零时USCI就选择了UART模式。
管脚配置
时钟源配置
时钟选择
波特率配置
中断配置,中断函数编写
LaunchPad在进行串口通信时需要将RXD和TXD两列的跳线帽横插。
举例
串口(使用USART2,TX为PA2,RX为PA3),发送0x55显示在上位机串口助手上(波特率9600)
#include "io430.h"
void Delay_ms(unsigned cnt)
{
unsigned int i,j;
for(j=0;j<cnt;j++)
{
i=1000/6;
while(i--);
}
}
void InitUART(void)
{
//复位USCI_Ax
UCA0CTL1|=UCSWRST;
//选择USCI_Ax为UART模式
UCA0CTL0&=~UCSYNC;
//配置UART时钟源为SMCLK
UCA0CTL1|=UCSSEL1;
//配置波特率为9600
UCA0BR0=104;
UCA0BR1=0;
UCA0MCTL=1<<1;
//使能端口复用
P1SEL|=BIT1+BIT2;
P1SEL2|=BIT1+BIT2;
//清除复位,使能UART
UCA0CTL1&=~UCSWRST;
}
void InitSystemClock(void)
{
//配置DCO为1MHz
DCOCTL=CALDCO_1MHZ;
BCSCTL1=CALBC1_1MHZ;
//配置SMCLK的时钟源为DCO
BCSCTL2&=~SELS;
//设置SMCLK的分频系数为1
BCSCTL2&=~(DIVS0|DIVS1);
}
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
InitSystemClock();
InitUART();
while(1)
{
UCA0TXBUF=0x55;
Delay_ms(1000);
}
}
UART串口通信发送0x55至上位机
Task
将接收的上位机数据取反后再发送到串口助手上。(波特率9600)
#include "io430.h"
#include "stdint.h"
/* @fn: void InitUART(void)
@brief: 初始化串口,包括设置波特率,数据位,校验位等
@para: none
@return: none
@comment: 初始化串口
*/
void InitUART(void)
{
//复位USCI_Ax
UCA0CTL1|=UCSWRST;
//选择USCI_Ax为UART模式
UCA0CTL0&=~UCSYNC;
//配置UART时钟源为SMCLK
UCA0CTL1|=UCSSEL1;
//配置波特率为9600
UCA0BR0=104;
UCA0BR1=0;
UCA0MCTL=1<<1;
//使能端口复用
P1SEL|=BIT1+BIT2;
P1SEL2|=BIT1+BIT2;
//清除复位,使能UART
UCA0CTL1&=~UCSWRST;
//接收中断启用
IE2|=UCA0RXIE;
//清空接收中断标志位
IFG2&=~UCA0RXIFG;
}
/* @fn: void InitSystemClock(void)
@brief: 初始化系统时钟
@para: none
@return: none
@comment: 初始化系统时钟
*/
void InitSystemClock(void)
{
//配置DCO为1MHz
DCOCTL=CALDCO_1MHZ;
BCSCTL1=CALBC1_1MHZ;
//配置SMCLK的时钟源为DCO
BCSCTL2&=~SELS;
//设置SMCLK的分频系数为1
BCSCTL2&=~(DIVS0|DIVS1);
}
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
InitSystemClock();
InitUART();
P1DIR|=BIT0;//用于查看程序是否正常运行
P1OUT|=BIT0;
__bis_SR_register(LPM0_bits+GIE);
}
#pragma vector=USCIAB0RX_VECTOR
__interrupt void UART_Receive_ISR(void)
{
while (!(IFG2&UCA0TXIFG)); // 检测发送是否准备好
UCA0TXBUF = ~UCA0RXBUF; // 将接收数据发送给主机
}
UART接收取反发送
sao话一下
为众人抱薪者,不可使其扼于风雪。为自由开路者,不可使其困于荆棘。即使我们不是抱薪开路之人,也应该多一些善良。