通過(guò)pin device 可以設(shè)置GPIO輸入、輸出、中斷觸發(fā),同時(shí)還可以設(shè)置上下拉等。
需要在menuconfig里面使能以下2個(gè)宏:
- RT_USING_PIN
- BSP_USING_GPIO
獲取引腳編號(hào)(pin id)
不同于HAL層指定GPIO需要指定所在GPIO組和組內(nèi)的編號(hào),在驅(qū)動(dòng)層通常使用一個(gè)數(shù)字編號(hào)來(lái)表示某一個(gè)GPIO管腳(包括GPIOA和GPIOB),一下是驅(qū)動(dòng)層對(duì)所有GPIO編號(hào)的方法:
| GPIO | pin id |
| GPIOA_00 | 0 |
| GPIOA_01 | 1 |
| GPIOA_02 | 2 |
| ... | ... |
| GPIOB_00 | 96 |
| GPIOB_01 | 97 |
| GPIOB_02 | 98 |
| ... | ... |
舉例說(shuō)明:
- GPIOB03腳,pin id為 99
- GPIOA03腳,pin id為 3
- Note
- 也通過(guò)宏定義來(lái)獲取引腳編號(hào)
GET_PIN(port, pin)
#define LED0_PIN GET_PIN(1, 3) //GPIOA_03
#define LED1_PIN GET_PIN(2, 9) //GPIOB_09
例子1 中斷模式
PA00 設(shè)置為上升沿中斷觸發(fā)模式,等待3秒后關(guān)閉中斷觸發(fā)模式
static void pin_irq_callback(void *args)
{
LOG_I("pin_irq_callback");
}
void pin_irq()
{
rt_base_t pin_id = GET_PIN(1,0);
rt_pin_mode(pin_id, PIN_MODE_INPUT_PULLUP);
rt_pin_attach_irq(pin_id, PIN_IRQ_MODE_RISING, gpio_int_callback, RT_NULL);
rt_pin_irq_enable(pin_id, 1);
rt_thread_mdelay(3000);
rt_pin_irq_enable(pin_id, 0);
rt_pin_detach_irq(pin_id);
}
例子2 輸入或輸出模式
PB02 先設(shè)置輸入模式然后讀電平,再輸出高電平
void pin_read_and_write(void)
{
int v;
rt_base_t pin_id = GET_PIN(2,2);
rt_pin_mode(pin_id, PIN_MODE_INPUT_PULLUP);
v = rt_pin_read(pin_id);
LOG_I("pin_read value=%d",v);
rt_pin_mode(pin_id, PIN_MODE_OUTPUT);
rt_pin_write(pin_id, 1);
}