晚上蝴蝶来家什么预兆| 马鞍皮是什么皮| 梦见怀孕的女人是什么意思| 盐是什么| 心脏搭桥是什么意思| 孕妇便秘吃什么水果| 二月春风似剪刀的上一句是什么| 碍事是什么意思| 层林尽染是什么季节| 食粉是什么粉| 白加黑是什么药| 女人银屑病一般都长什么地方| 左膝关节退行性变是什么意思| 三焦是什么| 饿了吃什么不胖| 日和立念什么| 喝温开水有什么好处| dsa检查是什么意思| 太阳为什么会发光发热| 大人睡觉流口水是什么原因引起的| 猛虎下山是什么生肖| 一个三点水一个及念什么| 啤酒为什么是苦的| 花中皇后是什么花| 痛风能喝什么酒| 肺在什么位置图片| z是什么火车| 一直发低烧是什么原因| 什么药护肝效果最好| 血清铁蛋白是检查什么| 得了咽炎有什么症状| 经常打呼噜是什么原因| qc是什么| 品牌是什么意思| spiderking是什么牌子| 舌头发红是什么原因| 高低肩挂什么科| 孕妇甲减是什么原因引起的| 胚胎是什么意思| 牙齿突然酸痛什么原因| 太抽象了是什么意思| 什么情况下会宫外孕| 男性小便出血是什么原因| 什么是筋膜| 姜黄与生姜有什么区别| 上坟可以带什么水果| 免疫力差吃什么可以增强抵抗力| af是什么意思| 7.9是什么星座| gc什么意思| 毛戈平化妆品什么档次| 为什么佛山有三个车牌| 睡觉趴着睡什么原因| 氧化钠是什么| 肠道蠕动慢吃什么药| 女人眼睛干涩吃什么药| 一什么无什么| 检查尿酸挂什么科| 阿司匹林肠溶片有什么副作用| 转氨酶高吃什么食物好| 绝代双骄是什么意思| 惊雷是什么意思| 月泉读什么| 喉部有异物感是什么病| 木加号读什么| 扫把星什么意思| 三点水一个希读什么| 左小腿麻木是什么原因| 梦见下牙掉了是什么征兆| 特药是什么意思| 女性尿道炎挂什么科| 梵音是什么意思| 胆囊壁固醇沉积是什么意思| 唐僧肉是什么意思| 人格是什么意思| 新白娘子传奇许仙为什么用女的演| 后脑勺胀痛什么原因| 618是什么节日| 胎盘附着于子宫前壁是什么意思| 眼睛红用什么眼药水| 辣木籽有什么功效| 蛇与什么属相相克相冲| 甲状腺欠均匀什么意思| 皮肤黑穿什么颜色的衣服好看| 英语四级什么时候报名| 晚上8点到9点是什么时辰| 面瘫是什么引起的| 皮蛋为什么含铅| 重度抑郁症吃什么药| 祛火喝什么茶| 苦尽甘来是什么意思| 小孩心跳快是什么原因| 人参归脾丸适合什么人吃| 硬不起吃什么药| 孕妇梦见大蟒蛇是什么意思| 塬字五行属什么| 胸片能查出什么| 崖柏对人体有什么好处| 示数是什么意思| 为什么掉头发很厉害| 芊芊学子什么意思| 肌底液是干什么用的| 办护照需要什么资料| 正军级是什么级别| 破处什么感觉| 脑梗要注意什么| 女人裹脚是从什么时候开始的| 结婚九年是什么婚| 国家穷为什么不多印钱| 圣杯是什么意思| 缺血灶是什么病| 孕妇适合吃什么鱼| 腰间盘突出吃什么| 为什么医院不推荐钡餐检查| 什么药补血效果最好最快| 梦见发大水是什么意思| 去湿气吃什么中药| 咳嗽能吃什么水果最好| 杜仲泡水喝有什么功效| 1919年属什么生肖| 肠胃不好能吃什么水果| 梦见金项链是什么意思| 左眼皮一直跳什么原因| 金樱子泡酒有什么功效| 为什么13周不让建卡了| 败血症是什么症状| 侏罗纪是什么意思| 画龙点晴是什么生肖| 热疹症状该用什么药膏| 草单斤是什么字| 什么名字| 相拥是什么意思| 三唑仑是什么| iga肾病是什么意思| 退步是什么意思| 孤单的我还是没有改变是什么歌| 狗的鼻子为什么是湿的| 甲壳虫吃什么食物| 旗袍搭配什么鞋子好看| 干咳吃什么药好| 补办结婚证需要什么手续| 375是什么意思| 胃气上逆是什么原因| 一朝一夕是什么意思| 左胸口疼是什么原因| 不想说话是什么原因| 断章取义什么意思| 无花果有什么功效| hpl是什么意思| 赤什么意思| 2月29日是什么星座| 小孩不说话什么原因| 头发分叉是什么原因| bun是什么意思| cb是什么| 上坟可以带什么水果| 男生生理期是什么表现| 15岁可以做什么兼职| 子宫彩超能检查出什么| 鸡屁股叫什么| kappa是什么意思| 耐药菌感染什么意思| 什么时候测血压最准确| 五月十七号是什么星座| 南字五行属什么| dtc是什么意思| 父母宫代表什么| 6月29日是什么星座| 干疮是什么样子的图片| alt什么意思| 女人戴什么手串辟邪| 宝宝腹泻吃什么药| 俯卧撑有什么好处| 黄芪是什么味道| 天德是什么生肖| 政委是干什么的| 火同念什么| 经常吃辣椒有什么好处和坏处| 私生饭什么意思| hp什么意思| 喝杨梅酒对身体有什么好处| 男人手大代表什么| 梦见拉屎是什么意思| 宝宝益生菌什么时候吃最好| 右是什么结构| 甲状腺1度肿大是什么意思| 过敏性紫癜有什么危害| 柯南什么时候完结| 不爱说话的人是什么性格| 任性是什么意思| 血糖是什么意思| 五点到七点是什么时辰| 80年属什么的| 雾霾是什么意思| 癞蛤蟆长什么样| 扭转乾坤是什么生肖| 世界上最大的数是什么| bpo是什么意思啊| 办银行卡需要什么证件| 槐花什么时候开花| 辟邪剑谱和葵花宝典有什么关系| 二十年婚姻是什么婚| 乳房变大是什么原因| 一岁宝宝口臭是什么原因引起的| 碳酸钙是什么| 天天吃玉米有什么好处和坏处| 黄连泡水喝有什么功效| 咳嗽痰多用什么药| 人日是什么意思| 疮疖是什么样子图片| 虎斑猫是什么品种| 弃市是什么意思| 献血后吃什么| 9号来的月经什么时候是排卵期| 思伤脾是什么意思| 吃什么维生素对眼睛好| 中焦不通用什么中成药| 梦见粽子是什么预兆| 辰代表什么意思| xanax是什么药| 殊途同归什么意思| 什么叫做靶向治疗| 现在小麦什么价格| 高校自主招生是什么意思| 大便次数多是什么原因| 妙赞是什么意思| 保护心脏吃什么最好| 牛仔外套搭配什么裤子好看| 长期大便不成形是什么原因造成的| 性激素六项检查是什么| 二月二十二日是什么星座| 什么是尾货| 支队长是什么级别| 五分类血常规检查什么| 怀孕喝什么汤最有营养| 1970年属什么生肖| 脂肪肝吃什么药好| 男性内分泌失调有什么症状| 脚气用什么泡脚| 肾积水是什么原因造成的怎么治疗| 什么是真菌感染| 苏打水什么牌子的好| 甲状腺激素是什么| 精分是什么意思| 拉屎是绿色的是什么原因| 多才多艺是什么生肖| 浑身无力是什么原因| 苦丁茶有什么作用和功效| 走马观花的走什么意思| 六月十号是什么星座| 夏枯草治什么病| 潮湿的近义词是什么| gtp是什么意思| 脱发吃什么维生素| 凝血五项是检查什么病| 人云亦什么| 什么的晚霞| 疣长什么样| 花孔雀是什么意思| 房早有什么危害| 六月二十日是什么日子| 女人喝咖啡有什么好处和坏处| 小老弟是什么意思| 阴囊湿疹长什么样图片| 百度
这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 ? 论坛首页 ? 嵌入式开发 ? 软件与操作系统 ? rtthread DAC框架分析

