官方资料:PIN设备 (rt-thread.org)
1、代码
下面代码是宏定义引脚,然后操作引脚输出高低电平,并读取引脚电平;
(P.S.引脚是输出模式,也可以读取引脚电平的)
//宏定义LED的引脚编号PF9
#define LED0_PIN GET_PIN(F, 9)
int main(void)
{
//设置LED为推挽输出
rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
while (1)
{
rt_pin_write(LED0_PIN, PIN_HIGH); //设置高电平
rt_kprintf("led_status = %d\n",rt_pin_read(LED0_PIN));//读取电平
rt_thread_mdelay(500);
rt_pin_write(LED0_PIN, PIN_LOW); //设置低电平
rt_kprintf("led_status = %d\n",rt_pin_read(LED0_PIN));//读取电平
rt_thread_mdelay(500);
}
}
2、获取引脚编号 GET_PIN
2.1、GET_PIN的宏定义
#define GET_PIN(PORTx,PIN) (rt_base_t)((16 * ( ((rt_base_t)__STM32_PORT(PORTx) - (rt_base_t)GPIOA_BASE)/(0x0400UL) )) + PIN)
2.2、__STM32_PORT(port)的宏定义
##是字符串连接的意思,比如__STM32_PORT(F),也就是GPIO##F##_BASE,即?GPIOF_BASE
#define __STM32_PORT(port) GPIO##port##_BASE
?2.3、下面是各个GPIO的地址,PF9带入GET_PIN的宏展开:
((16*(GPIOF_BASE-GPIOA_BASE)/1024)+9)
=((16*5)+9)
= 89
/*!< AHB1 peripherals */
#define GPIOA_BASE (AHB1PERIPH_BASE + 0x0000UL)
#define GPIOB_BASE (AHB1PERIPH_BASE + 0x0400UL)
#define GPIOC_BASE (AHB1PERIPH_BASE + 0x0800UL)
#define GPIOD_BASE (AHB1PERIPH_BASE + 0x0C00UL)
#define GPIOE_BASE (AHB1PERIPH_BASE + 0x1000UL)
#define GPIOF_BASE (AHB1PERIPH_BASE + 0x1400UL)
#define GPIOG_BASE (AHB1PERIPH_BASE + 0x1800UL)
#define GPIOH_BASE (AHB1PERIPH_BASE + 0x1C00UL)
#define GPIOI_BASE (AHB1PERIPH_BASE + 0x2000UL)
?对不对可以测试下,直接 #define LED0_PIN ? ??? ?89
还有一种获取引脚编号的方式rt_pin_get,在程序中打印rt_kprintf("PF9 = %d\n",rt_pin_get("PF.9")); ,
串口打印确实也是89;
3、配置引脚模式 rt_pin_mode
参数:?????pin:引脚编号
????????????????mode:
PIN_MODE_OUTPUT | 推挽输出 | PIN_MODE_INPUT | 浮空输入 | PIN_MODE_INPUT_PULLUP | 上拉输入 | PIN_MODE_INPUT_PULLDOWN | 下拉输入 | PIN_MODE_OUTPUT_OD | 开漏输出 |
返回:?????无
void rt_pin_mode(rt_base_t pin, rt_base_t mode);
4、写引脚电平 rt_pin_write
参数:?????pin:引脚编号
????????????????value:电平逻辑值,可取 2 种值之一,PIN_LOW 低电平,PIN_HIGH 高电平
返回:?????无
void rt_pin_write(rt_base_t pin, rt_base_t value);
5、读引脚电平 rt_pin_read
参数:?????pin:引脚编号
返回:?????PIN_LOW 低电平;PIN_HIGH 高电平
int rt_pin_read(rt_base_t pin);
|