什么食物含铅| 幽门螺杆菌阳性是什么意思| 肺五行属什么| 陕西有什么烟| prn是什么医嘱| 心肌病是什么病| rl是什么单位| 无语凝噎是什么意思| h2ra 是什么药物| 去医院看心理挂什么科| u是什么单位| 什么是礼仪| 直接胆红素偏高是什么原因| 39年属什么生肖| 天喜星是什么意思| 右边腰疼是什么原因| 大枣吃多了有什么危害| cos代表什么意思| 为什么老是头晕| 吃什么饭| 梦见手抓屎是什么意思| 小孩铅过高有什么症状| 5月19日什么星座| 罢黜百家独尊儒术是什么意思| 考号是什么| 失眠多梦吃什么药效果最好| 21什么意思| 出色的什么| 是否是什么意思| 甲低有什么症状表现| 表达什么意思| 拐子是什么意思| 有点尿血是什么原因| 较前相仿是什么意思| 大姨妈来了吃什么水果好| 撒尿分叉是什么原因| 胸口有痣代表什么意思| 中暑发烧吃什么药| 称心如意是什么意思| 抗甲状腺球蛋白抗体高是什么意思| 想吃辣的是什么原因| 三无产品指的是什么| 茱萸是什么植物| 什么颜色加什么颜色等于黑色| 小便次数多是什么原因| 十年是什么婚| 就不告诉你就不告诉你是什么儿歌| 海鲜配啤酒有什么反应| 双重人格是什么意思| 多喝酸奶有什么好处| 1935年属什么生肖| 最近我和你都有一样的心情什么歌| 兔子吃什么| 指什么为什么| 象代表什么生肖| 冰冻三尺非一日之寒是什么意思| 胃不舒服可以吃什么水果| 肚子老是疼是什么原因| 十灵日是什么意思| 花生什么时候种| 米黄是什么颜色| 吃什么最补血| 什么病可以申请低保| 黄豆可以和什么一起打豆浆| 吃什么药| 稀松平常是什么意思| 谢邀什么意思| 什么是气短| 临界点是什么意思| 十九畏是什么意思| 乳腺增生应该注意些什么| 转氨酶高有什么症状| 银杏叶片治什么病| 孕妇白细胞高是什么原因| 梦见和婆婆吵架是什么意思| 朝奉是什么意思| 阴道杆菌是什么意思| 神经内科主要看什么病| 为什么会有眼袋| 肠胃胀气吃什么药| 阴霾是什么意思| dpm是什么意思| 地球属于什么星系| 无纺布是什么材料做的| 小肚子胀是什么原因| 胖头鱼又叫什么鱼| 脂肪肝吃什么药| 安罗替尼适合什么肿瘤| 煮红枣为什么有白色的漂浮物| 为什么歌曲| 雷暴是什么意思| 骨折吃什么药恢复快| 腋臭是什么原因引起的| 宝鸡以前叫什么| 耳石症是什么引起的| 办健康证需要检查什么| 80年出生属什么生肖| 什么食物铅含量高| 除湿气吃什么好| 肌层回声不均匀是什么意思| 茧子是什么意思| 乳腺增生吃什么药最好| 书到用时方恨少什么意思| 吴亦凡属什么生肖| 慢性胃炎吃什么药| 癫是什么意思| 壁虎是什么类动物| 牙龈发炎是什么原因引起的| 人造革是什么材质| 弯了是什么意思| 4月份是什么季节| 手指关节疼痛是什么原因| 似是而非是什么意思| 手没有力气是什么原因| uv是什么意思| 反社会人格有什么表现| 2001年是什么命| 做核磁共振需要注意什么| 孕妇为什么要躲着白事| 前列腺穿刺是什么意思| 肋骨骨折什么症状| 腰痛是什么原因| 初级会计考什么科目| 眼睛浮肿是什么原因| 家庭是什么| 兜兜转转是什么意思| 娘酒是什么酒| 什么鱼适合做酸菜鱼| 1987年出生属什么| 跟腱炎吃什么药| 慢生活是什么意思| 口诀是什么意思| zxj是什么意思| 颈椎钙化是什么意思| 经常头疼挂什么科| 拉肚子可以吃什么菜| 为什么喜欢秋天| amo是什么意思| 玛卡和什么搭配壮阳效果最佳| tap什么意思| 什么叫高脂血症| 早上起来手麻是什么原因| 腹股沟淋巴结肿大是什么原因| 合卺是什么意思| 黄什么什么| 紫癜是什么病| 心思重是什么意思| 狐臭是什么原因| 病理会诊是什么意思| shy是什么意思| 胃充盈欠佳是什么意思| o是什么牌子| eland是什么牌子| 减肥最快的方法是什么| median什么意思| 什么什么不什么| 中药吃多了对人体有什么伤害| 牛肉可以炖什么| 日落是什么时辰| 狮子座前面是什么星座| 血精和精囊炎吃什么药| 男人补肾吃什么好| 甘蓝是什么| 置换什么意思| 吞咽困难挂什么科| 粗枝大叶是什么意思| 小儿多动症挂什么科| 类风湿不能吃什么东西| 妇科检查bv是什么意思| 吃什么开胃| 脾疼是什么原因| 大便培养是检查什么的| 夏天什么花开| 真菌感染皮肤病用什么药最好| 阴盛阳衰什么意思| 生长痛是什么| 尿血应该挂什么科| 肉芽肿是什么病| 白腊金是什么意思| 流星雨是什么意思| 肾轻度积水是什么意思| 血压高不能吃什么食物| 振水音阳性提示什么| 枯草芽孢杆菌治什么病| 家里养什么花最好| 脑瘤是什么原因引起的| 妊娠囊是什么意思| 怦然心动什么意思| 补肾壮阳吃什么药好| 大白刁是什么鱼| 母婴传播是什么意思| 吃什么食物对肠胃好| 查甲状腺应该挂什么科| 舌面上有裂纹是什么病| 水样分泌物是什么炎症| 中国的八大菜系是什么| 我知道你在想什么| 加味逍遥丸和逍遥丸有什么区别| 什么叫室性早搏| 2006属狗的五行缺什么| 小孩上火了吃什么降火最快| 小孩记忆力差什么原因| 胃经当令是什么时辰| rog是什么牌子| 3s是什么意思| 鳖吃什么食物| 怀孕是什么感觉| baby是什么意思| 淄博有什么大学| 田字出头是什么字| 痤疮涂什么药膏| 脑死亡是什么意思| 什么情况属于诈骗| 什么拉车连蹦带跳| 茯苓是什么东西| 痔疮为什么不建议手术| 步履维艰是什么意思| 人突然晕倒是什么原因引起的| lhc是什么意思| 阳萎吃什么药| 经常喝柠檬水有什么好处和坏处| 什么是生育津贴| 宝宝咬人是什么原因| 皮肤黑穿什么颜色好看| 观音菩萨的坐骑是什么| 开尔文是什么单位| neighborhood什么意思| 杞子配什么增强性功能| 肚子发胀是什么原因| 女性腰疼应该挂什么科| 结婚32年是什么婚| 气溶胶传播是什么意思| 流莺是什么意思| 脸上出油多是什么原因| 地铁和高铁有什么区别| 田七与三七有什么区别| 动脉硬化用什么药好| 抗hbc阳性是什么意思| 胃出血挂什么科室| 企鹅是什么意思| 偏头疼是什么原因| 小腿疼是什么原因| 双鱼座的上升星座是什么| 喝中药不能吃什么食物| 男人遗精是什么原因| 小孩晚上睡觉发梦癫什么原因| 儿童脾胃不好吃什么调理脾胃| 寒碜是什么意思| 五彩的什么| 放浪形骸是什么意思| 下雨天适合穿什么衣服| 977是什么意思| pe什么意思| 肆虐是什么意思| 孕酮代表什么| 浅蓝色配什么颜色好看| 王晶为什么不娶邱淑贞| 脚干裂用什么药膏| 为什么会流鼻血| 胎毛什么时候剃最好| 梦见家里死人了代表什么预兆| 心肌缺血是什么原因| 什么的口罩| 骨头坏死是什么原因造成的| 百度
这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 ? 论坛首页 ? 嵌入式开发 ? 软件与操作系统 ? rtthread DAC框架分析

