- 1、本文档共6页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
MSP430f5437uart串口总结
MSP430F5437通过串口向PC发送字符串,使字符串显示在串口助手中。单片机不停地发送字符,流程图如图所示。
程序代码如下:
#include msp430x54x.h
unsigned char buffer[] = {Im MSP430!\n};
void delay(unsigned int n)
{
unsigned int i,j;
for(i=0;in;i++)
for(j=0;j1000;j++);
}
void main(void)
{
unsigned int i;
WDTCTL = WDTPW + WDTHOLD; // 关狗
P5SEL = 0xC0; // P5_6和P5_7第二功能打开,设置方向
P5DIR = 0x40;
UCA1CTL1 |= UCSWRST; // 首先使RST位置位,只有这样后面的设置才有效
UCA1CTL1 |= UCSSEL_2; // SMCLK,为系统时钟1048576Hz
UCA1BR0 = 9; // 1MHz 115200
UCA1BR1 = 0; // 1MHz 115200
UCA1MCTL |= UCBRS_1 + UCBRF_0; // 设置调整参数UCBRSx=1, UCBRFx=0
UCA1CTL1 = ~UCSWRST; // RST复位
UCA1IE |= UCTXIE; // 使能发送中断允许
while(1)
{
while (!(UCA1IFGUCTXIFG)); //等待BUF区准备好,当IFG=1时就表示准备好了
for(i=0; isizeof(buffer); i++)
{
UCA1TXBUF = buffer[i]; //向串口发送数据
delay(20); //延时
}
}
}
注:这就完成了单片机向上位机发送数据的过程,其实质是向UCA1TXBUF执行写入操作。
根据流程图,进入主函数后:
是关闭看门狗。
将要使用的串口的IO的第二功能打开,这里用的是串口A1,所以对应的是P5_6和P5_7。
设置串口相关的寄存器,首先要将UCSWRST位置位,这是对其他寄存器进行设置的前提,设置好各个寄存器后还要将这一位复位。设置寄存器:选择时钟源,一般高频的选择系统时钟,例如115200,如果是2400,可以选择ACLK。然后选择波特率,包括三个寄存器:UCA1BR0、UCA1BR1和UCA1MCTL1,前两个是设置波特率基数BR,后面的一个是设置调整参数Mx,波特率计算公式为
Baud = CLK/(BR+(m7+m6+……+m0)/8),其中CLK为前面选择的时钟源频率,BR为两个BR的值,m和是MCTL1寄存器中有多少个1。
将UCSWRST位复位。
以上就算对寄存器的设置,现在就可以像TXBUF中写数据了。
注意,我起初没有加上程序中的延时函数,可能是数据发送的太频繁了,打开串口助手总是说串口被占用,于是我加了这个延时,串口中就舒服的现实了想要的数据Im MSP430!\n。
以上是单片机不停的向PC机发送,实际当中很少这样,一般是对各个寄存器初始化完毕之后,就把CPU设置到低功耗状态(这才能展现MSP430的特长所在),当需要向PC机发送数据时才会被激活。这就需要编写中断函数。下面讲的例子:首先上位机通过串口助手向单片机发送一个数据,单片机接收到数据之后,产生RX中断,进入中断服务函数之后,判断接收到的是什么数,如果是0怎发送buffer0,如果是1则发送buffer1,其他发送buffer2,程序代码如下:
#include msp430x54x.h
unsigned char buffer0[] = {Im MSP4300000!\n};
unsigned char buffer1[] = {Im MSP4311111!\n};
unsigned char buffer2[] = {I dont understand!\n};
#define _PRAGMA(x) _Pragma(#x)
#define HAL_ISR_FUNC_DECLARATION(f,v) _PRAGMA(vector = v) __interrupt vo
文档评论(0)