• MSP430 将ADC12MEM0寄存器的值发送给串口调试助手的方法


    当时为了调试,我在PCB板子上面画了一个DB9的插口,用以连接UCSI_A3的TXD和RXD的口,从而实现传输数据的功能。

    原理图如下:

    DB9的二口是RXD口,DB9的三口是TXD口。

    但是后来我发现UART所用的表示高低电平的电压和RS232的表示高低电平的电压不相同。RS232表示逻辑1的电平是-3~-15V,表示逻辑0的电平的+3~+15V 。所以我发现其实为了实现UART转变为RS232所用电平时,需要使用电平转换芯片。

    这里使用的是MAX3232EUE。原理图如下:

    但是要怎么利用UCSI_A3的UART模式,实现传输数据的功能呢?

    1. 前言:

    CPU与接口之间是通过并行方式传输的,接口与外设之间是通过串行方式传输的。所以,在串行接口中,必须要有“接收移位寄存器”(串转并)和发送移位寄存器(并转串)。MSP430F5438A上面的User's guide上面写的串行接口的结构是:

    上图中黄色标注的部分即是串转并寄存器和并转串寄存器。

    串行通信可以根据信息传送的方向分为单工,半双工,和全双工通讯。信息只能单向传输为单工通讯,信息能双向传输但不能同时双向传输被称为单双工通讯,信息可以同时双向传输被称为全双工通讯。

    串行通讯又可以分为同步通讯和异步通讯两种,异步通讯(UART)的收发没有同一的时钟源,而同步通讯(SPI , I2C)有同一的时钟源。

    USCI拥有一个硬件模块,支持多种串口模式。UART(通用异步收发器)是其中的一种,现就UART模式进行讲解。

    2.  UART的主要使用方法可以参照user's guide上面的一张图:

    即:(1) 先置UCAxCTL1寄存器的UCSWRST的值为1。

         (2) 根据自己的需要,配置相应的内容:包括时钟选择,分频比,调整参数UCBRS_x ,UCBRF_x。(具体怎么调整请参照User's guide,这里面就不一一列出了)

         (3)清除UCSWRST位。

         (4)允许中断标志位:UCRXIE或者UCTXIE。

    调试一:

    有下面的代码:

    #include "msp430x54x.h"
    unsigned char buffer[] = {"I'm youzi "};

    void delay(unsigned int n)
    {
    unsigned int i,j;
    for(i=0;i<n;i++)
    for(j=0;j<1000;j++);
    }

    void Init_UART()
    {
    P10SEL = 0x30; // P10_4和P10_5第二功能打开,设置方向
    P10DIR = 0x10;

    UCA3CTL1 |= UCSWRST; // 首先使RST位置位,只有这样后面的设置才有效
    UCA3CTL1 |= UCSSEL_2; // SMCLK,为系统时钟1048576Hz
    UCA3BR0 = 9; // 1MHz 115200
    UCA3BR1 = 0; // 1MHz 115200
    UCA3MCTL |= UCBRS_1 + UCBRF_0; // 设置调整参数UCBRSx=1, UCBRFx=0
    UCA3CTL1 &= ~UCSWRST; // RST复位
    UCA3IE |= UCTXIE; // 使能发送中断允许
    }

    void main(void)
    {
    WDTCTL = WDTPW + WDTHOLD; // 关狗

    Init_UART();

    while(1)
    {
    while (!(UCA3IFG&UCTXIFG)); //等待BUF区准备好,当IFG=1时就表示准备好了
    for(int i=0; i<sizeof(buffer); i++)
    {
    UCA3TXBUF = buffer[i]; //向串口发送数据
    delay(20); //延时
    __no_operation();
    }
    }
    }

    这段代码旨在实现每隔一段时间打印出" I'm youzi"

    结果在串口调试助手显示出来为:

    所以表示串口调试成功。

    调试二:

    有下面的代码:


    #include "msp430x54x.h"

    void main(void)

    {

    WDTCTL = WDTPW + WDTHOLD; // Stop WDT

    P10SEL = 0x30; // P10.4,5 = USCI_A0 TXD/RXD

    P10DIR = 0x10;

    UCA3CTL1 |= UCSWRST; // **Put state machine in reset**

    UCA3CTL1 |= UCSSEL_1; // CLK = ACLK

    UCA3BR0 = 0x0D; // 2400 (see User's Guide)

    UCA3BR1 = 0x00; //

    UCA3MCTL |= UCBRS_6+UCBRF_0; // Modulation UCBRSx=6, UCBRFx=0

    UCA3CTL1 &= ~UCSWRST; // **Initialize USCI state machine**

    UCA3IE |= UCRXIE; // Enable USCI_A1 RX interrupt

    __bis_SR_register(LPM3_bits + GIE); // Enter LPM3, interrupts enabled

    __no_operation(); // For debugger

    }

    // Echo back RXed character, confirm TX buffer is ready first

    #pragma vector=USCI_A3_VECTOR

    __interrupt void USCI_A3_ISR(void)

    {

    switch(__even_in_range(UCA3IV,4))

    {

    case 0:break; // Vector 0 - no interrupt

    case 2: // Vector 2 - RXIFG

    while (!(UCA3IFG&UCTXIFG)); // USCI_A1 TX buffer ready?

    UCA3TXBUF = UCA3RXBUF; // TX -> RXed character

    break;

    case 4:break; // Vector 4 - TXIFG

    default: break;

    }

    }

    这个代码的主要作用是为了实现传出的=传入的字符。

    调试结果为:

    即实现了接收了发送值的功能。

    注:这个串口调试我花了好几天的时间才做完,后来发现是在P10.3 , P10.4口上面还接了个蓝牙HC06的1口和2口。导致串口调试助手一直收不到信号。

         所以,当调试软件一直没有效果时,要好好检查一下硬件的原因。

    串口UART的初步调试就到这里。回去睡觉了。

  • 相关阅读:
    博客园博客
    mongo
    函数式编程与面向对象编程的对比
    python_字典dict要点总结
    pyhon_列表、元组要点总结
    vue-element框架通过blob进行后端token权限验证下载
    node-本地搭建服务
    (转载)测试用例标准
    soapUI学习笔记--用例字段参数化
    soapUI学习笔记---断言的小使用
  • 原文地址:https://www.cnblogs.com/qifengle/p/5107873.html
Copyright © 2020-2023  润新知