RT-Thread 驱动 PIN 设备

本示例在 STM32 NUCLEO-F411RE 开发板进行,由于 RT-Thread 项目中已包含对应的 BSP,也就是 bsp/stm32/stm32f411-st-nucleo 工程目录,因此我们在此基础上进行开发即可。

用 RT-Thread 控制 STM32 的 GPIO 有两种方法:

  1. 使用 HAL 库的函数
  2. 使用 RT-Thread 的 pin 设备

本示例使用 RT-Thread 的 pin 设备进行开发。


PIN 设备管理接口

应用程序通过 RT-Thread 提供的 PIN 设备管理接口来访问 GPIO,相关接口如下所示:

函数 描述
rt_pin_mode() 设置引脚模式
rt_pin_write() 设置引脚电平
rt_pin_read() 读取引脚电平
rt_pin_attach_irq() 绑定引脚中断回调函数
rt_pin_irq_enable() 使能引脚中断
rt_pin_detach_irq() 脱离引脚中断回调函数

定义在

  • 头文件:components/drivers/include/drivers/pin.h
  • 源文件:components/drivers/misc/pin.c

上述 API 的用法这里就不介绍了,小伙伴们自己看手册吧~

获取引脚编号

RT-Thread 提供的引脚编号需要和芯片的引脚号区分开来,它们并不是同一个概念,引脚编号由 PIN 设备驱动程序定义,和具体的芯片相关。有 2 种方式可以获取引脚编号:使用宏定义、查看 PIN 驱动文件。

使用宏定义

如果使用 rt-thread/bsp/stm32 目录下的 BSP 则可以使用下面的宏获取引脚编号:

GET_PIN(port, pin)

获取引脚号为 PF9 的 LED0 对应的引脚编号的示例代码如下所示:

#define LED0_PIN  GET_PIN(F, 9)

查看驱动文件

如果使用其他 BSP 则需要查看 PIN 驱动代码 drv_gpio.c 文件确认引脚编号。此文件里有一个数组存放了每个 PIN 脚对应的编号信息,如下所示:

static const struct pin_index pins[] =
{
#if defined(GPIOA)
    __STM32_PIN(0 ,  A, 0 ),
    __STM32_PIN(1 ,  A, 1 ),
    __STM32_PIN(2 ,  A, 2 ),
    __STM32_PIN(3 ,  A, 3 ),
    __STM32_PIN(4 ,  A, 4 ),
    __STM32_PIN(5 ,  A, 5 ),
    ...
}

__STM32_PIN(0 , A, 0 ) 为例,前面的 0 为 RT-Thread 使用的引脚编号,A 为端口号,后面的 0 为引脚号,所以 PA0 对应的引脚编号为 0。

示例代码

说明

示例代码的主要步骤如下:

  1. 设置 LED2 对应引脚为输出模式,并给一个默认的低电平状态;
  2. 设置 USER 按键对应引脚为输入模式,然后绑定中断回调函数并使能中断;
  3. 按下 USER 按键切换 LED2 的亮灭状态。

电路

LED 部分电路原理图,连接到 STM32 的 PA5 引脚。

在这里插入图片描述

USER KEY 部分电路原理图,连接到 STM32 的 PC13 引脚。

在这里插入图片描述

代码

applications/user_key_sample.c 代码

#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>

#define LED2_PIN        GET_PIN(A, 5)
#define USER_BTN_PIN    GET_PIN(C, 13)

void user_key_isr(void *args)
{
	rt_kprintf("key pressed\n");
	rt_pin_write(LED2_PIN, !rt_pin_read(LED2_PIN));
}

static int user_key_sample(void)
{
	rt_pin_mode(LED2_PIN, PIN_MODE_OUTPUT);
	rt_pin_write(LED2_PIN, PIN_LOW);

	rt_pin_mode(USER_BTN_PIN, PIN_MODE_INPUT_PULLUP);
	rt_pin_attach_irq(USER_BTN_PIN, PIN_IRQ_MODE_FALLING, user_key_isr, RT_NULL);
	rt_pin_irq_enable(USER_BTN_PIN, PIN_IRQ_ENABLE);

	return 0;
}
//MSH_CMD_EXPORT(user_key_sample, user key sample);
INIT_DEVICE_EXPORT(user_key_sample);

在 applications/SConscript 中添加 user_key_sample.c

import rtconfig
from building import *

cwd     = GetCurrentDir()
CPPPATH = [cwd, str(Dir('#'))]
src     = Split("""
main.c
user_key_sample.c
""")

group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH)

Return('group')

执行 scons 编译,将目标文件下载到 STM32。大功告成!

发布了299 篇原创文章 · 获赞 1219 · 访问量 159万+

猜你喜欢

转载自blog.csdn.net/luckydarcy/article/details/95460795