中央电视台台长什么级别| 终止妊娠是什么意思| 外地车进北京有什么限制| 一九八三年属什么生肖| 肠胃痉挛什么症状| 眼睛流眼泪用什么眼药水| 孜然是什么| 舌苔发白是什么病| 继女是什么意思| 什么是筋膜| 沙漠为什么是三点水| s和m是什么意思啊| 菠菜是什么意思| 节食是什么意思| 舌苔厚发白是什么原因| 树根有什么作用| 南瓜子有什么功效| 什么是人设| 最贵的烟是什么| 两胸中间疼是什么原因| 什么填海| 痈是什么| 金字旁乐读什么| 思伤脾是什么意思| 新生儿痤疮用什么药膏| 季夏是什么意思| 介入室是干什么的| 孕期腰疼是什么原因| 骨折吃什么药好得快| 过敏性鼻炎不能吃什么| 耳朵内痒是什么原因| 耳火念什么| 基围虾为什么叫基围虾| 女生喜欢男生什么行为| 1月1号是什么星座| 核桃壳有什么用| 宝宝照蓝光有什么副作用| 突然头晕恶心是什么原因| 关节退变什么意思| 老年人全身无力是什么原因| 尿液突然变深褐色是什么原因| 6月18什么星座| 农历5月25日是什么星座| 仁慈是什么意思| 女人梦到蝎子什么征兆| 中药天龙又叫什么| 细软是什么意思| 炖汤用什么锅比较好| 吃华法林不能吃什么| 2008年属鼠是什么命| 胸痛吃什么药| 腿毛有什么用| 蚂蚁上树什么姿势| 第一胎打掉会有什么影响| 什么是妇科病| 血虚吃什么中成药最好| 大肠杆菌用什么药治疗效果好| 脸部麻木是什么原因引起的| 狂犬疫苗什么时候打| 万事如意是什么生肖| 什么血型会导致不孕| 大红袍属于什么茶类| vc是什么| 鸡块炖什么好吃| 褒义是什么意思| 松塔有什么用| 早起嘴巴苦什么原因| 为什么不建议儿童做胃镜| 生鱼又叫什么鱼| 腹胀便溏是什么意思| 自怨自艾是什么意思| opo是什么意思| mirage轮胎什么牌子| 榴莲不能和什么吃| 女性漏尿是什么原因| 来大姨妈吃什么好| 避孕套什么牌子好用又安全| 物是人非是什么意思| 筛子是什么意思| 什么病不能坐飞机| 什么什么害命| 控制欲是什么意思| 什么是植物神经| 梦见穿山甲预示着什么| qw医学上是什么意思| 维生素d3是什么| 平顶山为什么叫平顶山| 80年属什么| 手脚麻木吃什么药最管用| 什么情况下需要做心脏支架| tf卡是什么| 跳蚤咬了擦什么药最好| 什么事情| 猪蹄子炖什么好吃| 勾心斗角是什么生肖| 9月28号是什么星座| 那好吧是什么意思| 小龙虾不能和什么一起吃| 手心发热什么原因| 硕是什么意思| 塑化剂是什么| 有趣的灵魂是什么意思| 区长什么级别| 一九七八年属什么生肖| 71年的猪是什么命| 吃榴莲不能吃什么东西| 吃什么性功能持久| 大驿土命是什么意思| 命硬的人有什么特征| 前置胎盘需要注意什么| 怀孕了吃什么| 精神病人最怕什么刺激| 女性体寒 吃什么好| 鞭尸是什么意思| 手上起水泡是什么原因| 轧戏是什么意思| 寂寞的近义词是什么| 乳酸脱氢酶偏低是什么意思| pku什么意思| 宰相相当于现在什么官| 放屁多是什么原因呢| 打三个喷嚏代表什么| 掉眉毛是什么病| 安全三原则是指什么| 面首什么意思| 女人左手断掌什么命运| 婴儿便便是绿色的是什么原因| 脸上长小疙瘩是什么原因| 古代人用什么刷牙| 继女是什么意思| 什么是鸡胸病症状图片| 凝聚力是什么意思| 梦见家里死人了代表什么预兆| 为什么会有灰指甲| 阿胶糕适合什么人吃| vos是什么意思| 小孩过敏吃什么药| 癸亥五行属什么| 暑假什么时候放| 梦见长白头发是什么意思| 争论是什么意思| stranger什么意思| 孕囊是什么意思| 日本兵为什么不怕死| 防风通圣颗粒治什么病| 介入手术是什么意思| 三月四号什么星座| 胎记是什么| 手足口病吃什么药好得快| 石家庄以前叫什么名字| 嘴苦是什么原因引起的| 去医院看膝盖挂什么科| 老是放屁是什么原因| 铁皮石斛可以治什么病| 吃什么可以让子宫内膜变薄| 免疫组化检查是什么意思| 叶酸有什么作用| 净身是什么意思| 12月15是什么星座| 文科女生学什么专业好| 神经过敏是什么意思| birads3类是什么意思| 8月是什么月| 紧急避孕药对身体有什么伤害| 淤血是什么意思| 什么是肌张力| 腊月是什么星座| 取保候审是什么意思还会判刑吗| 片的第二笔是什么| 什么是老年斑图片| 什么的夏天| 断生是什么意思啊| 山青读什么| 手指甲变薄是什么原因| 大运是什么意思| 气体交换受损与什么有关| 什么字笔画最多| 宸字五行属什么| 呼吸道感染一般用什么消炎药| 考研是什么时候考| 鹧鸪读音是什么| 妇科炎症用什么药好| 橄榄油的好处和坏处是什么| 跑男什么时候播出| 阳历5月20日是什么星座| 挖苦是什么意思| 睾丸痒是什么原因| 手癣用什么药膏| 中耳炎什么症状| 冠脉硬化什么意思| 汉语拼音是什么时候发明的| 大腿内侧痒是什么原因| 郁郁寡欢的意思是什么| 定日是什么意思| 什么叫做基本工资| 吃生蚝有什么好处和坏处| 糖尿病人早餐吃什么最好| 六月二十三号是什么星座| 突然晕厥是什么原因| 孩子疱疹性咽峡炎吃什么药| 被蚊子咬了涂什么药膏| 反贪局局长是什么级别| 榴莲的寓意是什么意思| 知己是什么意思| 天然气是什么气体| 什么东西可以解酒| 莽是什么意思| 9月9日是什么星座| pcp是什么意思| 不孕不育有什么症状| 松鼠尾巴像什么| rsp是什么意思| 什么是生化妊娠| 接踵而至是什么意思| 吃香菜有什么好处| 吃什么补充胶原蛋白| 亵玩是什么意思| 三尖瓣轻度反流是什么意思| 反胃吃什么可以缓解| 吴刚和嫦娥什么关系| 检查胸部应该挂什么科| 生化什么意思| 寒战是什么症状| 心水是什么意思| 钟馗是什么人物| 丙类药一般是什么药| 胎停了有什么症状| 什么是陈述句| 机缘是什么意思| 哈萨克斯坦是什么人种| 什么是官方旗舰店| 业力是什么意思| 每天吃一个西红柿有什么好处| 七月十六是什么星座| 7月20是什么星座| 肠胃不好吃什么水果| 脱发严重应该去医院挂什么科| 肝风内动是什么原因造成的| 什么是半月板损伤| 腹胀是什么原因引起的| 梦见自己和别人吵架是什么意思| 女人怀孕的最佳时间是什么时间| 农历六月六是什么日子| 伏羲和女娲是什么关系| 吃南瓜有什么好处| 叕怎么读音是什么意思| 气血不通吃什么药| 庶子是什么意思| 沉贵宝是什么木| 家里镜子放在什么位置比较好| 酸是什么| 吃什么可以化痰| 口腔溃疡吃什么药好使| 美国人的祖先是什么人| 催供香是什么意思| 口腔长期溃疡是什么原因引起的| 吃什么主食减肥最快| 白细胞少什么原因| 为什么起荨麻疹| 去医院看膝盖挂什么科| 羊肉馅饺子配什么菜好| 糖链抗原高是什么原因| 沉珂是什么意思| 梦见冥币是什么意思| 百度
这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 ? 论坛首页 ? 嵌入式开发 ? 软件与操作系统 ? rtthread ADC框架

