IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> I/O 设备模型-3 -> 正文阅读

[嵌入式]I/O 设备模型-3

目录

1、ADC

1.1、访问ADC设备接口

1.1.1、rt_adc_enable()函数

1.1.2、rt_adc_disable()函数

1.1.3、rt_adc_read()函数

1.1.4、rt_adc_voltage()函数

1.2、ADC设备管理接口

1.2.1、rt_hw_adc_register()函数

1.2.2、_adc_read()函数

1.2.3、_adc_control()函数

1.3、ADC底层实现接口

2、DAC

2.1、访问DAC设备接口

2.1.1、rt_dac_enable()函数

2.1.2、rt_dac_disable()函数

2.1.3、rt_dac_write()函数

2.2、DAC设备管理接口

2.2.1、rt_hw_dac_register()函数

2.2.2、_dac_write()函数

2.2.3、_dac_control()函数

2.3、DAC底层实现接口

3、HWTIMER

3.1、HWTIMER设备管理接口

3.1.1、rt_device_hwtimer_register()函数

3.1.2、rt_hwtimer_init()函数

3.1.3、rt_hwtimer_open()函数

3.1.4、rt_hwtimer_close()函数

3.1.5、rt_hwtimer_read()函数

3.1.6、rt_hwtimer_write()函数

3.1.7、rt_hwtimer_control()函数

3.2、HWTIMER底层实现接口

3.2.1、rt_device_hwtimer_isr()函数

3.4、超时计算算法

4、WATCHDOG

4.1、HWTIMER设备管理接口

4.1.1、rt_hw_watchdog_register()函数

4.1.2、rt_watchdog_init()函数

4.1.3、rt_watchdog_open()函数

4.1.4、rt_watchdog_close()函数

4.1.5、rt_watchdog_control()函数

4.2、WATCHDOG底层实现接口

5、PWM

5.1、访问PWM设备接口

5.1.1、rt_pwm_enable()函数

5.1.2、rt_pwm_disable()函数

5.1.3、rt_pwm_set()函数

5.1.4、rt_pwm_set_period()函数

5.1.5、rt_pwm_set_pulse()函数

5.1.6、rt_pwm_get()函数

5.2、PWM设备管理接口

5.2.1、rt_device_pwm_register()函数

5.2.2、_pwm_read()函数

5.2.3、_pwm_write()函数

5.2.4、_pwm_control()函数

5.3、PWM底层实现接口


1、ADC

ADC使用了设备模型的I/O 设备管理层、设备驱动框架层、设备驱动层

1.1、访问ADC设备接口

1.1.1、rt_adc_enable()函数

该接口用于使能ADC设备。最终会调用设备驱动层注册的enabled()函数使能设备。

rt_err_t rt_adc_enable(rt_adc_device_t dev, rt_uint32_t channel)

1.1.2、rt_adc_disable()函数

该接口用于禁用ADC设备。最终会调用设备驱动层注册的enabled()函数禁用设备。

rt_err_t rt_adc_disable(rt_adc_device_t dev, rt_uint32_t channel)

1.1.3、rt_adc_read()函数

该接口用于读取ADC值。最终会调用设备驱动层注册的convert()函数禁用设备。

rt_uint32_t rt_adc_read(rt_adc_device_t dev, rt_uint32_t channel)

1.1.4、rt_adc_voltage()函数

该接口用于读取ADC电压值(基于ADC值、基准电压、分辨率进行换算得出)。

rt_int16_t rt_adc_voltage(rt_adc_device_t dev, rt_uint32_t channel)

1.2、ADC设备管理接口

1.2.1、rt_hw_adc_register()函数

该接口用于注册ADC设备。

设备函数应用框架函数实现
read()_adc_read()
control()_adc_control()
rt_err_t rt_hw_adc_register(rt_adc_device_t device, const char *name, const struct rt_adc_ops *ops, const void *user_data)

1.2.2、_adc_read()函数

设备read()接口实现。pos参数无效;buffer类型为rt_uint32_t数组,用于保存读取到的ADC值;size为buffer数组大小。

