Other Parts Discussed in Thread: EK-TM4C123GXL
Thread 中讨论的其他器件:EK-TM4C123GXL
由主持人编辑(问题在标题中):
问题1:当我运行,以下的代码时,它始终进入 exit.c (void abort(void)) ,如果我在 末尾添加一个 while (1),它将不会进入 exit.c 问题2:我使这个项目测试下面的 ButtonPoll(),我从 www.ti.com/.../tidcb5复制了它
/**
* main.c
*
#include
#include
#include "inc/hw_types.h"
#include "inc/hw_memmap.h"
#include "inc/hw_gpio.h"
#include "driverlib/fpu.h"
#include "driverlib/gpio.h"
#include "driverlib/sysctl.h"
#include "driverlib/rom.h"
#include "driverlib/pin_map.h"
#include "driverlib/interrupt.h"
#include "driverlib/gpio.h"
uint8_t ButtonPoll (uint8_t *、uint8_t *);
两个按键状态,初始化为高,按下 uint8_t g_ui8ButtonStates = GPIO_PIN_0|GPIO_PIN_4;//μ s
uint8_t * pui8Delta = 0;
uint8_t * pui8RawState = 0;
uint8_t ui8Buttons = 0;
int main (空)
{
SysCtlClockSet (SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHz|SYSCTL_OSC_MAIN);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
HWREG (GPIO_PORTF_BASE + GPIO_LO_LOCK)= GPIO_LOCK_KEY;
HWREG (GPIO_PORTF_BASE + GPIO_O_CR)|= 0x01;
HWREG (GPIO_PORTF_BASE + GPIO_LO_LOCK)= 0;
GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、(GPIO_PIN_1 + GPIO_PIN_2 + GPIO_PIN_3));
GPIOPinTypeGPIOInput (GPIO_PORTF_BASE、(GPIO_PIN_0 + GPIO_PIN_4));
GPIODirModeSet (GPIO_PORTF_BASE、 GPIO_PIN_0|GPIO_PIN_4、GPIO_DIR_MODE_IN);
GPIOPadConfigSet (GPIO_PORTF_BASE、GPIO_PIN_0|GPIO_PIN_4、
GPIO_Strength _2mA、GPIO_PIN_TYPE_STD_WPU);
G_ui8ButtonStates = GPIOPinRead (GPIO_PORTF_BASE、GPIO_PIN_0|GPIO_PIN_4);
// while (1)
// {
// SysCtlDelay (SysCtlClockGet ()/3000);
// ui8Buttons = ButtonPoll (pui8Delta、pui8RawState);
// }
}
uint8_t ButtonPoll (uint8_t * pui8Delta、uint8_t * pui8RawState)
{
uint32_t ui32Delta;
uint32_t ui32Data;
静态 uint8_t ui8SwitchClockA = 0;
静态 uint8_t ui8SwitchClockB = 0;
//
//读取按钮的原始状态。 保存原始状态
//(反转位检测)(如果调用方为提供存储)
//原始值。
//
ui32Data =(GPIOPinRead (GPIO_PORTF_BASE、GPIO_PIN_0|GPIO_PIN_4));
if (pui8RawState) //指针非空
{
* pui8RawState =(uint8_t)~ui32Data;//现在的状态取反得到原来的状态
}
//
//确定与反跳状态不同的开关(抖动)
//状态。
//
ui32Delta = ui32Data ^ g_ui8ButtonStates;
//
//将时钟递增一。
//
ui8SwitchClockA ^= ui8SwitchClockB;
ui8SwitchClockB =~ui8SwitchClockB;
//
//重置与状态未改变的开关对应的时钟。
//
ui8SwitchClockA &= ui32Delta;
ui8SwitchClockB &= ui32Delta;
//
//获取新的反跳开关状态。
//
g_ui8ButtonStates &= ui8SwitchClockA | ui8SwitchClockB;
g_ui8ButtonStates |=(~(ui8SwitchClockA | ui8SwitchClockB))和 ui32Data;
//
//确定刚刚更改去抖状态的开关。
//
ui32Delta ^=(ui8SwitchClockA | ui8SwitchClockB);
//
//存储为返回而更改的按钮的位掩码
//调用方。
//
if (pui8Delta)
{
* pui8Delta =(uint8_t) ui32Delta;
}
//
//将反跳按钮状态返回给调用方。 将该位反相
//进行检测,使'1'指示按钮被按下,即 A
//解释返回值的明智方法。
//
return (~g_ui8ButtonStates);
}