共1条 1/1 1 跳转至

rtthread DAC框架分析

高工
2025-08-04 23:44:44   被打赏 50 分(兑奖)     打赏
百度 用户注册是报考人员进行资格考试报名时必备的环节,只有注册成功后才能进行网上报名。

后面的驱动适配的分析,基本上都按照RTT对接驱动的框架分析,瑞萨已适配框架代码分析,以及启明6M5适配驱动模块的顺序去看。之所以这么操作,是因为从上至下看接口,能够对框架的设计思路有更深的理解,也能更好的梳理出适配新平台时的操作模板。

RTT的DAC框架

RTT DAC框架的源码位于:\components\drivers\misc\dac.c

由于ADC和DAC本质上是一类设备,因此个人认为,从暴露的接口上,dac和adc都应该是一致的,除了ADC是读电压值,DAC是设置电压值以外。

暴露给驱动的接口

DAC注册接口

#ifdef RT_USING_DEVICE_OPS
const static struct rt_device_ops dac_ops =
{
    RT_NULL,
    RT_NULL,
    RT_NULL,
    RT_NULL,
    _dac_write,
    _dac_control,
};
#endif

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)
{
    rt_err_t result = RT_EOK;
    RT_ASSERT(ops != RT_NULL && ops->convert != RT_NULL);

    device->parent.type = RT_Device_Class_DAC;
    device->parent.rx_indicate = RT_NULL;
    device->parent.tx_complete = RT_NULL;

#ifdef RT_USING_DEVICE_OPS
    device->parent.ops         = &dac_ops;
#else
    device->parent.init        = RT_NULL;
    device->parent.open        = RT_NULL;
    device->parent.close       = RT_NULL;
    device->parent.read        = RT_NULL;
    device->parent.write       = _dac_write;
    device->parent.control     = _dac_control;
#endif
    device->ops = ops;
    device->parent.user_data = (void *)user_data;

    result = rt_device_register(&device->parent, name, RT_DEVICE_FLAG_RDWR);

    return result;
}

