药物流产后需要注意什么| 早上口干舌燥是什么原因| 导览是什么意思| 六月二十日是什么日子| 喝杨梅酒对身体有什么好处| 桃子可以做什么美食| 心脏缺血吃什么补得快| 腺是什么意思| 皮蛋与什么食物相克| 蛟龙是什么意思| 半月板后角变性什么意思| 故人是什么意思| 花胶是什么鱼的鱼肚| 八月13号是什么星座| 什么可以祛斑| 适得其反是什么意思| 老本行是什么意思| 宫颈肥大需要注意什么| 起酥油是什么做的| 一什么一什么造句| 鳏寡孤独是什么意思| 甲鱼吃什么食物| 胆经不通吃什么中成药| 圆脸女生适合什么发型| 零和博弈是什么意思| 什么人容易得脑梗| 精炼植物油是什么油| tpc是什么意思| 梦见烧衣服什么预兆| 多米诺骨牌是什么意思| 日本的国宝是什么| 包皮炎用什么药| 鎏是什么意思| 五指毛桃不能和什么一起吃| 人流后什么时候来月经| 辣的部首是什么| 什么是裸眼视力| e2是什么意思| 腔梗是什么病| 口蜜腹剑是什么意思| 广东广西以什么为界| 阴离子是什么| 梦到捡金子首饰是什么意思| 吃什么有助于睡眠效果好| 褥疮用什么药| smile是什么意思| 拔完智齿吃什么消炎药| 食管反流用什么药| 西红柿对人体有什么好处| 上火吃什么| sk-ll是什么牌子| 加拿大现在是什么时间| 18k金是什么| 什么是大专| 什么是绘本| 什么人容易得尿毒症| 石斛有什么功效和作用| 什么是甲减病| 钼靶检查是什么| 氟哌酸又叫什么名字| 什么水果不能上供| 胆固醇高是什么原因引起的| 京兆尹是什么官| 刮宫后能吃什么水果| 飞龙在天是什么生肖| 五月三十一号是什么星座| 站久了脚后跟疼是什么原因| 阻生智齿是什么意思| 沙悟净是什么生肖| 一什么白菜| 冠状沟有溃疡是什么病| 心脏跳快吃什么药好| 对什么都不感兴趣| 高凝状态是什么意思| 什么是积食| 脚崴了吃什么药| 汗疱疹用什么药好| 手麻是什么情况| 爬山有什么好处| l是什么字| 维生素b6主治什么病| 为什么天天做梦| 无名指戴戒指是什么意思| 三月是什么季节| 手五行属什么| 蕊字五行属什么| 尿酸高喝什么水最好| 骨骼是什么意思| 陪产假什么时候开始休| 宠物邮寄用什么快递| 沉沦什么意思| 财鱼是什么鱼| 开半挂车需要什么证| 蛇脱皮在家有什么预兆| 上位是什么意思| 大便黄绿色是什么原因| 症是什么意思| 红细胞压积偏高是什么原因| 胃疼需要做什么检查| 梦见别人穿红衣服是什么意思| 恶心想吐吃什么药好| 谭字五行属什么| 内痔疮用什么药治最好效果最快| 土阜念什么| 那个叫什么| 儿童荨麻疹吃什么药| 姻亲是什么意思| 肝的反射区在什么部位| 排卵期是什么| 蓝莓有什么功效| 五月初六是什么星座| pcr是什么意思| 尿酸高会引起什么疾病| 促排卵吃什么药| 什么叫真爱| 五浊恶世是什么意思| 市公安局政委是什么级别| 脚脖子粗是什么原因| 红海是什么意思| 84属什么生肖| 小囊肿是什么病严重吗| 湿气是什么原因引起的| llbean是什么牌子| 帛字五行属什么| 胆固醇高是什么原因引起的| 冷的什么| 退行性变是什么意思| 血虚吃什么好| 静脉血是什么颜色| 眼睛痒是什么原因引起的| 脸上脱皮是什么原因| 中位生存期什么意思| 脂肪肝吃什么药好得快| mj什么意思| 博物馆里面有什么| 40岁男人学什么乐器好| 做梦梦见马是什么意思| 感冒了吃什么水果比较好| 双克是什么药| 受精卵着床是什么意思| crayons什么意思| 年终奖一般什么时候发| 妙三多预防什么| 肝血管瘤是什么原因引起的| 女人脚腿肿是什么原因| 总监是什么级别| 性激素六项什么时候查最准确| 脸部痒是什么原因| dhea是什么药| 太阳里面有什么| 备孕检查挂什么科| 非油炸是什么意思| 农历七月初五是什么星座| 县武装部长是什么级别| 哈尔滨有什么特产| 人做梦是什么原因| 花中西施指的是什么花| 什么组词| 生性凉薄是什么意思| 人言可畏是什么意思| 屈光检查是什么| 晚上脚抽筋是什么原因| spiderking是什么牌子| 7月9日什么星座| 吃什么补阳气| 什么叫等离子| 农历七月十五是什么节| 榴莲不能和什么水果一起吃| 什么是随机血糖| 耳鸣看什么科| 秋天有什么水果成熟| 中性粒细胞绝对值偏高是什么原因| 上山下水什么字| 九二年属什么生肖| 三伏是什么时候| 贵州有什么| 处男是什么意思| 乌龟浮水是什么原因| 小腹疼痛是什么原因| 人造珍珠是什么材质| 柠檬什么时候开花结果| 磁共振是检查什么| 苗字五行属什么| 赶的偏旁是什么| 元气什么意思| 腰疼是什么原因引起的女性| 为什么晚上睡觉老是做梦| 胎盘厚度代表什么| 衔接是什么意思| 日久见人心是什么意思| 正连级是什么军衔| 小蛮腰什么意思| 咽喉炎挂什么科| 脑供血不足头晕吃什么药| 什么是点天灯| 经期为什么不能拔牙| 什么是庚日| 反酸是什么意思| 咳嗽脑袋疼是什么原因| 胃得宁又叫什么名字| 小插曲是什么意思| 慢性肠炎用什么药| 玉势是什么| 满日是什么意思| 男人人中有痣代表什么| 紧急避孕药什么时候吃最好| 槿字五行属什么| 为什么会有肾结石| 肾上腺彩超是检查什么| 牙周炎是什么症状| 器质性病变是什么意思| 劲酒是什么酒| 天蝎属于什么象星座| 转肽酶高是什么原因| 金银花主治什么| 狂风暴雨是什么意思| 咳嗽吃什么好得快| 胸痛一阵一阵的痛什么原因| 什么是免疫组化检查| 什么是卵泡期| 甲状腺结节看什么科| 什么地端详| rl是什么意思| 空调制冷量是什么意思| zgo手表是什么牌子| 什么入胜| 1919年属什么生肖| 喝白茶有什么好处| chip什么意思| 太监是什么意思| 大鱼际疼是什么原因| 广东有什么烟| IOM是什么意思| 丹毒是什么| 雅痞是什么意思| 做爱女生是什么感觉| 布施蚂蚁什么食物最好| 丹毒是什么原因引起的| 梦见下暴雨是什么意思| 梦见黑山羊是什么预兆| 双子座是什么星座| 指责的意思是什么| 电场是什么| 白痰吃什么药| 是什么符号| 灵芝有什么作用与功效| 孕妇吃什么长胎不长肉| 鬼市是什么意思| 万圣节什么时候| 什么杯子不能装水| 乳腺回声不均匀是什么意思| 茂密的枝叶像什么| 纸醉金迷什么意思| qh是什么意思| 猪润是什么| 大便咖啡色什么原因| 十月十日是什么星座| 黄鼻涕是什么感冒| 男人吃鸽子有什么好处| 吃素对身体有什么好处| 子婴是秦始皇什么人| 什么原因造成高血压| 感触什么意思| 经前期综合症吃什么药| 百度
这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 ? 论坛首页 ? 嵌入式开发 ? 软件与操作系统 ? 瑞萨已适配的DAC框架分析

