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.

程序跑飞的问题

Other Parts Discussed in Thread: TM4C123GH6PM

我用的TM4C123GH6PM,Tiva C LanunchPad。

写程序,可是一运行到下面这句,

SysCtlPeripheralEnable(SYSCTL_PERIPH_UART1);

程序就跑飞了。

这是怎么回事呢?

我查了一下,串口1 U1Rx这个脚还有模拟功能USB0ID,U1Tx这个脚还有USB0VBUS的功能。

是不是这个复用了?谢谢!

  • 高手支招啊!

  • 应该是这个IO复位的时候默认为模拟功能了,你重新配置下IO功能试试。

  • 谢谢!应该怎么配置呢?我不会,还请明示。

  • 不对呀,不是这个语句的问题,我同样用的是Tiva C LanunchPad,开头使用了这个语句,没有跑飞的现象

    //*****************************************************************************
    //
    // hello.c - Simple hello world example.
    //
    // Copyright (c) 2012-2014 Texas Instruments Incorporated.  All rights reserved.
    // Software License Agreement
    // 
    // Texas Instruments (TI) is supplying this software for use solely and
    // exclusively on TI's microcontroller products. The software is owned by
    // TI and/or its suppliers, and is protected under applicable copyright
    // laws. You may not combine this software with "viral" open-source
    // software in order to form a larger program.
    // 
    // THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
    // NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
    // NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    // A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
    // CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
    // DAMAGES, FOR ANY REASON WHATSOEVER.
    // 
    // This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package.
    //
    //*****************************************************************************
    
    #include <stdint.h>
    #include <stdbool.h>
    #include "inc/hw_memmap.h"
    #include "inc/hw_types.h"
    #include "driverlib/debug.h"
    #include "driverlib/fpu.h"
    #include "driverlib/gpio.h"
    #include "driverlib/pin_map.h"
    #include "driverlib/rom.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/uart.h"
    //#include "utils/uartstdio.h"
    
    //*****************************************************************************
    //
    //! \addtogroup example_list
    //! <h1>Hello World (hello)</h1>
    //!
    //! A very simple ``hello world'' example.  It simply displays ``Hello World!''
    //! on the UART and is a starting point for more complicated applications.
    //!
    //! UART0, connected to the Virtual Serial Port and running at
    //! 115,200, 8-N-1, is used to display messages from this application.
    //
    //*****************************************************************************
    
    //*****************************************************************************
    //
    // The error routine that is called if the driver library encounters an error.
    //
    //*****************************************************************************
    #ifdef DEBUG
    void
    __error__(char *pcFilename, uint32_t ui32Line)
    {
    }
    #endif
    
    ////*****************************************************************************
    ////
    //// Configure the UART and its pins.  This must be called before UARTprintf().
    ////
    ////*****************************************************************************
    //void
    //ConfigureUART(void)
    //{
    //    //
    //    // Enable the GPIO Peripheral used by the UART.
    //    //
    //    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
    
    //    //
    //    // Enable UART0
    //    //
    //    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
    
    //    //
    //    // Configure GPIO Pins for UART mode.
    //    //
    //    ROM_GPIOPinConfigure(GPIO_PA0_U0RX);
    //    ROM_GPIOPinConfigure(GPIO_PA1_U0TX);
    //    ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
    
    //    //
    //    // Use the internal 16MHz oscillator as the UART clock source.
    //    //
    //    UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC);
    
    //    //
    //    // Initialize the UART for console I/O.
    //    //
    //    UARTStdioConfig(0, 115200, 16000000);
    //}
    
    //*****************************************************************************
    //
    // Print "Hello World!" to the UART on the evaluation board.
    //
    //*****************************************************************************
    int
    main(void)
    {
        //volatile uint32_t ui32Loop;
    
        //
        // Enable lazy stacking for interrupt handlers.  This allows floating-point
        // instructions to be used within interrupt handlers, but at the expense of
        // extra stack usage.
        //
        ROM_FPULazyStackingEnable();
    
        //
        // Set the clocking to run directly from the crystal.
        //
        ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ |
                           SYSCTL_OSC_MAIN);
    
        //
        // Enable the GPIO port that is used for the on-board LED.
        //
        SysCtlPeripheralEnable(SYSCTL_PERIPH_UART1);
        ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
    
        //
        // Enable the GPIO pins for the LED (PF2 & PF3).
        //
        ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_2);
    
        //
        // Initialize the UART.
        //
    //    ConfigureUART();
    
    //    //
    //    // Hello!
    //    //
    //    UARTprintf("Hello, world!\n");
    
        //
        // We are finished.  Hang around doing nothing.
        //
        while(1)
        {
            //
            // Turn on the BLUE LED.
            //
            GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2);
    
            //
            // Delay for a bit.
            //
            SysCtlDelay(SysCtlClockGet() / 10 / 3);
    
            //
            // Turn off the BLUE LED.
            //
            GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0);
    
            //
            // Delay for a bit.
            //
            SysCtlDelay(SysCtlClockGet() / 10 / 3);
        }
    }
    
  • 那就奇怪了。

  • 这是我的工程,你帮我测试一下。谢谢!

  • 你这个程序,我测试了一下,确实可以。

  • 我看了看你的程序,你UART1初始化的太迟了,把初始化放在开中断之前。把UART1的初始化和UART0放在一起看看

  • 谢谢!照你说的改了,这句没有这个问题了,其他地方还有问题。很奇怪,莫名其妙的跑飞。

    唉,不搞了。

  • 一点也不奇怪,继续搞吧。你需要先测试每部分的模块,然后合在一起。记住初始化需要放在最前面。

  • 这是一本书上的源码,有问题。

    我照着输下来,一点没变,就不行。

    你是最活跃的,我是第二活跃的。

  • TM4C的书?市面上只有一本,清华大学的哪个红皮的,不记得里面有这个例程的。