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.

TM4C123GH6PZ在keil调试中进入了MemManage_Handler

只做一个电灯的测试程序

int main (void)
{
int i;

IntMasterDisable();

SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);

SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);


while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOB))
{
}

GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_0);



while(1)
{
//
// Turn on the LED
//
GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_0,GPIO_PIN_0 );

//
//

for( i=0;i<100;i++);

//
// Turn on the LED
//
GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_0, ~GPIO_PIN_0);

//
//
for( i=0;i<100;i++);
}
}

  • 很多用户在使用TI M4的时候,会忽略一个细节,在使能外设模块时钟,直接去操作此模块,会导致进入FaultIsr中断服务入口,导致无法调试。

    在函数注释说明有个NOTE,大家可能没有注意到。如下:

    //! \note It takes five clock cycles after the write to enable a peripheral
    //! before the the peripheral is actually enabled. During this time, attempts
    //! to access the peripheral result in a bus fault. Care should be taken
    //! to ensure that the peripheral is not accessed during this brief time
    //! period.

    extern void SysCtlPeripheralEnable(uint32_t ui32Peripheral);

    //*****************************************************************************
    //
    //! Enables a peripheral.
    //!
    //! \param ui32Peripheral is the peripheral to enable.
    //!
    //! This function enables a peripheral. At power-up, all peripherals are
    //! disabled; they must be enabled in order to operate or respond to register
    //! reads/writes.
    //!
    //! The \e ui32Peripheral parameter must be only one of the following values:
    //! \b SYSCTL_PERIPH_ADC0, \b SYSCTL_PERIPH_ADC1, \b SYSCTL_PERIPH_CAN0,
    //! \b SYSCTL_PERIPH_CAN1, \b SYSCTL_PERIPH_CCM0,\b SYSCTL_PERIPH_COMP0,
    //! \b SYSCTL_PERIPH_EEPROM0, \b SYSCTL_PERIPH_EMAC, \b SYSCTL_PERIPH_EPHY,
    //! \b SYSCTL_PERIPH_EPI0,
    //! \b SYSCTL_PERIPH_GPIOA, \b SYSCTL_PERIPH_GPIOB, \b SYSCTL_PERIPH_GPIOC,
    //! \b SYSCTL_PERIPH_GPIOD, \b SYSCTL_PERIPH_GPIOE, \b SYSCTL_PERIPH_GPIOF,
    //! \b SYSCTL_PERIPH_GPIOG, \b SYSCTL_PERIPH_GPIOH, \b SYSCTL_PERIPH_GPIOJ,
    //! \b SYSCTL_PERIPH_GPIOK, \b SYSCTL_PERIPH_GPIOL, \b SYSCTL_PERIPH_GPIOM,
    //! \b SYSCTL_PERIPH_GPION, \b SYSCTL_PERIPH_GPIOP, \b SYSCTL_PERIPH_GPIOQ,
    //! \b SYSCTL_PERIPH_GPIOR, \b SYSCTL_PERIPH_GPIOS, \b SYSCTL_PERIPH_GPIOT,
    //! \b SYSCTL_PERIPH_HIBERNATE,
    //! \b SYSCTL_PERIPH_I2C0, \b SYSCTL_PERIPH_I2C1, \b SYSCTL_PERIPH_I2C2,
    //! \b SYSCTL_PERIPH_I2C3, \b SYSCTL_PERIPH_I2C4, \b SYSCTL_PERIPH_I2C5,
    //! \b SYSCTL_PERIPH_I2C6, \b SYSCTL_PERIPH_I2C7, \b SYSCTL_PERIPH_I2C8,
    //! \b SYSCTL_PERIPH_I2C9, \b SYSCTL_PERIPH_LCD0,
    //! \b SYSCTL_PERIPH_ONEWIRE0,
    //! \b SYSCTL_PERIPH_PWM0, \b SYSCTL_PERIPH_PWM1, \b SYSCTL_PERIPH_QEI0,
    //! \b SYSCTL_PERIPH_QEI1, \b SYSCTL_PERIPH_SSI0, \b SYSCTL_PERIPH_SSI1,
    //! \b SYSCTL_PERIPH_SSI2, \b SYSCTL_PERIPH_SSI3, \b SYSCTL_PERIPH_TIMER0,
    //! \b SYSCTL_PERIPH_TIMER1, \b SYSCTL_PERIPH_TIMER2, \b SYSCTL_PERIPH_TIMER3,
    //! \b SYSCTL_PERIPH_TIMER4, \b SYSCTL_PERIPH_TIMER5, \b SYSCTL_PERIPH_TIMER6,
    //! \b SYSCTL_PERIPH_TIMER7, \b SYSCTL_PERIPH_UART0, \b SYSCTL_PERIPH_UART1,
    //! \b SYSCTL_PERIPH_UART2, \b SYSCTL_PERIPH_UART3, \b SYSCTL_PERIPH_UART4,
    //! \b SYSCTL_PERIPH_UART5, \b SYSCTL_PERIPH_UART6, \b SYSCTL_PERIPH_UART7,
    //! \b SYSCTL_PERIPH_UDMA, \b SYSCTL_PERIPH_USB0, \b SYSCTL_PERIPH_WDOG0,
    //! \b SYSCTL_PERIPH_WDOG1, \b SYSCTL_PERIPH_WTIMER0, \b SYSCTL_PERIPH_WTIMER1,
    //! \b SYSCTL_PERIPH_WTIMER2, \b SYSCTL_PERIPH_WTIMER3,
    //! \b SYSCTL_PERIPH_WTIMER4, or \b SYSCTL_PERIPH_WTIMER5
    //!
    //! \note It takes five clock cycles after the write to enable a peripheral
    //! before the the peripheral is actually enabled. During this time, attempts
    //! to access the peripheral result in a bus fault. Care should be taken
    //! to ensure that the peripheral is not accessed during this brief time
    //! period.

    //!
    //! \return None.
    //
    //*****************************************************************************
    void
    SysCtlPeripheralEnable(uint32_t ui32Peripheral)
    {
    //
    // Check the arguments.
    //
    ASSERT(_SysCtlPeripheralValid(ui32Peripheral));

    //
    // Enable this peripheral.
    //
    HWREGBITW(SYSCTL_RCGCBASE + ((ui32Peripheral & 0xff00) >> 8),
    ui32Peripheral & 0xff) = 1;
    }


    有两种解决方法:

    1.直接系统延时

    SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);

    SysCtlDelay(6);

    2.等待模块时钟配置成功

    SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);

    while(!SysCtlPeripheralReady(SYSCTL_PERIPH_TIMER0)); //读取其模块时钟状态

    还有,你gpio置0和置1的最后一个参数,重新看看。拉低IO是直接写0,而不是取反GPIO_PIN_0。

  • 改了下  还是没有成功的

    #include <stdint.h>
    #include <stdbool.h>
    #include "inc/hw_types.h"
    #include "inc/hw_memmap.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/gpio.h"

    //*****************************************************************************
    //
    // Define pin to LED color mapping.
    //
    //*****************************************************************************

    //*****************************************************************************
    //
    //! \addtogroup example_list
    //! <h1>Project Zero (project0)</h1>
    //!
    //! This example demonstrates the use of TivaWare to setup the clocks and
    //! toggle GPIO pins to make the LED's blink. This is a good place to start
    //! understanding your launchpad and the tools that can be used to program it.
    //
    //*****************************************************************************

    #define RED_LED GPIO_PIN_1
    #define BLUE_LED GPIO_PIN_2
    #define GREEN_LED GPIO_PIN_3

    int i;

    //*****************************************************************************
    //
    // The error routine that is called if the driver library encounters an error.
    //
    //*****************************************************************************
    #ifdef DEBUG
    void
    __error__(char *pcFilename, uint32_t ui32Line)
    {
    }
    #endif

    //*****************************************************************************
    //
    // Main 'C' Language entry point. Toggle an LED using TivaWare.
    //
    //*****************************************************************************
    int main(void)
    {
    SysCtlClockSet(SYSCTL_SYSDIV_4|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|
    SYSCTL_OSC_MAIN);
    SysCtlDelay(6);

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
    while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOD))
    {
    }

    //
    // Configure the GPIO port for the LED operation.
    //
    GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, RED_LED|BLUE_LED|GREEN_LED);

    while(1)
    {
    //
    // Turn on the LED
    //
    GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_0,GPIO_PIN_0 );

    //
    // Delay for a bit
    //

    SysCtlDelay(2000000);

    //
    // Turn on the LED
    //
    GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_0, ~GPIO_PIN_0);

    //
    // Delay for a bit
    //
    SysCtlDelay(2000000);
    }
    }

  • 1.让你使能外设后延时,你设置时钟完毕后延时干嘛。

    2.你设置的是GPIOB的时钟,判断的是GPIOD的时钟是否准备完毕,不出问题才怪

    3.GPIO写操作0的最后一个数据,是0,不应该是~GPIO_PIN_0