先告知一下相关布景:
Mcu类型:MS9430F149;
试验板:克己(有些缺点,稍后率直:)
开发环境:IAR Embedded Workbench V2.10A+串口调试帮手;
试验仪器:泰克数字示波器,万用表等;
笔者的内幕:立刻步入而立之年,学习点新东西,已感到有些无能为力了:)曾经有些51根底,430是第一次搞!当然这些都是业余爱好,以乐以闹为主:)
PCB曾经却是做过一些,不过都是51的简略板子,线也少,在protel99se下主动布线后再手动调整一下就蒙混过关,作出的板子尽管不太美丽但也牵强完成功用,呵呵。这次做这块430试验板彻底手动布线,大约做了两天,眼睛都花花了:(比及拿到板子一调试发现仍是有几处粗枝大叶的当地,无法只能飞线:(
转入正题吧,开端串口的收发数据调试:
找了根现成的串口线,和pc连接好,并设置好《串口调试帮手》参数,如图。运转,没反应,一模MAX3232有些棘手,赶忙封闭电源,中止!经仔细查看发现9针串口DB9封装错了,应该是DB/M我用的是DB/F一个公头一个母头线序不一样,补救措施:将串口拆下来焊接在底层(Bottom Layer)正好就对应上了,不过其时DB9焊的賳健壮,拆下来太困难,所以自己找了两个串口母头和一段线自己做一根串口线,有了前车之鉴这次特别当心别2、3对调,做好后又重复测了几回,没问题了,接好进行二进宫!
接上试验板用示波器测串口的2、3脚(RS232电平)没有波形,拔下来直接测有波形,将2、3短接<串口调试帮手接纳区>显现发送的内容,没问题。如此一看可能是板子上的MAX3232方才被烧毁了,拨拉下来再来一片新的,有波形了,但仍是没到达规划要求。
用示波器测430的串口1的TXD1端(P3.6)发现没有波形,看来底子没发动串口发送程序,将程序(▲)修正再测,恩不错有波形了经过MAX3232后也有波形了,按常理说这时应该在<串口调试帮手接纳区>显现接纳内容了,可是让人溃散的是仍旧没有:(
以为是MAX3232的硬件(包含4个电容,典型值是0.1uF,其时没找到0.1的就用4.7uF的替代了)出问题了,或者是RS232判定电平的缺点,这时在网上搜到了如下材料:
MAX232/MAX202接口输出的电平为何比计算机输出的RS-232电平低?
因为计算机内部的RS-232接口大都选用±12V供电的接口芯片,而MAX232/MAX202及其它大都Maxim的RS-232接口都是选用单电源(+3.3V或+5V)供电,由内部的电荷泵电路(倍压和倍压反相两种方法)发生接口所需的电源,这样就简化了电源规划。因为作业在倍压和倍压反相的电荷泵输出电压最高为±2×Vin(空载时),且带载才能有限,不管怎样,大都Maxim接口驱动器仍是可以确保幅值在±5V以上,以满意RS-232接口端±3V的接纳门限值。
没问题啊,我测到的波形在±6V左右啊,正在束手无策之际,想到了波特率是否共同的问题,从示波器调查PC发给430的1Bit数据的宽度约100us,频率f=10k和设定的9600十分挨近,没问题;在测430发给PC的1Bit数据宽度为6.4us,频率f=156250,所以发现问题所在,从头查看源程序时钟源挑选,发现程序(▲2)的忽略,更改后,全部ok,再看<串口调试帮手接纳区>正重复的显现“MSP430 MSP430 MSP430 MSP430…”
#include<msp430x14x.h>
void init_system(void);
void init_UART(void);
void transmit_da
char Da
//char Da
void main(void)
{
init_system();
while(1)
{
transmit_da
}
}
void init_system(void)
{
WDTCTL=WDTPW+WDTHOLD;
init_UART();
}
void init_UART(void)
{
//P3SEL|=UART1_TX+UART1_RX;
P3SEL|=0xc0;
P3DIR |= 0x40; //串口发送数据端口为输出,接纳数据端口为输入?
UCTL1=SWRST;//reset cotrol bit in UCTL1 ?
//UTCTL0|=SSEL0;//ACLK(▲2)
UTCTL1|=SSEL0;//ACLK
UBR01=0x03;//bode rate 9600.
UBR11=0x00;
UMCTL1=0x4a;
UCTL1=CHAR;//8 bits da
IFG2&=~UTXIFG1;
IE2|=URXIE1;//enable receive interrupt.
ME2|=URXE1+UTXE1;
}
void transmit_da
{
unsigned char i;
for(i=0;i<6;i++)
{
TXBUF1=Da
while((UTCTL1&TXEPT)!=TXEPT);
}
}
//***************************************************************************
//ISR for uart1 receive a byte.
//***************************************************************************
#pragma vector=UART1RX_VECTOR
__interrupt void usart1_rx (void)
{
if (RXBUF1 ==u)// u received?
{
_NOP();
//TXBUF1 = string1[i++];
}
}
以下是网上找到的材料:
运用ACLK为时钟源(32768Hz)做9600bps差错在±13%左右,测验运用SMCLK为时钟源(默许情况下外部晶振为32768Hz时,SMCLK为1048576Hz)。如下设置后,波特率差错小于±1%。不过此刻CPU低功耗不能运用LPM3/LPM4。
UTCTL0 = SSEL1; // UCLK = SMCLK
UBR00 = 0x6D; // 1M/9600波特率寄存器低字节
UBR10 = 0x00; // 1M/9600波特率寄存器高字节
UMCTL0 = 0x10; //波特率调整值
总结:经过这次430的串口调试进程,发现这个东西简单之处在于,任何一本430书都能找到串口收发的比如,并且也比较简略易懂;难处在于:涉及到软硬两方面的东西,一旦发现问题得先判别是硬缺点仍是软过错,特别关于象我这样第一次搞的处男,并且仍是克己的试验板,出了问题简直是晕菜!!不过只需你不扔掉不抛弃,再加上网路上很多高手的点拨,信任调试成功仅仅时间的问题:)祝你成功!!