在上一篇博客里面学习了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