0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RT-Thread开发GD32F450添加adc外设

冬至子 来源:YZRD 作者:YZRD 2023-10-08 15:04 次阅读

开发板使用的是gd32f450zk,env工具使用的版本是1.3.5,rtthread版本是5.0.0

添加adc外设的步骤如下:

步骤1: 查看开发板的电路原理图,确定adc的使用引脚,使用的是引脚PF6,即adc012_IN4,如下图:

1.jpg

步骤2: 使用env工具开启adc外设,并选择配置相应的adc外设,如下如

1.jpg

2.jpg

步骤3:打开drv_adc.c文件,修改代码

1.jpg

修改后代码如下,也可以全部修改为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);

1.jpg

提示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

1.jpg

步骤5:测试发现输入并无变化的情况下,读取的值一直在变,并且变化太大,读取到的值快速减小。

说明配置的有问题,查找原因,发现再使能adc外设的时候,没有对引脚的时钟进行使能,再static void gd32_adc_gpio_init(rcu_periph_enum adc_clk, rt_base_t pin)函数中增加使能引脚时钟,修改如下:

rcu_periph_clock_enable(RCU_GPIOF);

修改之后测试,测试结果

1.jpg

读取的值不会变化很大,而是再一定的范围内变化。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • GPIO
    +关注

    关注

    16

    文章

    1139

    浏览量

    50606
  • CLK
    CLK
    +关注

    关注

    0

    文章

    122

    浏览量

    16912
  • ADC
    ADC
    +关注

    关注

    0

    文章

    91

    浏览量

    16845
  • GD32F450
    +关注

    关注

    1

    文章

    11

    浏览量

    6612
  • RTThread
    +关注

    关注

    7

    文章

    129

    浏览量

    40523
收藏 人收藏

    评论

    相关推荐

    梁山派GD32F450/470-RT-Thread Nano移植(二)

    在上一篇文章中,我实现了在keil中给梁山派移植RT-Thread Nano,但在官方的移植教程中,除了系统的移植,还有在 RT-Thread Nano 上添加UART控制台与 FinSH的教程,所以我在本文中将实现在梁山派的N
    的头像 发表于 09-25 15:40 1171次阅读
    梁山派<b class='flag-5'>GD32F450</b>/470-<b class='flag-5'>RT-Thread</b> Nano移植(二)

    梁山派GD32F450/470-RT-Thread Nano移植(三)

    RT-Thread FinSH 是 RT-Thread 的命令行组件(shell),提供一套供用户在命令行调用的操作接口,主要用于调试或查看系统信息。
    的头像 发表于 09-26 14:50 837次阅读
    梁山派<b class='flag-5'>GD32F450</b>/470-<b class='flag-5'>RT-Thread</b> Nano移植(三)

    rt-thread studio新建gd32f450工程

    rt-thread studio 软件版本是:2.2.6;开发板的软件包是:GD32450Z-GD-EVAL版本是V1.0.1;开发板使用兆易的官方
    的头像 发表于 09-28 14:17 1221次阅读
    <b class='flag-5'>rt-thread</b> studio新建<b class='flag-5'>gd32f450</b>工程

    RT-Thread开发GD32F450添加串口外设的方法

    开发板使用的是gd32f450zk,env工具使用的版本是1.3.5,rtthread版本是5.0.0。
    的头像 发表于 09-28 17:01 2152次阅读
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>开发</b><b class='flag-5'>GD32F450</b><b class='flag-5'>添加</b>串口<b class='flag-5'>外设</b>的方法

    星空派(GD开发板介绍

    本帖最后由 jf_39160458 于 2021-9-11 17:41 编辑 `星空派(GD开发板板载GD32F450ZG芯片和广和通L610 4G模组,搭载RT-Thread
    发表于 06-26 18:08

    移植RT-Thread操作系统到GD32星空派开发

    。它把面向对象的设计方法应用到实时系统设计中,使得代码风格优雅、架构清晰、系统模块化并且可裁剪性非常好。本次移植所使用开发板为GD32星空派: 2 代码下载目前RT-Thread提供很多下载方式,有百度网
    发表于 10-13 15:56

    移植RT-Thread操作系统到GD32星空派开发

    。它把面向对象的设计方法应用到实时系统设计中,使得代码风格优雅、架构清晰、系统模块化并且可裁剪性非常好。本次移植所使用开发板为GD32星空派: 2 代码下载目前RT-Thread提供很多下载方式,有百度网
    发表于 10-13 16:06

    如何将RT-Thread移植到GD32F150系列MCU上呢

    1、下载RT-Thread Nano的源码,如下2、在工程目录下添加RT-Thread文件夹,如下:3、将下载的RT-Thread Nano的源码解压,然后拷贝到
    发表于 02-11 07:53

    基于RT-Thread Studio的ADC外设使用方案介绍

    1、基于RT-Thread Stduio使用ART-Pi的ADC外设1. 打开 RT-Thread Stduio,左上角新建 RT-Thread
    发表于 03-28 16:57

    GD32F4系列芯片移植RTOS Demo工程 GD32F407移植FreeRTOS GD32F407移植RT-Thread

    GD32F4系列移植FreeRTOS和RT-Thread工程例程GD32F407/GD32F450
    发表于 06-07 22:10

    基于GD32F310开发板在rt-thread添加finsh及其shell功能

    1、GD32F310开发板试用+finsh/shell添加与进程STACK优化  上一次只是移植了rt-thread nano的内核,但rt-thr
    发表于 11-08 16:05

    GD32F450开发板工程RT系统启动错误如何解决呢?

    我自己设计的GD32F405的板子,在RT-Thread Studio里用的GD32F450开发板工程,改了一下RAM大小,从128改成了192然后把SDRAM、eth删除,在主函数
    发表于 02-21 11:33

    RT-Thread开发GD32F450使用scons添加新的文件夹

      开发板使用的是gd32f450zk,想在工程中新建文件夹,通过scons管理,参考官方,步骤如下:  step1:新建文件夹并在文件夹下创建.c和.h文件  step2:复制SConscript
    发表于 04-03 17:39

    RT-Thread开发,如何有效学习RT-Thread的五个步骤

    RT-Thread推出RT-Thread Inside战略开放RT-Thread开发平台授权合作,与硬件十万个为什么合作首次推出第一款RT-
    的头像 发表于 09-25 09:55 3.4w次阅读
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>开发</b>,如何有效学习<b class='flag-5'>RT-Thread</b>的五个步骤

    RT-Thread开发GD32F450添加spiflash外设的步骤

    gd32f450工程上使用env工具增加spi falsh。
    的头像 发表于 08-07 14:58 1385次阅读
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>开发</b><b class='flag-5'>GD32F450</b><b class='flag-5'>添加</b>spiflash<b class='flag-5'>外设</b>的步骤