【RT-Thread】nxp rt10xx 设备驱动框架之--adc搭建和使用
ADC(Analog-to-Digital Converter) 指模数转换器。将模拟电压信号转换成数字信号,通常ADC接口会连接一些传感器,如:温度传感器;陀螺仪加速度计;电位器等等。
开发前准备
- 硬件平台:nxp rt10xx单片机
- IDE: Keil
1.Kconfig 修改和menuconfig配置
在Env环境menuconfig中 RT-Thread Components->Device Drivers 设备驱动默认为n,所以需要开启。
先在Kconfig中添加如下语句,然后在Env环境menuconfig中 Hardware 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搭建和使用相关推荐
- linux pcie驱动框架_Linux设备驱动框架设计
引子 Linux操作系统的一大优势就是支持数以万计的芯片设备,大大小小的芯片厂商工程师都在积极地向Linux kernel提交设备驱动代码.能让这个目标得以实现,这背后隐藏着一个看不见的技术优势:Li ...
- Linux驱动开发 15 块设备驱动框架
CAN I.MX6ULL 带有两个 CAN 控制器: FlexCAN1 和 FlexCAN2 , NXP 官方的 EVK 开发板这两个 CAN 接口都用到了,因此 NXP 官方的设备树 ...
- Windows的设备驱动框架
Windows的设备驱动框架 Windows内核管理层的部件之一是I/O管理模块,有时候也称为I/O子系统.I/O管理模块所管理的对象与活动纵向贯穿管理层.核心层乃至HAL层,所以称之为子系统其实也有 ...
- windows linux 融合,Windows和Linux的设备驱动框架的对比融合研究
摘要:把驱动框架分为三层,针对各层在Windows和Linux中的实现方法的不同,对Windows和Linux的设备驱动框架进行对比研究.从接口函数,应用程序访问驱动程序的路径,驱动程序具体实现及安装 ...
- RT-Thread I2C设备驱动框架的对接使用
I2C和SPI是MCU和板载芯片之间最常用的通讯方式,现在先介绍下I2C总线.I2C的基本原理也很简单,只需要两根线(时钟线SCL和信号线SDA)即可实现挂载在I2C总线上设备之间的相互通讯.I2C协 ...
- Linux总线设备驱动框架的理解(非常棒的文章!)
以下内容源于微信公众号:嵌入式企鹅圈.有格式内容上的修改,如有侵权,请告知删除. Linux的设备驱动框架,即某类设备对应的驱动的框架. 这里是"Linux总线设备驱动框架",应该 ...
- LCD 设备驱动框架分析及核心结构
Linux 下很多东西都是和结构体相关,举个例子,时钟大家都知道吧,Linux 下对应时钟的东西就有好几个结构体,所以你要是想明白Linux 下那些东西,对结构体要有所了解,LCD 是基础的驱动设备, ...
- Misc杂项设备驱动框架
Misc杂项设备驱动框架 由于设备号比较紧张,所以一些不相关的设备可以使用同一个主设备号,不同的次设备号.主设备号通常是10. 杂项设备结构体 struct miscdevice {int minor ...
- Platform平台设备驱动框架
Platform 平台设备驱动框架 platform平台设备驱动是基于设备驱动模型的,它将总线结构体struct bus_type封装为struct bus_type platform_bus_typ ...
最新文章
- 使用Feign时如何设置Feign的Header信息
- android eclipse 环境
- 免费的网络推广教大家新站点前期优化如何进行?
- 【工具】更新国内使用谷歌日历解决方案——飞书日历,谷歌输入法下载
- 如何解决Win10预览版一闪而过的disksnapshot.exe进程?
- Veeam黑科技之Direct NFS Access
- cocos2dx setVisible 与setEnabled 小实例
- 20201125:力扣第216场周赛(下)
- Q96:PT(1):方格纹理(Checker)(2)——2D Checker
- [USACO14OPEN]Fair Photography【前缀和】
- 数据结构(二)之二叉树
- 【渝粤教育】广东开放大学 企业文化学 形成性考核 (57)
- 空间如何超越极小而存在
- Python深度学习基础(四)——损失函数
- yyuc视图未更新,控制器修改可以看到,视图无法更新,提示Allowed memory size of exhausted
- qt视频教程qt入门教程嵌入式linux应用开发qt编程开发,QT项目实战教程-Qt应用项目实例开发视频教程...
- Python小白逆袭大神的课程总结
- 三菱FX系列PLC与三菱变频器通讯应用实例
- Keepserver 与 IFIX OPC PowerTool相互关联
- Python爬虫实战:抓取淘宝MM照片