共3条 1/1 1 跳转至

瑞萨已适配的DAC框架分析

高工
2025-08-04 15:42:02     打赏
百度 对在电商网络平台开办网店的贫困劳动力,也可按规定享受创业担保贷款政策。

驱动层适应框架层的通用模板

   分析完rtthread的通用框架,我们基本上可以得到以下dac驱动实现模板。

struct dac_param
{
    // 驱动内部维护参数
};

struct rt_dac_ops dac_ops =
{
    .disabled = dac禁用接口实现,
    .enabled  = dac使能接口实现,
    .convert  = dac写电压值对应的寄存器值函数,
    .get_resolution = 返回dac精度函数,
};

static int dac_init(void)
{
    struct dac_param *param;
    struct rt_dac_dev *dev;

    const char *device_name = "xxxx";
    
    dev = (struct rt_dac_dev *)rt_malloc(sizeof(struct rt_dac_dev));
    param = (struct dac_param *)rt_malloc(sizeof(struct dac_param));

    // DAC 硬件资源初始化
    
    // 系统注册DAC驱动
    if (RT_EOK != rt_hw_dac_register(dev, device_name, &dac_ops, (void *)param))
    {
        LOG_E("%s register failed", device_name);
        return -RT_ERROR;
    }

    return RT_EOK;
}
INIT_DEVICE_EXPORT(dac_init);

