[rtthread设备]系列文章
【rtthread设备】第零篇:IO设备
【rtthread设备】第一篇:pin设备
【rtthread设备】第二篇:rtc设备
【rtthread设备】第三篇:adc设备
【rtthread设备】第五篇:hwtimer设备
【rtthread设备】第六篇:i2c设备
【rtthread设备】第七篇:spi设备
【rtthread设备】第八篇:看门狗设备
一、pin设备概念
rtthread根据引脚编号访问硬件的引脚和设置外部中断。
二、pin设备api
rtthread根据编号访问硬件的引脚,在stm32中通过宏GET_PIN(port,pin)获取引脚编号,之后可以
- 设置引脚模式
- 读写引脚
- 设置引脚中断回调
- 使/失能引脚中断
//获取pin编号
GET_PIN(port, pin)
//设置引脚模式
/*
pin:引脚编号
mode:模式,可取
#define PIN_MODE_OUTPUT 0x00 /* 输 出 */
#define PIN_MODE_INPUT 0x01 /* 输 入 */
#define PIN_MODE_INPUT_PULLUP 0x02 /* 上 拉 输 入 */
#define PIN_MODE_INPUT_PULLDOWN 0x03 /* 下 拉 输 入 */
#define PIN_MODE_OUTPUT_OD 0x04 /* 开 漏 输 出 */
*/
void rt_pin_mode(rt_base_t pin, rt_base_t mode);
//设置引脚电平
/*
pin:引脚编号
value:设置电平值,可取PIN_LOW、PIN_HIGH
*/
void rt_pin_write(rt_base_t pin, rt_base_t value);
//读取引脚电平
/*
pin:引脚编号
*/
int rt_pin_read(rt_base_t pin);
//引脚绑定中断回调
/*
pin:引脚编号
mode:中断触发模式,可取
#define PIN_IRQ_MODE_RISING 0x00 /* 上 升 沿 触 发 */
#define PIN_IRQ_MODE_FALLING 0x01 /* 下 降 沿 触 发 */
#define PIN_IRQ_MODE_RISING_FALLING 0x02 /* 边 沿 触 发 (上 升 沿 和 下 降 沿 都 触 发 ) */
#define PIN_IRQ_MODE_HIGH_LEVEL 0x03 /* 高 电 平 触 发 */
#define PIN_IRQ_MODE_LOW_LEVEL 0x04 /* 低 电 平 触 发 */
hdr:中断回调函数
args:中断回调函数参数
*/
rt_err_t rt_pin_attach_irq(rt_int32_t pin,
rt_uint32_t mode,
void (*hdr)(void *args),
void *args);
//使能中断引脚
/*
pin:引脚编号
enabled:使/失能,可取PIN_IRQ_ENABLE、PIN_IRQ_DISABLE
*/
rt_err_t rt_pin_irq_enable(rt_base_t pin, rt_uint32_t enabled);
//引脚脱离中断
/*
pin:引脚编号
*/
rt_err_t rt_pin_detach_irq(rt_int32_t pin);
三、pin设备示例
/*
* Copyright (c) 2006-2018, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2018-08-15 misonyo first implementation.
*/
/*
* 程序清单:这是一个 PIN 设备使用例程
* 例程导出了 pin_beep_sample 命令到控制终端
* 命令调用格式:pin_beep_sample
* 程序功能:通过按键控制蜂鸣器对应引脚的电平状态控制蜂鸣器
*/
#include <rtthread.h>
#include <rtdevice.h>
/* 引脚编号,通过查看驱动文件drv_gpio.c确定 */
#ifndef BEEP_PIN_NUM
#define BEEP_PIN_NUM 35 /* PB0 */
#endif
#ifndef KEY0_PIN_NUM
#define KEY0_PIN_NUM 55 /* PD8 */
#endif
#ifndef KEY1_PIN_NUM
#define KEY1_PIN_NUM 56 /* PD9 */
#endif
void beep_on(void *args)
{
rt_kprintf("turn on beep!\n");
rt_pin_write(BEEP_PIN_NUM, PIN_HIGH);
}
void beep_off(void *args)
{
rt_kprintf("turn off beep!\n");
rt_pin_write(BEEP_PIN_NUM, PIN_LOW);
}
static void pin_beep_sample(void)
{
/* 蜂鸣器引脚为输出模式 */
rt_pin_mode(BEEP_PIN_NUM, PIN_MODE_OUTPUT);
/* 默认低电平 */
rt_pin_write(BEEP_PIN_NUM, PIN_LOW);
/* 按键0引脚为输入模式 */
rt_pin_mode(KEY0_PIN_NUM, PIN_MODE_INPUT_PULLUP);
/* 绑定中断,上升沿模式,回调函数名为beep_on */
rt_pin_attach_irq(KEY0_PIN_NUM, PIN_IRQ_MODE_FALLING, beep_on, RT_NULL);
/* 使能中断 */
rt_pin_irq_enable(KEY0_PIN_NUM, PIN_IRQ_ENABLE);
/* 按键1引脚为输入模式 */
rt_pin_mode(KEY1_PIN_NUM, PIN_MODE_INPUT_PULLUP);
/* 绑定中断,上升沿模式,回调函数名为beep_off */
rt_pin_attach_irq(KEY1_PIN_NUM, PIN_IRQ_MODE_FALLING, beep_off, RT_NULL);
/* 使能中断 */
rt_pin_irq_enable(KEY1_PIN_NUM, PIN_IRQ_ENABLE);
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(pin_beep_sample, pin beep sample);