This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TM4C有关uart2的问题!收发程序 ch340 与电脑交互

Other Parts Discussed in Thread: EK-TM4C123GXL

根据已有电路(ch340连接了uart2的两个口),写了一段程序,想实现每次电脑向tm4c发送字符串时,tm4c向电脑发送相应字符串

程序如下,但是电脑发送字符串后,tm4c并没用回复

代码如下

void main()
{
char cThisChar;
// uint32_t ui32Ints;
ROM_SysCtlClockSet(SYSCTL_SYSDIV_1|SYSCTL_XTAL_16MHZ|SYSCTL_USE_OSC|SYSCTL_OSC_MAIN);
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART2);
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
HWREG(GPIO_PORTD_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY; //解锁
HWREG(GPIO_PORTD_BASE + GPIO_O_CR) = 0xFF;
ROM_GPIOPinConfigure(GPIO_PD6_U2RX);
ROM_GPIOPinConfigure(GPIO_PD7_U2TX);
ROM_GPIOPinTypeUART(GPIO_PORTD_BASE,GPIO_PIN_6|GPIO_PIN_7);
// ui32Ints = ROM_UARTIntStatus(UART2_BASE, true);
// ROM_UARTIntClear(UART2_BASE, ui32Ints);
ROM_UARTConfigSetExpClk(UART2_BASE,ROM_SysCtlClockGet(),115200,UART_CONFIG_WLEN_8|UART_CONFIG_STOP_ONE|UART_CONFIG_PAR_NONE);
ROM_UARTCharPut(UART2_BASE,'!');
do
{
cThisChar=ROM_UARTCharGet(UART2_BASE);
ROM_UARTCharPut(UART2_BASE,cThisChar);
}while((cThisChar!='\n')&&(cThisChar!='\r'));

}

望前辈帮帮忙!!!谢谢

  • 代码是应该没有问题的,是标准的官方电路,你把串口0改为串口2而已了。你把解锁放在外设初始化之前看看。

  • 解锁位置调整试了下,没有变化,我进行下面修改,将


    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART2);
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);

    改为

    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);

    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART2);

    修改后电脑可以收到由tm4c发来的‘!’了

    但是还是不能显示由电脑发送的字符串

    在调试时发现,do while 第一周期cThisChar被赋值为‘/0’

    而do while 第二周期 时在

    cThisChar=ROM_UARTCharGet(UART2_BASE);

    这条语句执行时停止,用电脑向TM4C发送字符依然没有回应。。。卡死在词语处

  • 下一步我应该怎么调呢

  • 看来TI对时序的要求果然好严格,必须先使能GPIO,才能继续使能串口外设。

    cThisChar=ROM_UARTCharGet(UART2_BASE);

    进去里面的函数,看看再哪个寄存器那里停止了。你再看看UART 数据寄存器(UARTDR)中有没有值了,应该是接收出错了,你再试试用UARTCharGet试试,不要用ROM中的函数,我晚上试试这个例子。

  • 我不会进函数里面运行。。。点步入还是卡死。。。

    不过我把ROM_UARTCharGet(UART2_BASE)改成了ROM_UARTCharGetNonbBocking(UART2_BASE);

    读到cThisChar的第一值为‘/0’后面全为空,也就是说FIFO里面没有数据了

    推断OM_UARTCharGet(UART2_BASE)卡死的原因是等待FIFO中有数

    接下来怎么解决好呢???

  • 没有数据的话,你给TM4发动一个数据实时,然后再读取fifo中的数据是否是你发送的,然后再把这个数据发送出去

  • 数据实时是什么?

    我将后面改成了

    do
    {
    if(ROM_UARTCharsAvail(UART2_BASE))
    {
    cThisChar=ROM_UARTCharGet(UART2_BASE);
    ROM_UARTCharPut(UART2_BASE,cThisChar);
    }
    }while((cThisChar!='\n')&&(cThisChar!='\r'));

    我用电脑每1s发送一个字符,结果if句只有在第一次循环时会进入,FIFO完全没有数~~

    数据实时那个怎么弄呀?

  • do
    {

    断点1
    if(ROM_UARTCharsAvail(UART2_BASE))
    {

    断点2
    cThisChar=ROM_UARTCharGet(UART2_BASE);
    ROM_UARTCharPut(UART2_BASE,cThisChar);
    }
    }while((cThisChar!='\n')&&(cThisChar!='\r'));

    断点3

    看到了吧,你判断程序停止没反应了,你要判断是在这三个断点的哪个地方停止了,然后才能进一步找到原因

  • 关于

    do
    {

    断点1
    if(ROM_UARTCharsAvail(UART2_BASE))
    {

    断点2
    cThisChar=ROM_UARTCharGet(UART2_BASE);
    ROM_UARTCharPut(UART2_BASE,cThisChar);
    }
    }while((cThisChar!='\n')&&(cThisChar!='\r'));

    断点3

    现象是ROM_UARTCharsAvail(UART2_BASE)恒等于0

    原来用ROM_UARTCharGet(UART2_BASE)会在这地方停止。。。因为没有数据。。。

    现在的现象是这样的参考图片

    这个问题怎么解决呢?谢谢

  • 你好,

    附件是我自己在TM4C launchpad上调试OK的代码,希望对你有帮助。

    把附件内容拷贝到下面路径

    C:\ti\TivaWare_C_Series-2.1.0.12573\examples\boards\ek-tm4c123gxl\adc

    另外,我怀疑你的板子是不是串口的PIN管脚设计的有问题?

    你用示波器抓波形,是有波形的吗?

  • 上面给你发的程序uart接受的基址写错了

    原因找到了

    第三方电路板电路设计有问题,把uart2的两个插到51开发板上的rxd、txd没有问题,实验成功

    感谢您的支持,忠心感谢

  • 果然是第三方开发板的问题。。。电路图上画着实际没接通rxd和ch340的txd,谢谢了

  • 最终程序的整理

    void main()
    {
    char cThisChar;
    // uint32_t ui32Ints;
    ROM_SysCtlClockSet(SYSCTL_SYSDIV_1|SYSCTL_XTAL_16MHZ|SYSCTL_USE_OSC|SYSCTL_OSC_MAIN);
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART2);
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
    HWREG(GPIO_PORTD_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY; //解锁
    HWREG(GPIO_PORTD_BASE + GPIO_O_CR) = 1<<7;
    ROM_GPIOPinConfigure(GPIO_PD6_U2RX);
    ROM_GPIOPinConfigure(GPIO_PD7_U2TX);
    ROM_GPIOPinTypeUART(GPIO_PORTD_BASE,GPIO_PIN_6|GPIO_PIN_7);
    ROM_UARTConfigSetExpClk(UART2_BASE,ROM_SysCtlClockGet(),115200,UART_CONFIG_WLEN_8|UART_CONFIG_STOP_ONE|UART_CONFIG_PAR_NONE);
    ROM_UARTCharPut(UART2_BASE,'!');
    do
    {
    cThisChar=ROM_UARTCharGet(UART2_BASE);
    ROM_UARTCharPut(UART2_BASE,cThisChar);
    }while((cThisChar!='\n')&&(cThisChar!='\r'));

    }


    感谢多日来论坛朋友的关照

  • 你好,

    问题解决了就好,如果我的答案有帮到你。

    请帮忙结掉该帖子。

    希望喜欢TI的MCU : )

  • 你好,

    为什么不直接购买TI的Launchpad开发板呢?

    我们的软件是和Launchpad一一对应的呀。

  • 你的这个原因太坑了,以后记得先检查硬件原因,汗