Loading... 在上一篇博客里面学习了GPIO的操作,这次我们就一起来学习一下高速GPIO与中断。 # Kendryte 210 高速GPIO与中断 ## 高速GPIO与中断 芯片有 32 个高速 GPIO。与普通 GPIO 相似,管脚反转能力更强。[官方standalone开发手册(以下简称手册)](https://s3.cn-north-1.amazonaws.com.cn/dl.kendryte.com/documents/kendryte_standalone_programming_guide_20190704110318_zh-Hans.pdf) ### 高速GPIO的配置 与GPIO相类似的配置方法,只是函数名称有些许变化,例如从`gpio_drive_mode`变为了`gpiohs_drive_mode`,同时高速GPIO支持外部中断触发,这也是非常重要的一点。 #### 配置一个LED控制IO(驱动模式为输出,默认状态为输出低电平) 参考手册第6章和第7章 ```c #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 ``` Last modification:October 12, 2020 © Allow specification reprint Like 0 If you think my article is useful to you, please feel free to appreciate