static rt_size_t _adc_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size)

1.2.3、_adc_control()函数

设备control()接口实现。

cmdargs说明
RT_ADC_CMD_ENABLE通道号,类型为rt_uint32_t最终会调用设备驱动层注册的enabled()函数使能设备
RT_ADC_CMD_DISABLE通道号,类型为rt_uint32_t最终会调用设备驱动层注册的enabled()函数禁用设备
RT_ADC_CMD_GET_RESOLUTION用于保存分辨率值,类型为rt_uint8_t最终会调用设备驱动层注册的get_resolution()函数获取分辨率
RT_ADC_CMD_GET_VREF用于保存基准电压值,类型为rt_int16_t最终会调用设备驱动层注册的get_vref()函数获取基准电压
static rt_err_t _adc_control(rt_device_t dev, int cmd, void *args)

1.3、ADC底层实现接口

此部分由底层驱动实现!

struct rt_adc_ops
{
    rt_err_t (*enabled)(struct rt_adc_device *device, rt_uint32_t channel, rt_bool_t enabled);
    rt_err_t (*convert)(struct rt_adc_device *device, rt_uint32_t channel, rt_uint32_t *value);
    rt_uint8_t (*get_resolution)(struct rt_adc_device *device);
    rt_int16_t (*get_vref) (struct rt_adc_device *device);
};

2、DAC

DAC使用了设备模型的I/O 设备管理层、设备驱动框架层、设备驱动层

struct rt_dac_device
{
    struct rt_device parent;
    const struct rt_dac_ops *ops;
};
typedef struct rt_dac_device *rt_dac_device_t;

2.1、访问DAC设备接口

2.1.1、rt_dac_enable()函数

该接口用于使能DAC设备。最终会调用设备驱动层注册的enabled()函数使能设备。

rt_err_t rt_dac_enable(rt_dac_device_t dev, rt_uint32_t channel)

2.1.2、rt_dac_disable()函数

该接口用于禁用DAC设备。最终会调用设备驱动层注册的disabled()函数禁用设备。

rt_err_t rt_dac_disable(rt_dac_device_t dev, rt_uint32_t channel)

2.1.3、rt_dac_write()函数

该接口用于设置DAC通道输出值。最终会调用设备驱动层注册的convert()函数。

rt_err_t rt_dac_write(rt_dac_device_t dev, rt_uint32_t channel, rt_uint32_t value)

2.2、DAC设备管理接口

2.2.1、rt_hw_dac_register()函数

该接口用于注册DAC设备。

设备函数应用框架函数实现
write()_dac_write()
control()_dac_control()
rt_err_t rt_hw_dac_register(rt_dac_device_t device, const char *name, const struct rt_dac_ops *ops, const void *user_data)

2.2.2、_dac_write()函数

设备write()接口实现。pos参数无效;buffer类型为rt_uint32_t数组,用于保存需要设置的DAC值;size为buffer数组大小。

static rt_size_t _dac_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size)

2.2.3、_dac_control()函数

设备control()接口实现。

cmdargs说明
RT_DAC_CMD_ENABLE通道号,类型为rt_uint32_t最终会调用设备驱动层注册的enabled()函数使能设备
RT_DAC_CMD_DISABLE通道号,类型为rt_uint32_t最终会调用设备驱动层注册的disabled()函数禁用设备
RT_DAC_CMD_GET_RESOLUTION用于保存分辨率值类型为rt_uint8_t最终会调用设备驱动层注册的get_resolution()函数
static rt_err_t _dac_control(rt_device_t dev, int cmd, void *args)

2.3、DAC底层实现接口

此部分由底层驱动实现!

struct rt_dac_ops
{
    rt_err_t (*disabled)(struct rt_dac_device *device, rt_uint32_t channel);
    rt_err_t (*enabled)(struct rt_dac_device *device, rt_uint32_t channel);
    rt_err_t (*convert)(struct rt_dac_device *device, rt_uint32_t channel, rt_uint32_t *value);
    rt_uint8_t (*get_resolution)(struct rt_dac_device *device);
};

