|
本帖最后由 guxingganyue 于 2013-4-8 11:02 编辑
如题:msp430f5438a,外接20M晶振,单片机跑115200。
我在while1中连续发一个字符串,但是每隔3次左右就会出现一堆乱码。即使单片机不发数,串口也收到连续的乱码。
现在我在收发两条线间接了一个4.7k的电阻,没有出现乱码了。即使单片机不发数,电脑串口也不会收到数据了。
这个现象我以前也遇到过一次,在avr单片机上,后来也没细究。今天又遇到了,特来请教各位有没有遇到过,为什么加电阻就好了呢?
下面是我的msp430f5438a初始化代码(按照官方的代码稍做了扩展):
- void UART0_Init(uint32_t BandRate)
- {
- P3SEL = 0x30; // P3.4,5 = USCI_A0 TXD/RXD
- //UCA0CTL0 = 0x00;//这句话不要,因为复位后的状态就是这样:8位数据,1位停止位,无奇偶校验,异步串口模式
- UCA0CTL1 |= UCSWRST; // Put state machine in reset
- UCA0CTL1 |= UCSSEL_2; // 时钟选择:ACLK
- if (BandRate==9600)//9600=>UCA0BRx=2083=0x0823
- {
- UCA0BR1 = 0x08;//高8位
- UCA0BR0 = 0x23;//低8位,20MHz 9600 (see User's Guide)
- UCA0MCTL |= UCBRS_2 + UCBRF_0;// Modulation UCBRSx=1, UCBRFx=0
- }
- else if (BandRate==19200)//19200=>UCA0BRx=1041=0x0411
- {
- UCA0BR1 = 0x04;//高8位
- UCA0BR0 = 0x11;//低8位,20MHz 19200 (see User's Guide)
- UCA0MCTL |= UCBRS_6 + UCBRF_0;// Modulation UCBRSx=1, UCBRFx=0
- }
- else if (BandRate==38400)//38400=>UCA0BRx=520=0x0208
- {
- UCA0BR1 = 0x02;//高8位
- UCA0BR0 = 0x08;//低8位,20MHz 38400 (see User's Guide)
- UCA0MCTL |= UCBRS_7 + UCBRF_0;// Modulation UCBRSx=1, UCBRFx=0
- }
- else if (BandRate==57600)//57600=>UCA0BRx=347=0x015B
- {
- UCA0BR1 = 0x01;//高8位
- UCA0BR0 = 0x5B;//低8位,20MHz 57600 (see User's Guide)
- UCA0MCTL |= UCBRS_2 + UCBRF_0;// Modulation UCBRSx=1, UCBRFx=0
- }
- else if (BandRate==115200)//115200=>UCA0BRx=173=0xAD
- {
- UCA0BR1 = 0;//高8位
- UCA0BR0 = 0xAD;//低8位,20MHz 115200 (see User's Guide)
- UCA0MCTL |= UCBRS_5 + UCBRF_0;// Modulation UCBRSx=1, UCBRFx=0
- }
- else if(BandRate==230400)//230400=>UCA0BRx=86=0x56
- {
- UCA0BR1 = 0;//高8位
- UCA0BR0 = 0x56;//低8位,20MHz 230400 (see User's Guide)
- UCA0MCTL |= UCBRS_7 + UCBRF_0;// Modulation UCBRSx=1, UCBRFx=0
- }
- else//9600
- {
- }
- UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
- //UCA0IE |= UCRXIE; // Enable USCI_A0 RX interrupt
- }
复制代码 我还遇到一个奇怪的现象,现在是准解决了,但还是不放心。
msp430f5438a外接25M,20M晶振,没有接32768晶振。ACLK=SMCLK=MCLK=XT2CLK
发现手一摸那个晶振单片机就死机了,但是我量时钟输出管脚,频率都是对的,说明单片机没有死机。
后来看官方的代码时发现有下面的这个中断:- #pragma vector=UNMI_VECTOR
- __interrupt void NMI_ISR(void)
- {
- uint16_t status=0;
- do
- {
- // If it still can't clear the oscillator fault flags after the timeout, trap and wait here.
- status = Clear_All_Osc_Flags(1000);
- } while(status != 0);
- }
复制代码 我把它加上后硬件仿真(上述代码中加断点),手摸几下后发现单片机跑到它里面去了,执行几遍后单片机又好了。。。原来是时钟有错误中断,我没清。。
大家有没有遇到这个现象,为什么手摸几下就这样了呢,以前还从没遇到过。。这种现象怎么解决呢(最好不要用上述的代码从软件上解决,因为这样单片机会小“死”一会的)
先谢谢大家了 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。
如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》
|