瑞萨适配框架层的实现

驱动注册接口

struct ra_dac_map ra_dac[] =
{
#ifdef BSP_USING_DAC0
    {'0', &g_dac0_cfg, &g_dac0_ctrl},
#endif
#ifdef BSP_USING_DAC1
    {'1', &g_dac1_cfg, &g_dac1_ctrl},
#endif
};

#ifdef BSP_USING_DAC0
struct rt_dac_device dac0_device;
struct ra_dac_dev _ra_dac0_device = {.ra_dac_device_t = &dac0_device, .ra_dac_map_dev = &ra_dac[0]};
#endif

#ifdef BSP_USING_DAC1
struct rt_dac_device dac1_device;
struct ra_dac_dev _ra_dac1_device = {.ra_dac_device_t = &dac1_device, .ra_dac_map_dev = &ra_dac[1]};
#endif

struct rt_dac_ops ra_dac_ops =
{
    .disabled = ra_dac_disabled,
    .enabled  = ra_dac_enabled,
    .convert  = ra_dac_write,
};

static int ra_dac_init(void)
{
#ifdef BSP_USING_DAC0
    _ra_dac0_device.ra_dac_device_t->ops = &ra_dac_ops;
    R_DAC_Open((dac_ctrl_t *)_ra_dac0_device.ra_dac_map_dev->g_ctrl, (dac_cfg_t const *)_ra_dac0_device.ra_dac_map_dev->g_cfg);
    if (FSP_SUCCESS != rt_hw_dac_register(_ra_dac0_device.ra_dac_device_t, "dac0", &ra_dac_ops, (void *)_ra_dac0_device.ra_dac_map_dev))
    {
        LOG_E("dac0 register failed");
        return -RT_ERROR;
    }
#endif

#ifdef BSP_USING_DAC1
    _ra_dac1_device.ra_dac_device_t->ops = &ra_dac_ops;
    R_DAC_Open((dac_ctrl_t *)_ra_dac1_device.ra_dac_map_dev->g_ctrl, (dac_cfg_t const *) _ra_dac1_device.ra_dac_map_dev->g_cfg);
    if (FSP_SUCCESS != rt_hw_dac_register(_ra_dac1_device.ra_dac_device_t, "dac1", &ra_dac_ops, (void *)_ra_dac1_device.ra_dac_map_dev))
    {
        LOG_E("dac1 register failed");
        return -RT_ERROR;
    }
#endif

    return RT_EOK;
}
INIT_DEVICE_EXPORT(ra_dac_init);

DAC的适配,并未像ADC那样采用for循环的方式编写,这也导致了如果后面存在dac2,甚至dacx时,不得不修改ra_dac_init和数组结构体定义,修改面相较于ADC驱动会大一些。另外,从这里我们可以看出,如果我们要适配已有的dac驱动配置,则需要按照struct ra_dac_map ra_dac[]中的内容生成RASC配置,否则会出现编译报错。另外,这注册接口有个小问题,rt_hw_dac_register的返回值居然是用FSP_SUCCESS来判断的,虽然从功能上来说这不是问题,但是从理解上来说,FSP_SUCCESS是FSP特有的定义,不是RTT的定义,若两方有任何一方突然更新这块,就会存在不匹配的情况。