从注册接口上看,DAC的设计逻辑确实和ADC设计逻辑一致。唯一的区别是,DAC是写,ADC是读。

按框架暴露给应用的接口

DAC写接口

static rt_ssize_t _dac_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size)
{
    rt_err_t result = RT_EOK;
    rt_size_t i;
    struct rt_dac_device *dac = (struct rt_dac_device *)dev;
    rt_uint32_t *value = (rt_uint32_t *)buffer;

    for (i = 0; i < size; i += sizeof(int))
    {
        result = dac->ops->convert(dac, pos + i, value);
        if (result != RT_EOK)
        {
            return 0;
        }
        value++;
    }

    return i;
}

和ADC类似,DAC也可以实现同一DAC连写多个channel的功能。只是目前自己工作经历上暂未遇到支持一个DAC给多个dac管脚输出不同电压的功能,不确定这种实现是否合理。

DAC控制接口

static rt_err_t _dac_control(rt_device_t dev, int cmd, void *args)
{
    rt_err_t result = -RT_EINVAL;
    rt_dac_device_t dac = (struct rt_dac_device *)dev;

    if (cmd == RT_DAC_CMD_ENABLE && dac->ops->enabled)
    {
        result = dac->ops->enabled(dac, (rt_uint32_t)args);
    }
    else if (cmd == RT_DAC_CMD_DISABLE && dac->ops->enabled)
    {
        result = dac->ops->disabled(dac, (rt_uint32_t)args);
    }
    else if (cmd == RT_DAC_CMD_GET_RESOLUTION && dac->ops->get_resolution)
    {
        rt_uint8_t resolution = dac->ops->get_resolution(dac);
        if(resolution != 0)
        {
            *((rt_uint8_t*)args) = resolution;
            LOG_D("resolution: %d bits", resolution);
            result = RT_EOK;
        }
    }

    return result;
}