3、HWTIMER

HWTIMER使用了设备模型的I/O 设备管理层、设备驱动层

定时器设备框架内部会自动处理硬件定时器超时的问题。例如16位定时器在1MHz的频率下最大只能维持65.535ms。但是在定时器框架下,用户可以将定时器的溢出时间设置为例如500ms,框架内部会自动处理硬件溢出问题。当时间达到500ms后,框架会调用用户预先设置好的回调函数。

struct rt_hwtimer_info
{
    rt_int32_t maxfreq;    /* the maximum count frequency timer support */
    rt_int32_t minfreq;    /* the minimum count frequency timer support */
    rt_uint32_t maxcnt;    /* counter maximum value */
    rt_uint8_t  cntmode;   /* count mode (inc/dec) */
};

typedef struct rt_hwtimer_device
{
    struct rt_device parent;
    const struct rt_hwtimer_ops *ops;
    const struct rt_hwtimer_info *info;

    rt_int32_t freq;                /* counting frequency set by the user */
    rt_int32_t overflow;            /* timer overflows */
    float period_sec;
    rt_int32_t cycles;              /* how many times will generate a timeout event after overflow */
    rt_int32_t reload;              /* reload cycles(using in period mode) */
    rt_hwtimer_mode_t mode;         /* timing mode(oneshot/period) */
} rt_hwtimer_t;

3.1、HWTIMER设备管理接口

3.1.1、rt_device_hwtimer_register()函数

该接口用于注册HWTIMER设备。

设备函数应用框架函数实现
init()rt_hwtimer_init()
open()rt_hwtimer_open()
close()rt_hwtimer_close()
read()rt_hwtimer_read()
write()rt_hwtimer_write()
control()rt_hwtimer_control()
rt_err_t rt_device_hwtimer_register(rt_hwtimer_t *timer, const char *name, void *user_data)

3.1.2、rt_hwtimer_init()函数

设备init()接口实现。初始化hwtimer。最终会调用设备驱动层注册的init()函数。

static rt_err_t rt_hwtimer_init(struct rt_device *dev)

3.1.3、rt_hwtimer_open()函数

设备open()接口实现。打开hwtimer。最终会调用设备驱动层注册的control()函数,cmd为HWTIMER_CTRL_FREQ_SET。

static rt_err_t rt_hwtimer_open(struct rt_device *dev, rt_uint16_t oflag)

3.1.4、rt_hwtimer_close()函数

设备close()接口实现。关闭hwtimer。最终会调用设备驱动层注册的init()函数。

static rt_err_t rt_hwtimer_close(struct rt_device *dev)

3.1.5、rt_hwtimer_read()函数

设备read()接口实现。获取自定时器开始 (rt_device_write) 之后的运行时。最终会调用设备驱动层注册的count_get()函数。参数pos无效;参数buffer保存读取到的时间值,类型为rt_hwtimerval_t。参数size是buffer的大小。

static rt_size_t rt_hwtimer_read(struct rt_device *dev, rt_off_t pos, void *buffer, rt_size_t size)

3.1.6、rt_hwtimer_write()函数

设备write()接口实现。先调用设备驱动层注册的stop()函数,再调用设备驱动层注册的start()函数。参数pos无效;参数buffer为要设置的定时时间,类型为rt_hwtimerval_t;size为buffer的大小。

static rt_size_t rt_hwtimer_write(struct rt_device *dev, rt_off_t pos, const void *buffer, rt_size_t size)

3.1.7、rt_hwtimer_control()函数

设备control()接口实现。

cmdargs说明
HWTIMER_CTRL_STOP/最终会调用设备驱动层注册的stop()函数。
HWTIMER_CTRL_FREQ_SET类型为rt_uint32_t最终会调用设备驱动层注册的control()函数。
HWTIMER_CTRL_INFO_GET保存定时器信息。类型为rt_hwtimer_info获取定时器信息
HWTIMER_CTRL_MODE_SET定时器模式。类型为rt_hwtimer_mode_t

设置定时器模式。HWTIMER_MODE_ONESHOT、