使能/禁用dac接口

   之所以放一起,是因为ADC那部分就是放一起实现的。

rt_err_t ra_dac_disabled(struct rt_dac_device *device, rt_uint32_t channel)
{
    RT_ASSERT(device != RT_NULL);
    struct ra_dac_map *dac = (struct ra_dac_map *)device->parent.user_data;
    if (FSP_SUCCESS != R_DAC_Stop((dac_ctrl_t *)dac->g_ctrl))
    {
        LOG_E("dac%c stop failed.", dac->name);
        return -RT_ERROR;
    }
    return RT_EOK;
}

rt_err_t ra_dac_enabled(struct rt_dac_device *device, rt_uint32_t channel)
{
    RT_ASSERT(device != RT_NULL);
    struct ra_dac_map *dac = (struct ra_dac_map *)device->parent.user_data;
    if (FSP_SUCCESS != R_DAC_Start((dac_ctrl_t *)dac->g_ctrl))
    {
        LOG_E("dac%c start failed.", dac->name);
        return -RT_ERROR;
    }
    return RT_EOK;
}

这部分上实现其实很精简,直接对接dac的FSP代码,而对接的参数就是RASC生成的配置。

DAC电压值写实现

rt_err_t ra_dac_write(struct rt_dac_device *device, rt_uint32_t channel, rt_uint32_t *value)
{
    RT_ASSERT(device != RT_NULL);
    struct ra_dac_map *dac = (struct ra_dac_map *)device->parent.user_data;
    if (FSP_SUCCESS != R_DAC_Write((dac_ctrl_t *)dac->g_ctrl, *value))
    {
        LOG_E("dac%c set value failed.", dac->name);
        return -RT_ERROR;
    }
    return RT_EOK;
}

这接口的实现也特别精简,甚至都不需要细看代码就已经知道了需要干嘛了。实际上就是将寄存器值通过FSP接口设下去。

总结

   相比较于瑞萨适配ADC驱动的实现,DAC实现上有那么一点点小瑕疵(注册驱动函数),但目前来说,并不影响驱动的使用,可以暂时不去优化。





关键词: 瑞萨     适配     驱动     DAC    

专家
2025-08-04 19:29:47     打赏
2楼

很详细了


专家
2025-08-04 12:17:13     打赏
3楼

感谢楼主分享


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]
书中自有颜如玉是什么意思 属兔是什么命 拉肚子能喝什么 相濡以沫不如相忘于江湖是什么意思 云南属于什么地区
职业规划是什么 古早是什么意思 公租房是什么 肌肉酸痛用什么膏药 飞机杯有什么用
药剂师是什么专业 膳食是什么 挖墙脚是什么意思 葡萄柚是什么水果 老是感冒是什么原因
猎奇是什么意思 压床娃娃有什么讲究吗 晚上扫地有什么说法 山楂和什么泡水喝降血压 孕早期头晕是什么原因
野兽之王是什么动物hcv8jop9ns3r.cn 泡脚不出汗是什么原因travellingsim.com 粘液阳性是什么意思hcv8jop2ns4r.cn ket是什么意思hcv8jop4ns5r.cn 7月有什么活动hcv9jop5ns2r.cn
ggo是什么意思hcv7jop5ns6r.cn 叶凡为什么找石昊求救hcv8jop3ns3r.cn 爱之深恨之切是什么意思hcv9jop0ns6r.cn 合伙人是什么意思hcv7jop6ns9r.cn 肝硬化吃什么食物好hcv8jop5ns7r.cn
什么茶可以减肥hcv9jop3ns8r.cn 心意是什么意思hcv9jop8ns0r.cn 鼻涕粘稠是什么原因hcv7jop7ns1r.cn 下午六点是什么时辰hcv7jop6ns1r.cn 什么饮料不含糖hcv8jop0ns3r.cn
8月7号是什么星座hcv9jop7ns1r.cn 肛门是什么hcv8jop0ns0r.cn 豆芽炒什么好吃hcv8jop4ns9r.cn 安利是什么意思hcv8jop8ns2r.cn 白介素是什么hcv9jop2ns5r.cn
百度