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
    +关注

    关注

    15

    文章

    995

    浏览量

    49773
  • CLK
    CLK
    +关注

    关注

    0

    文章

    79

    浏览量

    16803
  • ADC
    ADC
    +关注

    关注

    0

    文章

    73

    浏览量

    16845
  • GD32F450
    +关注

    关注

    1

    文章

    11

    浏览量

    6547
  • RTThread
    +关注

    关注

    5

    文章

    94

    浏览量

    40248
收藏 人收藏

    评论

    相关推荐

    星空派(GD开发板介绍

    GD开发板板载GD32F450ZG芯片和广和通L610 4G模组,搭载RT-Thread操作系统,支持
    发表于 06-26 18:08

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

    开发板为GD32星空派: 2 代码下载目前RT-Thread提供很多下载方式,有百度网
    发表于 10-13 15:56

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

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

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

    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/
    发表于 06-07 22:10

    移植RT-Thread BSP中GDF450工程运行在GD32F470芯片上失败如何修改

    GD32F450的工程运行在GD32F470的芯片上,加载成功后程序会死在rt_smem_alloc函数里面的289行代码,RT_ASSERT()函数,经过调试发现感觉是因为
    发表于 11-07 14:18

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

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

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

    GD32F405的板子,在RT-Thread Studio里用的GD32F450开发板工程,改了一下RAM大小,从128改成了192然后把SDRAM、eth删除,在主函数里写了个打印hello world。然后修改ROM大小,如下图。但是下载到板子后,打印结果:请问怎么解决
    发表于 02-21 11:33

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

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

    玩转RT-Thread系列教程(8)--ADC—光敏数据的采集

    RT-Thread系列教程(8)–ADC—光敏数据的采集一、查看电路原理图二、添加ADC—DMA配置1.配置Cubemx为ADC设置频率,72/6=12分频生成代码2.添加Kconfig中
    发表于 11-24 13:36 10次下载
    玩转<b>RT-Thread</b>系列教程(8)--<b>ADC</b>—光敏数据的采集

    RT-Thread移植到GD32F150系列MCU

    RT-Thread移植到GD32F150系列MCU
    发表于 12-07 19:36 6次下载
    <b>RT-Thread</b>移植到<b>GD32F</b>150系列MCU

    RT-Thread文档_ADC 设备

    RT-Thread文档_ADC 设备
    发表于 02-22 18:33 1次下载
    <b>RT-Thread</b>文档_<b>ADC</b> 设备

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

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

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

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