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:返回: 无
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);