共1条 1/1 1 跳转至

rtthread ADC框架

高工
2025-08-04 20:58:33   被打赏 50 分(兑奖)     打赏
百度   巴黎圣母院也是欧洲建筑史上划时代的标志之一。

前言

        虽说瑞萨已经适配了一个通用的ADC驱动,用户只需要根据板卡配置RASC,再用menuconfig配置对应的驱动开关即可。但是如果在后面真正的自己适配驱动,则需要从上至下了解具体实现思路,各层接口暴露情况,才能真正的从0适配未适配的IC。

ADC框架

       此部分代码见components\drivers\misc\adc.c。

ADC框架对接驱动接口

adc驱动注册接口

#ifdef RT_USING_DEVICE_OPS
const static struct rt_device_ops adc_ops =
{
    RT_NULL,
    RT_NULL,
    RT_NULL,
    _adc_read,
    RT_NULL,
    _adc_control,
};
#endif

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

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

#ifdef RT_USING_DEVICE_OPS
    device->parent.ops         = &adc_ops;
#else
    device->parent.init        = RT_NULL;
    device->parent.open        = RT_NULL;
    device->parent.close       = RT_NULL;
    device->parent.read        = _adc_read;
    device->parent.write       = RT_NULL;
    device->parent.control     = _adc_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;
}

   从代码上看,实际上驱动仅仅适配了control和read接口。而实际上,在我们对adc的操作也就是这样的,发命令启动测量,之后读取测量值,因此control和read接口完全够用。另外,从函数参数上可以看出,要适配ADC,驱动部分要构建一个结构体struct rt_adc_ops,此结构体负责框架与驱动之间的交互。

