【rtthread设备】第一篇:pin设备

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

Guess you like

Origin blog.csdn.net/weixin_43810563/article/details/116813139