在上一篇博客里面学习了GPIO的操作,这次我们就一起来学习一下高速GPIO与中断。

Kendryte 210 高速GPIO与中断

高速GPIO与中断

芯片有 32 个高速 GPIO。与普通 GPIO 相似,管脚反转能力更强。官方standalone开发手册(以下简称手册)

高速GPIO的配置

与GPIO相类似的配置方法,只是函数名称有些许变化,例如从gpio_drive_mode变为了gpiohs_drive_mode,同时高速GPIO支持外部中断触发,这也是非常重要的一点。

配置一个LED控制IO(驱动模式为输出,默认状态为输出低电平)

参考手册第6章和第7章

#define PIN_LED 24
#define GPIO_LED 1
fpioa_set_function(PIN_LED, FUNC_GPIOHS1);
//配置IO24为高速GPIO1
gpiohs_drive_mode(GPIO_LED, GPIO_DM_OUTPU);
//配置驱动模式为输出模式
gpiohs_set_pin(GPIO_LED, GPIO_PV_LOW);
//配置IO输出为低电平

配置一个KEY控制IO(驱动模式为上拉输入模式)

参考手册第6章和第7章

#define PIN_KEY 25
#define GPIO_KEY 2
fpioa_set_function(PIN_KEY, FUNC_GPIOHS2);
//配置IO25为高速GPIO2
gpiohs_drive_mode(GPIO_KEY, GPIO_DM_INPU_PULL_UP);
//配置驱动模式为上拉输入模式

外部中断状态与服务函数的配置

配置KEY控制IO的中断使能与触发

参考手册的第4章、第6章和第21章

plic_init();
//初始化外部中断
sysctl_enable_irq();
//使能系统中断,使用中断前必须先使能
gpiohs_set_pin_edge(GPIO_KEY, GPIO_PE_BOTH);
//设置IO触发中断模式,GPIO_PE_BOTH为双沿触发
gpiohs_set_irq(GPIO_KEY, 1, irq_led);
//设置中断优先级为1,中断服务函数为`irq_led`

中断服务函数

参考手册的第6章

int irq_flag;
//声明一个整形的中断标志位
void irq_led(void gp)
{
    irq_flag = gpiohs_get_pin(GPIO_KEY);
    //进入中断后,读取KEY的值并赋给中断标志位
    printf("The IRQ Pin is %d\n", irq_flag);
    //打印中断标志位
    if (!irq_flag)
        gpiohs_set_pin(GPIO_LED, GPIO_PV_HIGH);
    else
        gpiohs_set_pin(GPIO_LED, GPIO_PV_LOW);
    //根据中断标志位的值,设置LED的状态
}

到这里基本的高速GPIO与中断相关配置就OK了,接下来编译烧录就可以了

cmake .. -DPROJ=gpio -G "MinGW Makefiles"
mingw32-make
kflash -p COMPORT $buildDir/gpio.bin
最后修改:2020 年 10 月 12 日
如果觉得我的文章对你有用,请随意赞赏