read接口

static rt_ssize_t _adc_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size)
{
    rt_err_t result = RT_EOK;
    rt_size_t i;
    struct rt_adc_device *adc = (struct rt_adc_device *)dev;
    rt_uint32_t *value = (rt_uint32_t *)buffer;

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

    return i;
}

   这个读的接口有点意思,是连读接口,也就是说,按照这个框架,我们可以一次性把adc不同通道的数据一次性读回来。

control接口

static rt_err_t _adc_control(rt_device_t dev, int cmd, void *args)
{
    rt_err_t result = -RT_EINVAL;
    rt_adc_device_t adc = (struct rt_adc_device *)dev;

    if (cmd == RT_ADC_CMD_ENABLE && adc->ops->enabled)
    {
        result = adc->ops->enabled(adc, (rt_uint32_t)args, RT_TRUE);
    }
    else if (cmd == RT_ADC_CMD_DISABLE && adc->ops->enabled)
    {
        result = adc->ops->enabled(adc, (rt_uint32_t)args, RT_FALSE);
    }
    else if (cmd == RT_ADC_CMD_GET_RESOLUTION && adc->ops->get_resolution && args)
    {
        rt_uint8_t resolution = adc->ops->get_resolution(adc);
        if(resolution != 0)
        {
            *((rt_uint8_t*)args) = resolution;
            LOG_D("resolution: %d bits", resolution);
            result = RT_EOK;
        }
    }
    else if (cmd == RT_ADC_CMD_GET_VREF && adc->ops->get_vref && args)
    {
        rt_int16_t value = adc->ops->get_vref(adc);
        if(value != 0)
        {
            *((rt_int16_t *) args) = value;
            result = RT_EOK;
        }
    }

    return result;
}

   从代码上看,此接口主要实现adc的通道使能关闭,以及获取adc精度,adc参考电压的功能。关于参考电压这个问题,之前我有个疑惑,为何RTT官方文档给的adc示例,读取的是adc的寄存器值,而不是实际电压值。为了解决这个困扰,当时还特意去论坛发帖讨论,结果并未收到能解释的通的回复。

ADC框架对接应用接口