HWTIMER_MODE_PERIOD

static rt_err_t rt_hwtimer_control(struct rt_device *dev, int cmd, void *args)

3.2、HWTIMER底层实现接口

此部分由底层驱动实现!

struct rt_hwtimer_ops
{
    void (*init)(struct rt_hwtimer_device *timer, rt_uint32_t state);
    rt_err_t (*start)(struct rt_hwtimer_device *timer, rt_uint32_t cnt, rt_hwtimer_mode_t mode);
    void (*stop)(struct rt_hwtimer_device *timer);
    rt_uint32_t (*count_get)(struct rt_hwtimer_device *timer);
    rt_err_t (*control)(struct rt_hwtimer_device *timer, rt_uint32_t cmd, void *args);
};

3.2.1、rt_device_hwtimer_isr()函数

硬件定时器中断。定时器单次定时超时,调用设备驱动层注册的stop()函数停止定时器。

若存在rx_indicate回调函数则调用。

void rt_device_hwtimer_isr(rt_hwtimer_t *timer)

3.4、超时计算算法

该算法的核心思想在于,计算出最合适的counter!!! 例如freq为1000000,maxcnt为1000,定时时间5000us。通过此算法计算得出counter等于625,cycles等于8。

rt_inline rt_uint32_t timeout_calc(rt_hwtimer_t *timer, rt_hwtimerval_t *tv)

4、WATCHDOG

WATCHDOG使用了设备模型的I/O 设备管理层、设备驱动层

struct rt_watchdog_device
{
    struct rt_device parent;
    const struct rt_watchdog_ops *ops;
};
typedef struct rt_watchdog_device rt_watchdog_t;

4.1、HWTIMER设备管理接口

4.1.1、rt_hw_watchdog_register()函数

该接口用于注册WATCHDOG设备。

设备函数应用框架函数实现
init()rt_watchdog_init()
open()rt_watchdog_open()
close()rt_watchdog_close()
control()rt_watchdog_control()
rt_err_t rt_hw_watchdog_register(struct rt_watchdog_device *wtd,
                                 const char                *name,
                                 rt_uint32_t                flag,
                                 void                      *data)

4.1.2、rt_watchdog_init()函数

设备init()接口实现。初始化watchdog。最终会调用设备驱动层注册的init()函数。

static rt_err_t rt_watchdog_init(struct rt_device *dev)

4.1.3、rt_watchdog_open()函数

设备open()接口实现。打开watchdog。当前版本直接返回RT_EOK。

static rt_err_t rt_watchdog_open(struct rt_device *dev, rt_uint16_t oflag)

4.1.4、rt_watchdog_close()函数

设备close()接口实现。关闭watchdog。调用设备驱动层注册的control()函数,cmd为RT_DEVICE_CTRL_WDT_STOP。

static rt_err_t rt_watchdog_close(struct rt_device *dev)

4.1.5、rt_watchdog_control()函数

设备control()接口实现。控制watchdog。调用设备驱动层注册的control()函数。cmd

cmdargs说明
RT_DEVICE_CTRL_WDT_GET_TIMEOUT类型为rt_uint32_t获取超时,单位秒
RT_DEVICE_CTRL_WDT_SET_TIMEOUT类型为rt_uint32_t设置超时,单位秒
RT_DEVICE_CTRL_WDT_GET_TIMELEFT类型为rt_uint32_t获取重启剩余时间,单位秒
RT_DEVICE_CTRL_WDT_KEEPALIVE/喂狗
RT_DEVICE_CTRL_WDT_START/开启定时器
RT_DEVICE_CTRL_WDT_STOP/关闭定时器
static rt_err_t rt_watchdog_control(struct rt_device *dev,
                                    int              cmd,
                                    void             *args)

4.2、WATCHDOG底层实现接口

此部分由底层驱动实现!

struct rt_watchdog_ops
{
    rt_err_t (*init)(rt_watchdog_t *wdt);
    rt_err_t (*control)(rt_watchdog_t *wdt, int cmd, void *arg);
};

