PIN Device
The PIN device allows configuring GPIO input, output, and interrupt triggers, but does not support pull-up or pull-down functionalities.
Driver Configuration
To add the PIN device, select {menuselection} On-Chip Peripheral RTOS Drivers --> Enable GPIO menu. You do not need to fill in the GPIO BASE number option.
Corresponding macro switches are as follows:
#define RT_USING_PIN
#define BSP_USING_GPIO
Getting Pin Numbers (Pin ID)
Unlike the HAL layer, where GPIOs need to specify the GPIO group and group number, the driver layer uses a numeric ID to represent a specific pin (including GPIOA, GPIOB, and PBR on supported series). The numbering method is as follows:
Pin |
Pin ID |
Notes |
|---|---|---|
GPIOA_00 |
0 |
|
GPIOA_01 |
1 |
|
GPIOA_02 |
2 |
|
… |
… |
|
GPIOB_00 |
96 |
|
GPIOB_01 |
97 |
|
GPIOB_02 |
98 |
|
… |
… |
|
PBR0 |
160 |
|
PBR1 |
161 |
|
… |
… |
Range depends on series, see note below |
Example:
GPIOB03 pin, Pin ID is 99
GPIOA03 pin, Pin ID is 3
Note
You can also use macros to obtain pin numbers.
GET_PIN(port, pin)
#define LED0_PIN GET_PIN(1, 3) //GPIOA_03
#define LED1_PIN GET_PIN(2, 9) //GPIOB_09
Note
For PBR pins in the pin device layer, use GET_PIN(0, pbr_index).
Chip Difference Description:
SF32LB52 / SF32LB56: support
PBR0~PBR3(pin id160~163)SF32LB58: support
PBR0~PBR5(pin id160~165)SF32LB55: PBR is not supported
Example 1 – Interrupt Mode
Set PA00 as rising edge interrupt trigger mode and disable the interrupt trigger mode after 3 seconds.
static void pin_irq_callback(void *args)
{
LOG_I("pin_irq_callback");
}
void pin_irq()
{
rt_base_t pin_id = GET_PIN(1,0); //Get GPIOA_00 pin id
//Set pin input mode
rt_pin_mode(pin_id, PIN_MODE_INPUT_PULLUP);
//Enable rising edge interrupt mode
rt_pin_attach_irq(pin_id, PIN_IRQ_MODE_RISING, gpio_int_callback, RT_NULL);
//Enable interrupt
rt_pin_irq_enable(pin_id, 1);
rt_thread_mdelay(3000);
//Disable interrupt
rt_pin_irq_enable(pin_id, 0);
//Detach irq handler
rt_pin_detach_irq(pin_id);
}
Example 2 – Input or Output Mode
Set PB02 to input mode, then read the level, followed by outputting a high level.
void pin_read_and_write(void)
{
int v;
rt_base_t pin_id = GET_PIN(2,2); //Get GPIOB_02 pin id
//Set pin input mode
rt_pin_mode(pin_id, PIN_MODE_INPUT_PULLUP);
v = rt_pin_read(pin_id);
LOG_I("pin_read value=%d",v);
//Set pin output mode
rt_pin_mode(pin_id, PIN_MODE_OUTPUT);
//Set pin output high
rt_pin_write(pin_id, 1);
}