rt_adc_enable

rt_err_t rt_adc_enable(rt_adc_device_t dev, rt_int8_t channel)
{
    rt_err_t result = RT_EOK;

    RT_ASSERT(dev);

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

    return result;
}

   有点神奇的是,这个接口居然不是调用control接口,可能是为了减少一层调用,加快函数执行速度的缘故吧。

rt_adc_disable

rt_err_t rt_adc_disable(rt_adc_device_t dev, rt_int8_t channel)
{
    rt_err_t result = RT_EOK;

    RT_ASSERT(dev);

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

    return result;
}

   这个接口也是没用到control接口。

rt_adc_voltage

rt_int16_t rt_adc_voltage(rt_adc_device_t dev, rt_int8_t channel)
{
    rt_uint32_t value = 0;
    rt_int16_t vref = 0, voltage = 0;
    rt_uint8_t resolution = 0;

    RT_ASSERT(dev);

    /*get the resolution in bits*/
    if (_adc_control((rt_device_t) dev, RT_ADC_CMD_GET_RESOLUTION, &resolution) != RT_EOK)
    {
        goto _voltage_exit;
    }

    /*get the reference voltage*/
    if (_adc_control((rt_device_t) dev, RT_ADC_CMD_GET_VREF, &vref) != RT_EOK)
    {
        goto _voltage_exit;
    }

    /*read the value and convert to voltage*/
    dev->ops->convert(dev, channel, &value);
    voltage = value * vref / (1 << resolution);

_voltage_exit:
    return voltage;
}

   从实现上看,这个接口实现的就是对应用层暴露读取到的实际电压的功能,而不是读到的寄存器值(这也是我认为最合理的暴露方法)。但不知道为何,RTT官方文档并未推荐使用该接口。

总结

   分析完RTT的硬件ADC框架后,我们会发现,实际上RTT的adc能实现的功能比官方文档提供的信息要多。而作为初学者,仿照官方文档使用是个快捷的方法。但要想用好RTT,甚至对RTT的缺点进行修补,就必须熟读RTT对应部分的代码,弄清楚对应的实现逻辑,这样才能以最合理的方式编写代码。






关键词: rtthread     框架     ADC    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]
多出汗有什么好处 天蝎座女和什么星座最配 赵丽颖的真名叫什么 石本读什么 手抖是什么病的症状
每天半夜两三点醒是什么原因 竖小拇指什么意思 荷花和莲花有什么区别 梦到自己孩子死了是什么征兆 夏天流鼻血是什么原因
口腔溃疡吃什么药好得快 皂角米是什么东西 反胃想吐是什么原因 什么样的人容易猝死 什么生木
医院特需门诊什么意思 乙肝两对半25阳性是什么意思 阴虚火旺吃什么中成药 啤酒加鸡蛋有什么功效 什么食物含维生素c最多
番茄和蕃茄有什么区别hcv8jop5ns1r.cn 垂线是什么hcv9jop2ns7r.cn 莓茶什么人不适合喝hcv8jop0ns9r.cn 血半念什么hcv9jop7ns5r.cn 对调什么意思hcv9jop1ns8r.cn
口若悬河是什么意思qingzhougame.com 甲亢的早期症状是什么hcv8jop4ns6r.cn 丝苗米是什么米hcv8jop9ns9r.cn 鸿运当头是什么菜hcv8jop2ns2r.cn 十月一日是什么日子hcv8jop1ns4r.cn
心脏缺血吃什么补得快hcv7jop9ns5r.cn 艾滋病的症状是什么样hcv8jop1ns4r.cn m2是什么意思hcv7jop9ns8r.cn 中耳炎吃什么药最有效hcv9jop0ns8r.cn 打一个喷嚏代表什么hcv8jop2ns9r.cn
农历7月是什么月hcv9jop4ns5r.cn 什么是包茎hcv7jop6ns6r.cn 甲状腺肿大挂什么科bfb118.com ts是什么意思hcv9jop1ns2r.cn 女人梦见烧纸什么预兆hcv8jop0ns9r.cn
百度