GPIO可以用来操作任何东西,只要你愿意,并且GPIO反应速度够,就可以模拟出任何时序,并且GPIO一般可以复用于其他功能,可以从以前的图中看到.
不过Pico的GPIO能力还真是非常基础的,具体如下:
- GPIO 输入/输出/翻转
- GPIO 中断(上升沿/下降沿/低电平/高电平)
- GPIO 翻转输入逻辑/翻转输入逻辑/强制高/强制低
- GPIO 上拉/下拉
- GPIO 复用ALT功能
官方给出的几个例子都很简单,而且也用到了批量变更IO之类的功能,可以说功能覆盖来说比较完善了,这里重点讲下API,以及和GPIO配合实现时许的一些技巧.
主要IO函数:
- gpio_set_function/gpio_get_function => 设置复用功能
- gpio_set_pulls/gpio_disable_pulls => 设置/取消上下拉
- gpio_set_outover/gpio_set_inover => 设置/取消强制输出高/低/翻转/正常,就比如写1,然后设置了翻转,则输出0.
- gpio_set_inover/gpio_set_oeover => 设置/取消强制输入高/低/翻转/正常,就比如外面是1,然后设置了反转,则输入0.
- gpio_set_input_enabled => 设置GPIO为输入模式
- gpio_set_irq_enabled => 设置中断输入模式(支持OR运算)
- gpio_set_irq_enabled_with_callback => 设置中断输入模式(支持OR运算),如果发生中断调用Callback.
- gpio_set_dormant_irq_enabled => 设置中断发生时唤醒低功耗模式.
- gpio_acknowledge_irq => 标记INT响应,即清中断标志位.
- gpio_init/gpio_init_mask => (批量)初始化为普通IO
- gpio_get/gpio_get_all => (批量)获取IO状态
- gpio_set_mask/gpio_clr_mask/gpio_xor_mask => 批量设置高/设置低/翻转IO
- gpio_put_masked/gpio_put_all/gpio_put => 批量/整体/单独改写IO状态
- gpio_set_dir_out_masked/gpio_set_dir_in_masked/gpio_set_dir_masked => 批量改写IO方向
- gpio_set_dir_all_bits/gpio_set_dir => 全部/单独改写IO方向
- gpio_is_dir_out/gpio_get_dir => 获取IO当前是输入还是输出
用GPIO模拟时序最重要的就是两个函数.
sleep_us()
sleep_ms()
使用MASK功能翻转IO(其实是软件实现的)可以更方便,更高效率操作并口接口的外设,比如屏幕.
最后,有一条关于GPIO的勘误(RP2040-E6),在SDK中已经修复关于上电ADC引脚作为输入模式的问题.