C语言使K210的LED灯闪烁并按键可控

使按键能控制LED1,在此,要借助中断函数。找到KEY按键对应IO_26,LED1对应IO_25。
首先宏定义IO口:

#define PIN_LED 25
#define PIN_KEY 26

#define GPIO_LED 3
#define GPIO_KEY 2

使能中断:

plic_init();
sysctl_enable_irq();
fpioa_set_function(PIN_KEY, FUNC_GPIOHS2);
gpiohs_set_drive_mode(GPIO_KEY, GPIO_DM_INPUT);
gpiohs_set_pin_edge(GPIO_KEY, GPIO_PE_BOTH);//双边沿触发
gpiohs_set_irq(GPIO_KEY, 1, irq_gpiohs2);//设置高速GPIO的中断回调函数

设置LED1的IO口为高:

fpioa_set_function(PIN_LED, FUNC_GPIOHS3);
gpiohs_set_drive_mode(GPIO_LED, GPIO_DM_OUTPUT);
gpio_pin_value_t value = GPIO_PV_HIGH;
gpiohs_set_pin(GPIO_LED, value);

使LED1闪烁:

while (1)
{
    sleep(1);
    if (irq_flag)
        gpiohs_set_pin(GPIO_LED, value = !value);
    int val = gpiohs_get_pin(GPIO_KEY);
    printf("The PIN is %d\n", val);
}

编写中断回调函数:

void irq_gpiohs2(void* gp)
{
    irq_flag = gpiohs_get_pin(GPIO_KEY);

    printf("IRQ The PIN is %d\n", irq_flag);

    if (irq_flag)
        gpiohs_set_pin(GPIO_LED, GPIO_PV_LOW);
    else
        gpiohs_set_pin(GPIO_LED, GPIO_PV_HIGH);
}

当按下按键,中断到来,中断回调函数被调用,于是LED的IO口电压为LOW,因此灯不亮。
另外一种方式:使用gpiohs_irq_register函数

uint32_t irq_flag;

#define PIN_LED 25
#define PIN_KEY 26

#define GPIO_LED 3
#define GPIO_KEY 2

uint32_t g_count;

int irq_gpiohs2(void* ctx)
{
    irq_flag = gpiohs_get_pin(GPIO_KEY);

    printf("IRQ The PIN is %d\n", irq_flag);

    uint32_t *tmp = (uint32_t *)(ctx);
    printf("count is %d\n", (*tmp)++);

    if (!irq_flag)
        gpiohs_set_pin(GPIO_LED, GPIO_PV_LOW);
    else
        gpiohs_set_pin(GPIO_LED, GPIO_PV_HIGH);
    return 0;
}

int main(void)
{
    plic_init();
    sysctl_enable_irq();

    fpioa_set_function(PIN_LED, FUNC_GPIOHS3);
    gpiohs_set_drive_mode(GPIO_LED, GPIO_DM_OUTPUT);
    gpio_pin_value_t value = GPIO_PV_HIGH;
    gpiohs_set_pin(GPIO_LED, value);

    fpioa_set_function(PIN_KEY, FUNC_GPIOHS2);
    gpiohs_set_drive_mode(GPIO_KEY, GPIO_DM_INPUT_PULL_UP);
    gpiohs_set_pin_edge(GPIO_KEY, GPIO_PE_BOTH);

    gpiohs_irq_register(GPIO_KEY, 1, irq_gpiohs2, &g_count);

    while (1);
}

你可能感兴趣的:(K210)