ADC(Analog-to-Digital Converter) 指模数转换器。将模拟电压信号转换成数字信号,通常ADC接口会连接一些传感器,如:温度传感器;陀螺仪加速度计;电位器等等。

开发前准备

  • 硬件平台:nxp rt10xx单片机
  • IDE: Keil

1.Kconfig 修改和menuconfig配置

Env环境menuconfigRT-Thread Components->Device Drivers 设备驱动默认为n,所以需要开启。

先在Kconfig中添加如下语句,然后在Env环境menuconfigHardware Drivers Config->On-Chip Peripheral Drivers 使能ADC

2.工程添加ADC驱动框架和BSP驱动接口

设备驱动框架:adc.c BSP接口:drv_adc.c fsl_adc.c fsl_adc_etc.c(imxrt 特有功能,本章用不到)

3.添加或修改drv_adc.c

笔者查阅了文件,发现 drv_adc.c 这个文件,只写了很初级的adc查询的方法,这种方式简单,适用于比较单一的adc项目。实际在应用中我们通常会采用中断方式,或者adc dma这样会让整个系统更加灵活,系统也不会等待adc状态消耗cpu资源。补充一下:imxrt系列 的adc,可使用adc etc结合外设pit 和 xbara触发转换,本章不会添加这些,后期有时间,再去完善drv_adc.c 和 adc.c文件,暂时使用现成已经写好的框架文件。

  • 定义rtc adc device

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);
};struct rt_adc_device
{struct rt_device parent;const struct rt_adc_ops *ops;
};static struct rt_adc_ops imxrt_adc_ops =
{.enabled = imxrt_hp_adc_enabled,.convert = imxrt_hp_adc_convert,
};
  • 设备创建注册

这里笔者只简单修改了一点,采样精度改成10bit,降低一些功耗吧,具体看项目来,另外新增硬件平均

int rt_hw_adc_init(void)
{int result = RT_EOK;#if defined(BSP_USING_ADC1)ADC_GetDefaultConfig(&ADC1_config_value);ADC1_config_value.resolution = kADC_Resolution10Bit; ADC_Init(ADC1, &ADC1_config_value);#if !(defined(FSL_FEATURE_ADC_SUPPORT_HARDWARE_TRIGGER_REMOVE) && FSL_FEATURE_ADC_SUPPORT_HARDWARE_TRIGGER_REMOVE)ADC_EnableHardwareTrigger(ADC1, false);
#endifADC_SetHardwareAverageConfig(ADC1, kADC_HardwareAverageCount16); ADC_DoAutoCalibration(ADC1);result = rt_hw_adc_register(&adc1_device, "adc1", &imxrt_adc_ops, ADC1);if (result != RT_EOK){LOG_E("register adc1 device failed error code = %d\n", result);}#endif /* BSP_USING_ADC1 */#if defined(BSP_USING_ADC2)ADC_GetDefaultConfig(&ADC2_config_value);ADC_Init(ADC2, &ADC2_config_value);#if !(defined(FSL_FEATURE_ADC_SUPPORT_HARDWARE_TRIGGER_REMOVE) && FSL_FEATURE_ADC_SUPPORT_HARDWARE_TRIGGER_REMOVE)ADC_EnableHardwareTrigger(ADC2, false);
#endifADC_DoAutoCalibration(ADC2);result = rt_hw_adc_register(&adc2_device, "adc2", &imxrt_adc_ops, ADC2);if (result != RT_EOK){LOG_E("register adc2 device failed error code = %d\n", result);}#endif /* BSP_USING_ADC2 */return result;
}INIT_DEVICE_EXPORT(rt_hw_adc_init);
  • 基于imxrt adc device 相关函数

内容很简单直接贴代码

static rt_err_t imxrt_hp_adc_enabled(struct rt_adc_device *device, rt_uint32_t channel, rt_bool_t enabled)
{return RT_EOK;
}static rt_err_t imxrt_hp_adc_convert(struct rt_adc_device *device, rt_uint32_t channel, rt_uint32_t *value)
{adc_channel_config_t adc_channel;ADC_Type *base;base = (ADC_Type *)(device->parent.user_data);adc_channel.channelNumber = channel;adc_channel.enableInterruptOnConversionCompleted = false;ADC_SetChannelConfig(base, 0, &adc_channel);while (0U == ADC_GetChannelStatusFlags(base, 0)){continue;}*value = ADC_GetChannelConversionValue(base, 0);return RT_EOK;
}

4.搭建应用层demo

底层IO初始化

IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_14_GPIO1_IO14, 0U);
IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_14_GPIO1_IO14, 0xB0U);

应用读取adc1 通道3数据

/**************************************************START OF FILE*****************************************************//*------------------------------------------------------------------------------------------------------------------
Includes
*/
#include <rtthread.h>
#include <rtdevice.h>/*------------------------------------------------------------------------------------------------------------------
Macros
*/
#define ADC_DEV_NAME        "adc1"      /* ADC 设备名称 */
#define ADC_DEV_CHANNEL     3           /* ADC 通道 *//*------------------------------------------------------------------------------------------------------------------
Variables
*/
static rt_adc_device_t adc_dev;/*------------------------------------------------------------------------------------------------------------------
Functions
*/
static int adcSample(int argc, char *argv[])
{rt_uint32_t value;rt_err_t ret = RT_EOK;/* 查找设备 */adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME);if (adc_dev == RT_NULL){rt_kprintf("adc sample run failed! can't find %s device!\n", ADC_DEV_NAME);return RT_ERROR;}rt_kprintf("adc start", value);return ret;
}static void adcRead(void)
{rt_uint32_t value;rt_adc_enable(adc_dev, ADC_DEV_CHANNEL);value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL);rt_kprintf("the value is :%d \n", value);rt_adc_disable(adc_dev, ADC_DEV_CHANNEL);
}/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(adcSample, adc voltage convert sample);
MSH_CMD_EXPORT(adcRead, adc read);/****************************************************END OF FILE*****************************************************/

