使按键能控制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);
}