本帖最后由 qq1042248300 于 2014-10-24 13:09 编辑
经过折腾终于实现了UART和电脑通信了。感谢网友【 07611128】和【不要镇定的玮哥】的无私分享,参见帖子 https://bbs.eeworld.com.cn/thread-447702-1-4.html。现在总结一下: MSP430的UART有A0和A1模式,其中A0模式的收发是P2.1和P2.0。默认的开发板链接USB后就是接通了A0通道的UART的,所以电脑设备管理器看见两个串口——UART就是A0通道的串口。 MSp430串口的使用需要配置这几个东西:1、复用uart的引脚;2、初始化一个稳定的时钟;3、串口的设置,包括了波特率,串口模式的使用。参考:https://bbs.eeworld.com.cn/thread-447702-1-4.html网友建立了一个uart.h。可以直接添加进去,然后使用,有发送字符,sendchar函数,发送字符串sendstring函数。参考网友的程序后,根据文档MSP430FR59xx Mixed-Signal Microcontrollers (Rev.D) .pdf 和 MSP-EXP430FR5969 LaunchPadUser guide.pdf的介绍查找寄存器和相应的关系后扩展如下:
——————————————我是调皮的程序分割线————————————
#define UART_H_
//有发送字符,sendchar函数,发送字符串sendstring函数。接口P2.0和P2.1
void uart_init() //初始化串口以及时钟配置
{
// Configure GPIO
P2SEL1 |= BIT0 | BIT1; // USCI_A0 UART operation
P2SEL0 &= ~(BIT0 | BIT1);
// Disable the GPIO power-on default high-impedance mode to activate
// previously configured port settings
PM5CTL0 &= ~LOCKLPM5;
// Startup clock system with max DCO setting ~8MHz
CSCTL0_H = CSKEY >> 8; // Unlock clock registers
CSCTL1 = DCOFSEL_3 | DCORSEL; // Set DCO to 8MHz
CSCTL2 = SELA__VLOCLK | SELS__DCOCLK | SELM__DCOCLK;
CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1; // Set all dividers
CSCTL0_H = 0; // Lock CS registers
// Configure USCI_A0 for UART mode
UCA0CTLW0 = UCSWRST; // Put eUSCI in reset
UCA0CTLW0 |= UCSSEL__SMCLK; // CLK = SMCLK
// Baud Rate calculation
// 8000000/(16*9600) = 52.083
// Fractional portion = 0.083
// User's Guide Table 21-4: UCBRSx = 0x04
// UCBRFx = int ( (52.083-52)*16) = 1
UCA0BR0 = 52; // 8000000/16/9600
UCA0BR1 = 0x00;
UCA0MCTLW |= UCOS16 | UCBRF_1;
UCA0CTLW0 &= ~UCSWRST; // Initialize eUSCI
//UCA0IE |= UCRXIE; // Enable USCI_A0 RX interrupt
}
void sendchar(unsigned char TXData) //发送字符
{
while (!(UCA0IFG & UCTXIFG));
UCA0TXBUF = TXData;//参考MSP430FR59xx Mixed-Signal Microcontrollers.pdf的寄存器介绍,接受寄存器为UCA0RXBUF
}
void sendstring(unsigned char *str) //发送字符串
{
unsigned int i = 0;
while (*str != '\0') {
sendchar(*str);
str++;
}
}
unsigned char receivechar()//接收字符
{
unsigned char ch;
while (!(UCA0IFG & UCRXIFG));
ch=UCA0RXBUF;
return ch;
}
void receivestring(unsigned char *str,int n) //接收字符串,指明长度,或者使用结束标志'~',此时i=0即可。
{
unsigned int i = 0;
for(i=0;i
{
str=receivechar();
}
}
——————————————我是调皮的程序分割线————————————
包含了四个函数:sendchar、sendstring、receivechar、receivestring。基本可以完成UART的全部功能了。然后写了一个简单的函数测试了一下功能:
——————————————我是调皮的程序分割线————————————
#include
#include "driverlib.h"
#include "uart.h"
int main(void) {
unsigned char str[]="hello";
unsigned char str1[5];
WDT_A_hold(WDT_A_BASE); //停止看门狗
GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0); //表示设置P1.0为输出
GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN0); //表示设置P1.0为输出低电平
PMM_unlockLPM5(); //禁止GPIO上电默认高阻抗模式以激活预先配置的端口设置
uart_init();
while(1)
{
sendstring(str);
_delay_cycles(2000000); //延迟
if(receivechar()=='k')
GPIO_toggleOutputOnPin(GPIO_PORT_P1, GPIO_PIN0); //设置P1.0开关LED
receivestring(str1,5);
if(str1[1]=='k')
GPIO_toggleOutputOnPin(GPIO_PORT_P1, GPIO_PIN0); //设置P1.0开关LED
}
return 0;
}
——————————————我是调皮的程序分割线————————————
使用串口调试助手发送一个'k',然后在发送一个'kkkkk',就可以看到LED打开然后关闭........发现这个开发板在没有LCD的情况下貌似就只有LED可以给我折腾了?管理员美女可以申请LCD扩展板嘛?好想用他生孩子....
|