目录
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()接口实现。
cmd | args | 说明 | 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()接口实现。
cmd | args | 说明 | 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()接口实现。
cmd | args | 说明 | 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
cmd | args | 说明 | 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()函数.
cmd | args | 说明 | PWM_CMD_ENABLE | rt_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);
};
|