Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
ADC
Env
GD32F450
RT-Thread开发GD32F450 添加adc外设
发布于 2023-03-21 10:24:09 浏览:910
订阅该版
开发板使用的是gd32f450zk,env工具使用的版本是1.3.5,rtthread版本是5.0.0 添加adc外设的步骤如下: 步骤1: 查看开发板的电路原理图,确定adc的使用引脚,使用的是引脚PF6,即adc012_IN4,如下图: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230321/addafb6a9c14bcece425ed3ad132ab1b.png) 步骤2: 使用env工具开启adc外设,并选择配置相应的adc外设,如下如 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230321/3165517e8148cebd0e3bb7608620dc57.png) ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230321/3d275bd984e87934f7633a52a8d6e053.png) ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230321/ce82ac543dd5a3c06cd1106e649047ec.png) ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230321/683a5b2e840cb8b57d1e4575bbe31817.png) 步骤3:打开drv_adc.c文件,修改代码 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230321/08873665474e6f3798baa938d9bf311b.png.webp) 修改后代码如下,也可以全部修改为GET_PIN(F, 6) ``` #ifdef BSP_USING_ADC2 { ADC2, RCU_ADC2, { GET_PIN(A, 0), GET_PIN(A, 1), GET_PIN(A, 2), GET_PIN(A, 3), GET_PIN(F, 6), GET_PIN(A, 5), GET_PIN(A, 6), GET_PIN(A, 7), GET_PIN(B, 0), GET_PIN(B, 1), GET_PIN(C, 0), GET_PIN(C, 1), GET_PIN(C, 2), GET_PIN(C, 3), GET_PIN(C, 4), GET_PIN(C, 5), }, &adc2, "adc2", }, #endif ``` 还需要修改的函数有: ``` static rt_err_t gd32_adc_enabled(struct rt_adc_device *device, rt_uint32_t channel, rt_bool_t enabled); static rt_err_t gd32_adc_convert(struct rt_adc_device *device, rt_uint32_t channel, rt_uint32_t *value); ``` ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230321/620359958ecd4a4e39d3d7d439205791.png.webp)提示**ADC_REGULAR_CHANNEL** 未定义。改为**ADC_ROUTINE_CHANNEL**,同时将其余报错进行修改,修改后的代码如下: ``` /** * @brief ADC enable * This function enable adc. * @param device, channel, enabled * @retval None */ static rt_err_t gd32_adc_enabled(struct rt_adc_device *device, rt_uint32_t channel, rt_bool_t enabled) { uint32_t adc_periph; struct gd32_adc * adc = (struct gd32_adc *)device->parent.user_data; if (channel >= MAX_EXTERN_ADC_CHANNEL) { LOG_E("invalid channel"); return -RT_EINVAL; } adc_periph = (uint32_t )(adc->adc_periph); if (enabled == ENABLE) { gd32_adc_gpio_init(adc->adc_clk, adc->adc_pins[channel]); adc_channel_length_config(adc_periph, ADC_ROUTINE_CHANNEL, 1); adc_data_alignment_config(adc_periph, ADC_DATAALIGN_RIGHT); #if defined SOC_SERIES_GD32F4xx adc_external_trigger_source_config(adc_periph, ADC_ROUTINE_CHANNEL, ADC_EXTTRIG_ROUTINE_EXTI_11); #else adc_external_trigger_source_config(adc_periph, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE); #endif adc_external_trigger_config(adc_periph, ADC_ROUTINE_CHANNEL, ENABLE); #if defined SOC_SERIES_GD32F4xx adc_routine_channel_config(adc_periph, 0, channel, ADC_SAMPLETIME_480); #else adc_regular_channel_config(adc_periph, 0, channel, ADC_SAMPLETIME_13POINT5); #endif adc_enable(adc_periph); /* ADC calibration and reset calibration */ adc_calibration_enable(adc_periph); } else { adc_disable(adc_periph); } return 0; } /** * @brief convert adc. * This function get adc value. * @param device, channel, value * @retval None */ static rt_err_t gd32_adc_convert(struct rt_adc_device *device, rt_uint32_t channel, rt_uint32_t *value) { uint32_t adc_periph; struct gd32_adc * adc = (struct gd32_adc *)(device->parent.user_data); if (!value) { LOG_E("invalid param"); return -RT_EINVAL; } adc_periph = (uint32_t )(adc->adc_periph); adc_software_trigger_enable(adc_periph, ADC_ROUTINE_CHANNEL); while(!adc_flag_get(adc_periph, ADC_FLAG_EOC)){}; // clear flag adc_flag_clear(adc_periph, ADC_FLAG_EOC); *value = adc_routine_data_read(adc_periph); return 0; } ``` 步骤4:编译正常,下载到开发板,进行测试,测试指令如下: ``` msh />adc Usage: adc probe
- probe adc by name adc read
- read adc value on the channel adc disable
- disable adc channel adc enable
- enable adc channel ``` ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230321/0a62d18fdd483c90ad39ffbb11185b81.png.webp) 步骤5:测试发现输入并无变化的情况下,读取的值一直在变,并且变化太大,读取到的值快速减小。说明配置的有问题,查找原因,发现再使能adc外设的时候,没有对引脚的时钟进行使能,再**static void gd32_adc_gpio_init(rcu_periph_enum adc_clk, rt_base_t pin)函数中**增加使能引脚时钟,修改如下: ``` rcu_periph_clock_enable(RCU_GPIOF); ``` 修改之后测试,测试结果 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230321/14bc337c1dbb200940469c3d8f61c81b.png.webp),读取的值不会变化很大,而是再一定的范围内变化。 c文件 [drv_adc.7z](https://club.rt-thread.org/file_download/c9367ba969f7520f)
2
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
YZRD
这家伙很懒,什么也没写!
文章
21
回答
217
被采纳
19
关注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
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
SFUD
msh
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1443
个答案
289
次被采纳
张世争
805
个答案
174
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
4
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部