我想在AM5708 DSP核 实现按键的轮训和按键中断功能,参考SDK的代码配置,但是功能没法实现,不清楚是不是驱动没配置好。
如下代码现象:LED输出翻转正常,两个按键检测都不工作。
/**
* \file tl-led-flash.c
*
* \brief Example application main file. This application will toggle the led.
* The led toggling will be done inside an callback function, which
* will be called by Interrupt Service Routine. Interrupts are
* triggered manually and no external source is used to trigger
* interrupts.
*
* \version 1.0
*/
/* XDCtools Header files */
#include <xdc/std.h>
#include <xdc/cfg/global.h>
#include <xdc/runtime/System.h>
#include <xdc/runtime/Error.h>
/* BIOS Header files */
#include <ti/sysbios/BIOS.h>
#include <ti/sysbios/knl/Task.h>
#include <stdio.h>
#include <string.h>
/* TI-RTOS Header files */
#include <ti/drv/gpio/GPIO.h>
#include <ti/drv/gpio/soc/GPIO_soc.h>
/* UART Header files */
#include <ti/drv/uart/UART.h>
#include <ti/drv/uart/UART_stdio.h>
#include <ti/drv/uart/test/src/UART_board.h>
#include <ti/board/board.h>
#include <ti/csl/soc.h>
#include <ti/csl/soc/am572x/src/cslr_control_core_pad_io.h>
#include <ti/board/src/evmAM572x/include/evmam572x_pinmux.h>
/**********************************************************************
************************** Macros ************************************
**********************************************************************/
#define GPIO_PIN_VAL_LOW (0U)
#define GPIO_PIN_VAL_HIGH (1U)
#define GPIO_USER0_LED_PIN_NUM (0x04U)
#define GPIO_USER0_LED_PORT_NUM (0x04) /* user-led0, gpio4_4 */
#define GPIO_USER1_LED_PIN_NUM (0x04U)
#define GPIO_USER1_LED_PORT_NUM (0x05) /* user-led1, gpio5_4 */
#define GPIO_USER2_LED_PIN_NUM (0x05U)
#define GPIO_USER2_LED_PORT_NUM (0x05) /* user-led2, gpio5_5 */
#define GPIO_USER_KEY3_PIN_NUM 5
#define GPIO_USER_KEY3_PORT_NUM 4 //GPIO4_5
#define GPIO_USER_KEY4_PIN_NUM 20
#define GPIO_USER_KEY4_PORT_NUM 6 //GPIO6_20
/**********************************************************************
************************** Internal functions ************************
**********************************************************************/
/* GPIO Driver board specific pin configuration structure */
GPIO_PinConfig gpioPinConfigs[] = {
GPIO_DEVICE_CONFIG(GPIO_USER0_LED_PORT_NUM, GPIO_USER0_LED_PIN_NUM) | GPIO_CFG_OUTPUT,
GPIO_DEVICE_CONFIG(GPIO_USER1_LED_PORT_NUM, GPIO_USER1_LED_PIN_NUM) | GPIO_CFG_OUTPUT,
GPIO_DEVICE_CONFIG(GPIO_USER2_LED_PORT_NUM, GPIO_USER2_LED_PIN_NUM) | GPIO_CFG_OUTPUT,
GPIO_DEVICE_CONFIG(GPIO_USER_KEY3_PORT_NUM, GPIO_USER_KEY3_PIN_NUM) | GPIO_CFG_INPUT,
GPIO_DEVICE_CONFIG(GPIO_USER_KEY4_PORT_NUM, GPIO_USER_KEY4_PIN_NUM) | GPIO_CFG_IN_INT_RISING | GPIO_CFG_INPUT
};
/* GPIO Driver call back functions */
GPIO_CallbackFxn gpioCallbackFunctions[] = {
NULL,
NULL,
NULL,
NULL,
NULL
};
/* GPIO Driver configuration structure */
GPIO_v1_Config GPIO_v1_config = {
.pinConfigs = gpioPinConfigs,
.callbacks = gpioCallbackFunctions,
.numberOfPinConfigs = sizeof(gpioPinConfigs) / sizeof(GPIO_PinConfig),
.numberOfCallbacks = sizeof(gpioCallbackFunctions) / sizeof(GPIO_CallbackFxn),
.intPriority = 20,
};
/* ON Board LED pins which are connected to GPIO pins. */
typedef enum GPIO_LED {
USER_LED0 = 0,
USER_LED1,
USER_LED2,
END
}GPIO_LED;
typedef enum GPIO_INPUT {
USER_KEY3 = 3,
USER_KEY4 = 4
}GPIO_INPUT;
void print_debug(char *str)
{
UART_puts(str,strlen(str));
}
void user_key3_cb(void)
{
print_debug("\n user_key3_cb \n");
}
void user_key4_cb(void)
{
print_debug("\n user_key4_cb \n");
}
void GPIO_PIN_MUX(void)
{
uint32_t regVal = 0;
/* GPIO pinmux configuration */
CSL_FINS(regVal, CONTROL_CORE_PAD_IO_PAD_VIN2A_D3_VIN2A_D3_MUXMODE, 0xEU);
((CSL_padRegsOvly) CSL_MPU_CORE_PAD_IO_REGISTERS_REGS)->PAD_VIN2A_D3 = regVal; /* vin2a_d3.gpio4_4(user_led0) */
CSL_FINS(regVal, CONTROL_CORE_PAD_IO_PAD_MCASP1_AXR2_MCASP1_AXR2_MUXMODE, 0xEU);
((CSL_padRegsOvly) CSL_MPU_CORE_PAD_IO_REGISTERS_REGS)->PAD_MCASP1_AXR2 = regVal; /* mcasp1_axr2.gpio5_4(user_led1) */
CSL_FINS(regVal, CONTROL_CORE_PAD_IO_PAD_MCASP1_AXR3_MCASP1_AXR3_MUXMODE, 0xEU);
((CSL_padRegsOvly) CSL_MPU_CORE_PAD_IO_REGISTERS_REGS)->PAD_MCASP1_AXR3 = regVal; /* mcasp1_axr3.gpio5_5(user_led2) */
CSL_FINS(regVal, CONTROL_CORE_PAD_IO_PAD_VIN2A_D4_VIN2A_D4_MUXMODE, 0xEU);
((CSL_padRegsOvly) CSL_MPU_CORE_PAD_IO_REGISTERS_REGS)->PAD_VIN2A_D4 = regVal; /* VIN2A_D4.gpio4_5(user_key3) */
CSL_FINS(regVal, CONTROL_CORE_PAD_IO_PAD_XREF_CLK3_XREF_CLK3_MUXMODE, 0xEU);
((CSL_padRegsOvly) CSL_MPU_CORE_PAD_IO_REGISTERS_REGS)->PAD_XREF_CLK3 = regVal; /* XREF_CLK3.gpio6_20(user_key4) */
/* GPIO4 Clock Enable */
*(unsigned int*)0x4A009770 = (unsigned int)(0x00000102);
/* GPIO6 Clock Enable */
*(unsigned int*)0x4A009780 = (unsigned int)(0x00000102);
// /* Set the callback function */
// GPIO_setCallback(USER_KEY3, user_key3_cb);
// /* Enable GPIO interrupt on the specific gpio pin */
// GPIO_enableInt(USER_KEY3);
/* Set the callback function */
GPIO_setCallback(USER_KEY4, user_key4_cb);
/* Enable GPIO interrupt on the specific gpio pin */
GPIO_enableInt(USER_KEY4);
}
/*
* ======== Board_initGPIO ========
*/
static void Board_initGPIO(void)
{
Board_initCfg boardCfg;
boardCfg = BOARD_INIT_MODULE_CLOCK | BOARD_INIT_UART_STDIO;
Board_init(boardCfg);
}
/**********************************************************************
************************** Global Variables **************************
**********************************************************************/
/*
* ======== task function ========
*/
void tl_led_flash(UArg arg0, UArg arg1)
{
uint8_t i = 0;
/* GPIO initialization */
GPIO_init();
GPIO_PIN_MUX();
print_debug("\n GPIO Led Blink Application \n");
while(1)
{
/* Turn on LEDs */
for ( i = 0; i < END; i++ ){
GPIO_write(i,GPIO_PIN_VAL_HIGH);
}
/* Keep the LEDs on for 500 ms */
Task_sleep(500);
/* Turn off LEDs */
for ( i = 0; i < END; i++ ){
GPIO_write(i,GPIO_PIN_VAL_LOW);
}
/* Keep the LEDs off for 500 ms */
Task_sleep(500);
if(GPIO_read(USER_KEY3) == 1)
{
print_debug("key3 is press\n");
}
if(GPIO_read(USER_KEY4) == 0)
{
print_debug("key4 is press\n");
}
}
Task_exit();
}
/*
* ======== main ========
*/
int main(void)
{
Task_Handle task;
Error_Block eb;
Error_init(&eb);
/* Call board_init functions */
Board_initGPIO();
/* create a Task, which is tl_led_flash */
task = Task_create(tl_led_flash, NULL, &eb);
if (task == NULL) {
System_printf("Task_create() failed!\n");
BIOS_exit(0);
}
/* Start BIOS */
BIOS_start();
return (0);
}