不知道为何,对驱动层暴露的接口,开关dac接口变成了两个,一个enable,一个disable。个人理解是,这块最好统一,要么暴露一个enable,通过传参的方式是能或关闭,要么暴露两个接口,不需要传参,否则有编码风格差异的问题。

另外,很遗憾,control层并未要求驱动暴露最大输出电压的接口,这也基本上说明目前的框架,并不能实现应用层直接设置电压的需求。

暴露给应用的接口

rt_dac_write

rt_err_t rt_dac_write(rt_dac_device_t dev, rt_uint32_t channel, rt_uint32_t value)
{
    RT_ASSERT(dev);

    return dev->ops->convert(dev, channel, &value);
}

从接口上来说,这个接口直接向下设置寄存器值,意味着应用层需要知道dac的参考电平,dac的精度才能把电压换算成寄存器值。而我的个人理解为,应用层并不需要关心寄存器值是啥,而是关心设下去的电压值是多少,这部分本就该驱动内部实现的。而在后面的分析中也会发现,dac驱动居然没有对应用实现直接设置电压的接口,这是一个问题点。

rt_dac_enable

rt_err_t rt_dac_enable(rt_dac_device_t dev, rt_uint32_t channel)
{
    rt_err_t result = RT_EOK;

    RT_ASSERT(dev);
    if (dev->ops->enabled != RT_NULL)
    {
        result = dev->ops->enabled(dev, channel);
    }
    else
    {
        result = -RT_ENOSYS;
    }

    return result;
}

这个功能很直观,就是使能dac的某个通道。

rt_dac_disable

rt_err_t rt_dac_disable(rt_dac_device_t dev, rt_uint32_t channel)
{
    rt_err_t result = RT_EOK;

    RT_ASSERT(dev);
    if (dev->ops->disabled != RT_NULL)
    {
        result = dev->ops->disabled(dev, channel);
    }
    else
    {
        result = -RT_ENOSYS;
    }

    return result;
}

同DAC enable,只是这个接口的作用是关闭dac的某个通道。

总结

DAC驱动到此已经分析完毕,遗憾的是,在DAC框架中,并未像ADC那样实现应用层直接设置DAC电压的接口,虽然RTT的官方文档也没推荐应用层直接读ADC电压。因此应用层仅能设置寄存器值,也就导致不同的MCU,还得在应用层自行维护最大输出电压和精度信息,带来的副作用就是,更换MCU,DAC处理部分的应用层程序无法通用,而这可能是一个优化点。






关键词: rtthread     框架     DAC    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]
正印代表什么意思 甲亢是什么原因造成的 流光是什么意思 脖子里面有结节是什么病 口苦口干吃什么药最好
四维是什么意思 血管是什么组织 梦见狼是什么预兆 香港有什么好玩的 胶体金法是什么意思
世界上最深的湖泊是什么 尿潴留是什么症状 五花八门什么意思 阴道放气是什么原因 湿气重什么原因
安慰是什么意思 阴道镜是检查什么的 做彩超为什么要憋尿 2月5号是什么星座 减肥喝什么牛奶
氧化是什么意思hcv9jop0ns2r.cn 什么多腔hcv8jop5ns3r.cn 左脚麻是什么原因hcv9jop1ns0r.cn 花中皇后指的是什么花naasee.com cm是什么岗位hcv8jop4ns4r.cn
一本线是什么意思tiangongnft.com 葛根粉吃了有什么好处hcv7jop9ns1r.cn mlb是什么意思hcv9jop7ns5r.cn 干火重吃什么药管用hcv9jop5ns7r.cn 做梦梦见下大雨是什么意思1949doufunao.com
居高临下是什么意思hcv7jop4ns7r.cn 舌头有红点是什么原因hcv8jop6ns0r.cn yet什么意思hcv7jop7ns1r.cn 尿等待吃什么药最好wuhaiwuya.com 什么人生病从来不看医生naasee.com
上分是什么意思hcv9jop5ns4r.cn 梅五行属什么hcv9jop6ns5r.cn 报复是什么意思hcv8jop0ns9r.cn 糖尿病不能吃什么水果hcv8jop8ns3r.cn 多囊卵巢综合症吃什么食物好hcv7jop5ns0r.cn
百度