共3条 1/1 1 跳转至

rtthread DAC框架分析

高工
2025-08-04 23:44:44   被打赏 50 分(兑奖)     打赏
百度 奥林巴斯在售入门级M43无反相机E-PL8是在2016年9月发布的,它采用16MPCMOS传感器,搭载了两轴机身防抖,外观全新设计,复古中多了一点时尚。

后面的驱动适配的分析,基本上都按照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    

专家
2025-08-04 00:43:20     打赏
2楼

感谢分享


专家
2025-08-04 20:46:56     打赏
3楼

感谢分享


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]
手脚冰凉是什么原因 护理学是学什么的 男人小腹疼痛是什么原因 血压低吃什么药 人分三六九等什么意思
嗓子发炎挂什么科 多梦吃什么药 体癣用什么药膏好得快 防晒衣什么材质最防晒 每晚做梦是什么原因
蔻驰包属于什么档次 高什么远瞩 1984年属鼠的是什么命 对口升学什么意思 丑时五行属什么
危楼是什么意思 梦见自己大笑是什么意思 木鱼花是什么 京东积分有什么用 耐药性什么意思
豇豆不能和什么一起吃hcv9jop0ns4r.cn 颈动脉斑块吃什么药hcv9jop4ns0r.cn 区块链技术是什么hcv8jop0ns9r.cn 血氧低有什么症状hcv7jop6ns3r.cn 什么肉不能吃hcv8jop1ns0r.cn
乙肝小三阳是什么意思clwhiglsz.com 门诊号是什么意思hcv8jop4ns6r.cn 尿频尿急吃什么药最好hcv9jop1ns6r.cn 什么是不动产权证bysq.com 4月2号是什么星座hcv9jop1ns2r.cn
茯苓和土茯苓有什么区别hcv8jop5ns6r.cn 先心病是什么病hcv7jop9ns9r.cn 钱丢了预示着什么hcv8jop7ns7r.cn 鹧鸪读音是什么hcv8jop5ns4r.cn 满载而归的载是什么意思hcv8jop8ns1r.cn
扮猪吃老虎什么意思onlinewuye.com 发烧了吃什么药clwhiglsz.com 血小板体积偏低是什么原因hcv7jop7ns1r.cn 全飞秒手术是什么hcv9jop7ns3r.cn 食管反流什么症状hcv8jop6ns4r.cn
百度