输入命令adcSample运行应用,输入adcRead打印当前adc值,笔者就仅仅将adc引脚触碰GND和3.3V测试

【RT-Thread】nxp rt10xx 设备驱动框架之--adc搭建和使用相关推荐

  1. linux pcie驱动框架_Linux设备驱动框架设计

    引子 Linux操作系统的一大优势就是支持数以万计的芯片设备,大大小小的芯片厂商工程师都在积极地向Linux kernel提交设备驱动代码.能让这个目标得以实现,这背后隐藏着一个看不见的技术优势:Li ...

  2. Linux驱动开发 15 块设备驱动框架

    CAN         I.MX6ULL 带有两个 CAN 控制器: FlexCAN1 和 FlexCAN2 , NXP 官方的 EVK 开发板这两个 CAN 接口都用到了,因此 NXP 官方的设备树 ...

  3. Windows的设备驱动框架

    Windows的设备驱动框架 Windows内核管理层的部件之一是I/O管理模块,有时候也称为I/O子系统.I/O管理模块所管理的对象与活动纵向贯穿管理层.核心层乃至HAL层,所以称之为子系统其实也有 ...

  4. windows linux 融合,Windows和Linux的设备驱动框架的对比融合研究

    摘要:把驱动框架分为三层,针对各层在Windows和Linux中的实现方法的不同,对Windows和Linux的设备驱动框架进行对比研究.从接口函数,应用程序访问驱动程序的路径,驱动程序具体实现及安装 ...

  5. RT-Thread I2C设备驱动框架的对接使用

    I2C和SPI是MCU和板载芯片之间最常用的通讯方式,现在先介绍下I2C总线.I2C的基本原理也很简单,只需要两根线(时钟线SCL和信号线SDA)即可实现挂载在I2C总线上设备之间的相互通讯.I2C协 ...

  6. Linux总线设备驱动框架的理解(非常棒的文章!)

    以下内容源于微信公众号:嵌入式企鹅圈.有格式内容上的修改,如有侵权,请告知删除. Linux的设备驱动框架,即某类设备对应的驱动的框架. 这里是"Linux总线设备驱动框架",应该 ...

  7. LCD 设备驱动框架分析及核心结构

    Linux 下很多东西都是和结构体相关,举个例子,时钟大家都知道吧,Linux 下对应时钟的东西就有好几个结构体,所以你要是想明白Linux 下那些东西,对结构体要有所了解,LCD 是基础的驱动设备, ...

  8. Misc杂项设备驱动框架

    Misc杂项设备驱动框架 由于设备号比较紧张,所以一些不相关的设备可以使用同一个主设备号,不同的次设备号.主设备号通常是10. 杂项设备结构体 struct miscdevice {int minor ...

  9. Platform平台设备驱动框架

    Platform 平台设备驱动框架 platform平台设备驱动是基于设备驱动模型的,它将总线结构体struct bus_type封装为struct bus_type platform_bus_typ ...

最新文章

  1. 使用Feign时如何设置Feign的Header信息
  2. android eclipse 环境
  3. 免费的网络推广教大家新站点前期优化如何进行?
  4. 【工具】更新国内使用谷歌日历解决方案——飞书日历,谷歌输入法下载
  5. 如何解决Win10预览版一闪而过的disksnapshot.exe进程?
  6. Veeam黑科技之Direct NFS Access
  7. cocos2dx setVisible 与setEnabled 小实例
  8. 20201125:力扣第216场周赛(下)
  9. Q96:PT(1):方格纹理(Checker)(2)——2D Checker
  10. [USACO14OPEN]Fair Photography【前缀和】
  11. 数据结构(二)之二叉树
  12. 【渝粤教育】广东开放大学 企业文化学 形成性考核 (57)
  13. 空间如何超越极小而存在
  14. Python深度学习基础(四)——损失函数
  15. yyuc视图未更新,控制器修改可以看到,视图无法更新,提示Allowed memory size of exhausted
  16. qt视频教程qt入门教程嵌入式linux应用开发qt编程开发,QT项目实战教程-Qt应用项目实例开发视频教程...
  17. Python小白逆袭大神的课程总结
  18. 三菱FX系列PLC与三菱变频器通讯应用实例
  19. Keepserver 与 IFIX OPC PowerTool相互关联
  20. Python爬虫实战:抓取淘宝MM照片

热门文章

  1. Android中指南针的实现
  2. OBCA认证知识点-part3
  3. 小程序源码:未来老婆查询生成器-多玩法安装简单
  4. 一件程序猿T恤的故事
  5. Python 转换金额数字大写为数字小写
  6. 360手机刷机·LSPosed安装和使用教程
  7. 三点布光材质连接,做旧
  8. 一文看懂芯片后端报告
  9. 前端iPhone刘海屏适配
  10. Pandas 学习手册中文第二版:1~5