嵌入式技术论坛
直播中

陈秀英

7年用户 1204经验值
私信 关注
[经验]

RT-Thread操作系统的PIN设备读写步骤

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:

1.jpg

返回: 无

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);

原作者:小老虎_IOT

更多回帖

发帖
×
20
完善资料,
赚取积分