5、PWM

struct rt_device_pwm
{
    struct rt_device parent;
    const struct rt_pwm_ops *ops;
};

5.1、访问PWM设备接口

5.1.1、rt_pwm_enable()函数

该接口用于使能PWM设备。调用设备驱动层注册的control()函数,cmd为PWM_CMD_ENABLE。

rt_err_t rt_pwm_enable(struct rt_device_pwm *device, int channel)

5.1.2、rt_pwm_disable()函数

该接口用于禁用PWM设备。调用设备驱动层注册的control()函数,cmd为PWM_CMD_DISABLE。

rt_err_t rt_pwm_disable(struct rt_device_pwm *device, int channel)

5.1.3、rt_pwm_set()函数

该接口用于设置PWM周期和占空比。调用设备驱动层注册的control()函数,cmd为PWM_CMD_SET。

rt_err_t rt_pwm_set(struct rt_device_pwm *device, int channel, rt_uint32_t period, rt_uint32_t pulse)

5.1.4、rt_pwm_set_period()函数

该接口用于设置PWM周期。调用设备驱动层注册的control()函数,cmd为PWM_CMD_SET_PERIOD。

rt_err_t rt_pwm_set_period(struct rt_device_pwm *device, int channel, rt_uint32_t period)

5.1.5、rt_pwm_set_pulse()函数

该接口用于设置PWM占空比。调用设备驱动层注册的control()函数,cmd为PWM_CMD_SET_PULSE。

rt_err_t rt_pwm_set_pulse(struct rt_device_pwm *device, int channel, rt_uint32_t pulse)

5.1.6、rt_pwm_get()函数

该接口用于获取PWM信息。调用设备驱动层注册的control()函数,cmd为PWM_CMD_GET。

rt_err_t rt_pwm_get(struct rt_device_pwm *device, struct rt_pwm_configuration *cfg)

5.2、PWM设备管理接口

5.2.1、rt_device_pwm_register()函数

该接口用于注册PWM设备。

设备函数应用框架函数实现
read()_pwm_read()
write()_pwm_write()
control()_pwm_control()
rt_err_t rt_device_pwm_register(struct rt_device_pwm *device, const char *name, const struct rt_pwm_ops *ops, const void *user_data)

5.2.2、_pwm_read()函数

设备read()接口实现。读取PWM的pulse最终会调用设备驱动层注册的control()函数,cmd为PWM_CMD_GET。参数pos是要读取的通道;参数buffer为要保存的pulse,类型为rt_uint32_t。参数size只能设置为sizeof(rt_uint32_t),用于通过返回值判断是否成功读取pulse。

static rt_size_t _pwm_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size)

5.2.3、_pwm_write()函数

设备write()接口实现。写入PWM的pulse。最终会调用设备驱动层注册的control()函数,cmd为PWM_CMD_SET。参数pos是要写入的通道;参数buffer为要写入的pulse,类型为rt_uint32_t。参数size只能设置为sizeof(rt_uint32_t),用于通过返回值判断是否成功写入pulse。

static rt_size_t _pwm_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size)

5.2.4、_pwm_control()函数

设备control()接口实现。控制PWM。最终会调用设备驱动层注册的control()函数.

cmdargs说明
PWM_CMD_ENABLErt_pwm_configuration结构体使能PWM
PWM_CMD_DISABLE禁用PWM
PWMN_CMD_ENABLE使能PWM互补
PWMN_CMD_DISABLE禁用PWM互补
PWM_CMD_SET设置PWM占空比和周期
PWM_CMD_GET获取PWM信息
PWM_CMD_SET_PERIOD设置PWM周期
PWM_CMD_SET_PULSE设置PWM占空比
static rt_err_t _pwm_control(rt_device_t dev, int cmd, void *args)

5.3、PWM底层实现接口

此部分由底层驱动实现!

struct rt_pwm_ops
{
    rt_err_t (*control)(struct rt_device_pwm *device, int cmd, void *arg);
};

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-10-08 20:58:04  更:2022-10-08 20:58:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/28 2:33:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计