Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
ADC
rt-smart
驱动
art-pi smart ADC驱动移植
发布于 2022-01-27 19:59:53 浏览:765
订阅该版
art-pi smart 里并没有实现ADC驱动,然而我自己又很需要使用ADC,所以只能自己补一个ADC驱动了。 主体程序都是仿照drv_pwm写的。 大佬说,驱动可以搬imxrt里面的,所以我就借用了rt-thread里的两个关键文件:  fsl_adc.c和fsl_adc.h。具体目录参考图片。 怎么去理解fsl_xxx文件呢?类比的话就是STM32的HAL库的文件。 另外还有drv_adc.c和drv_adc.h  也是搬过来的。 当然,换了MCU了,函数名字还是需要改改的。 放出源码,还有很多需要改良的地方的。 ``` /* * Copyright (c) 2006-2021, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2019-04-28 tyustli first version * */ #include
#define RT_USING_ADC #ifdef RT_USING_ADC #define LOG_TAG "drv.adc" #include
#include
#include
#include "fsl_adc.h" #include "drv_adc.h" #include
#include
static rt_err_t imx6ull_adc_enabled(struct rt_adc_device *device, rt_uint32_t channel, rt_bool_t enabled) { return RT_EOK; } static rt_err_t imx6ull_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 = 0; ADC_SetChannelConfig(base, 0, &adc_channel); while (0U == ADC_GetChannelStatusFlags(base, 0)) { continue; } *value = ADC_GetChannelConversionValue(base, 0); return RT_EOK; } static struct rt_adc_ops imx6ull_adc_ops = { .enabled = imx6ull_adc_enabled, .convert = imx6ull_adc_convert, }; int imx6ull_adc_gpio_init(void) { #ifdef BSP_USING_ADC1_1 do { struct imx6ull_iomuxc gpio; uint32_t pin_fun_id[5]={IOMUXC_GPIO1_IO01_GPIO1_IO01}; gpio.muxRegister = pin_fun_id[0]; gpio.muxMode = pin_fun_id[1]; gpio.inputRegister = pin_fun_id[2]; gpio.inputDaisy = pin_fun_id[3]; gpio.configRegister = pin_fun_id[4]; gpio.inputOnfield = 0; gpio.configValue = IOMUXC_SW_PAD_CTL_PAD_DSE(2U) | IOMUXC_SW_PAD_CTL_PAD_SPEED(2U); imx6ull_gpio_init(&gpio); }while(0); #endif #ifdef BSP_USING_ADC1_2 do { struct imx6ull_iomuxc gpio; uint32_t pin_fun_id[5]={IOMUXC_GPIO1_IO02_GPIO1_IO02}; gpio.muxRegister = pin_fun_id[0]; gpio.muxMode = pin_fun_id[1]; gpio.inputRegister = pin_fun_id[2]; gpio.inputDaisy = pin_fun_id[3]; gpio.configRegister = pin_fun_id[4]; gpio.inputOnfield = 0; gpio.configValue = IOMUXC_SW_PAD_CTL_PAD_DSE(2U) | IOMUXC_SW_PAD_CTL_PAD_SPEED(2U); imx6ull_gpio_init(&gpio); }while(0); #endif #ifdef BSP_USING_ADC1_3 do { struct imx6ull_iomuxc gpio; uint32_t pin_fun_id[5]={IOMUXC_GPIO1_IO03_GPIO1_IO03}; gpio.muxRegister = pin_fun_id[0]; gpio.muxMode = pin_fun_id[1]; gpio.inputRegister = pin_fun_id[2]; gpio.inputDaisy = pin_fun_id[3]; gpio.configRegister = pin_fun_id[4]; gpio.inputOnfield = 0; gpio.configValue = IOMUXC_SW_PAD_CTL_PAD_DSE(2U) | IOMUXC_SW_PAD_CTL_PAD_SPEED(2U); imx6ull_gpio_init(&gpio); }while(0); #endif #ifdef BSP_USING_ADC1_4 do { struct imx6ull_iomuxc gpio; uint32_t pin_fun_id[5]={IOMUXC_GPIO1_IO04_GPIO1_IO04}; gpio.muxRegister = pin_fun_id[0]; gpio.muxMode = pin_fun_id[1]; gpio.inputRegister = pin_fun_id[2]; gpio.inputDaisy = pin_fun_id[3]; gpio.configRegister = pin_fun_id[4]; gpio.inputOnfield = 0; gpio.configValue = IOMUXC_SW_PAD_CTL_PAD_DSE(2U) | IOMUXC_SW_PAD_CTL_PAD_SPEED(2U); imx6ull_gpio_init(&gpio); }while(0); #endif return 0; } int rt_hw_adc_init(void) { rt_err_t ret = RT_EOK; imx6ull_adc_gpio_init(); #if defined(BSP_USING_ADC1_1) || defined(BSP_USING_ADC1_2) || defined(BSP_USING_ADC1_3) || defined(BSP_USING_ADC1_4) static adc_config_t ADC1_config_value; static struct rt_adc_device adc1_device; ADC_Type *adc1_base; adc1_base = (ADC_Type *)rt_ioremap((void*)ADC1, 0x1000); ADC_GetDefaultConfig(&ADC1_config_value); ADC_Init(adc1_base, &ADC1_config_value); ADC_DoAutoCalibration(adc1_base); ret = rt_hw_adc_register(&adc1_device, "adc1", &imx6ull_adc_ops, adc1_base); if (ret != RT_EOK) { LOG_E("register adc1 device failed error code = %d\n", ret); } #endif return ret; } INIT_DEVICE_EXPORT(rt_hw_adc_init); void set_adc_default(void *parameter) { int result = 0; #ifdef BSP_USING_ADC1_1 do { struct rt_adc_device *device = RT_NULL; device = (struct rt_adc_device *)rt_device_find("adc1"); if (!device) { result = -RT_EIO; return; } result = rt_adc_enable(device, 1); result = rt_adc_read(device, 1); rt_kprintf("adc ch1 read result is %d\n",result); } while(0); #endif #ifdef BSP_USING_ADC1_2 do { struct rt_adc_device *device = RT_NULL; device = (struct rt_adc_device *)rt_device_find("adc1"); if (!device) { result = -RT_EIO; return; } result = rt_adc_enable(device, 2); result = rt_adc_read(device, 2); rt_kprintf("adc ch2 read result is %d\n",result); } while(0); #endif #ifdef BSP_USING_ADC1_3 do { struct rt_adc_device *device = RT_NULL; device = (struct rt_adc_device *)rt_device_find("adc1"); if (!device) { result = -RT_EIO; return; } result = rt_adc_enable(device, 3); result = rt_adc_read(device, 3); rt_kprintf("adc ch3 read result is %d\n",result); } while(0); #endif #ifdef BSP_USING_ADC1_4 do { struct rt_adc_device *device = RT_NULL; device = (struct rt_adc_device *)rt_device_find("adc1"); if (!device) { result = -RT_EIO; return; } result = rt_adc_enable(device, 4); result = rt_adc_read(device, 4); rt_kprintf("adc ch4 read result is %d\n",result); } while(0); #endif } static int set_adc_init(void) { rt_thread_t tid = rt_thread_create("adc_loop", set_adc_default, RT_NULL, 1024, 16, 20); RT_ASSERT(tid != RT_NULL); rt_thread_startup(tid); return(RT_EOK); } INIT_APP_EXPORT(set_adc_init); #endif /* BSP_USING_ADC */ ``` 编译,烧录,运行,观察效果:  观察CH4,因为我改的是CH4  第一次运行,CH4接的是3.3V,第二次运行CH4接的是GND。AD值符合预期。 中间值也调试过,不过没有截图。 另外,还需要修改 修改driver下的kconfig,让人可以在menuconfig里使能ADC,我目前就只验证过ADC1的1-4通道。 ``` menu "Select ADC Driver" config RT_USING_ADC bool "Enable ADC" default n if RT_USING_ADC config BSP_USING_ADC1_1 bool "Enable ADC1 CH1" default n config BSP_USING_ADC1_2 bool "Enable ADC1 CH2" default n config BSP_USING_ADC1_3 bool "Enable ADC1 CH3" default n config BSP_USING_ADC1_4 bool "Enable ADC1 CH4" default n endif endmenu ``` 修改看着简单,中途碰过很多壁,都是大佬指导和仿照PWM写的。 测试环境是:imx6ull pro以及art-pi smart。(没错,两块板子都能跑,毫无违和感。) 文章先写出来,希望让大家有一个参考。
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
diskwu
这家伙很懒,什么也没写!
文章
5
回答
8
被采纳
3
关注TA
发私信
相关文章
1
请大神帮忙看下风格 还是哪里有问题 照着串口驱动写的ADC驱动
2
ADC config
3
rt_thread_delay()和ADC采样之间的冲突
4
请教在官方BSP中的STM32F40X程序中加入ADC,串口没输出。
5
给RT-Thread添加ADC驱动框架
6
求助:ADC采样被干扰
7
【内核和外设学习营】十里 ADC光敏电阻电压采集实验
8
<内核学习营>+坦然+探索者stm32f407板子的ADC测试光传感器实验
9
【内核学习营】+青春+ADC读取光敏传感器实验
10
《内核学习营》+水一方+项目中应用的ADC实现电压采集
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
I2C_IIC
UART
ESP8266
cubemx
WIZnet_W5500
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
keil_MDK
ulog
SFUD
msh
C++_cpp
MicroPython
本月问答贡献
RTT_逍遥
10
个答案
3
次被采纳
xiaorui
3
个答案
2
次被采纳
winfeng
2
个答案
2
次被采纳
三世执戟
8
个答案
1
次被采纳
KunYi
8
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
lizimu
2
篇文章
9
次点赞
swet123
1
篇文章
4
次点赞
Days
1
篇文章
4
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部