RT-Thread开发GD32F450添加adc外设

开发板使用的是gd32f450zk,env工具使用的版本是1.3.5,rtthread版本是5.0.0
添加adc外设的步骤如下:
步骤1: 查看开发板的电路原理图,确定adc的使用引脚,使用的是引脚pf6,即adc012_in4,如下图:
步骤2: 使用env工具开启adc外设,并选择配置相应的adc外设,如下如
步骤3:打开drv_adc.c文件,修改代码
修改后代码如下,也可以全部修改为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);
提示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
步骤5:测试发现输入并无变化的情况下,读取的值一直在变,并且变化太大,读取到的值快速减小。
说明配置的有问题,查找原因,发现再使能adc外设的时候,没有对引脚的时钟进行使能,再static void gd32_adc_gpio_init(rcu_periph_enum adc_clk, rt_base_t pin)函数中增加使能引脚时钟,修改如下:
rcu_periph_clock_enable(rcu_gpiof);
修改之后测试,测试结果
读取的值不会变化很大,而是再一定的范围内变化。

第十三届世界品牌五百强公布 苹果重回榜首
LED照明业自救:固守还是走出去?
EMC测试与整改实践
TASMO-自动测试建模好帮手
科创板澜起科技董事李亚军介绍、履历信息
RT-Thread开发GD32F450添加adc外设
不将就:一加5搭载骁龙835,今夏不见不散!
适用于Arduino的RF操纵杆的制作
Redis数据类型介绍
安科瑞智能化分布式光伏运维监控系统的作用
京东方CEO:中美贸易战对京东方显示事业没有太大影响
让对外合作更高效,就用WeLink跨企业沟通
KUKA机器人ASCII码的运用
Nokia 2720翻盖手机宣布于12月24日发布
NP2302FVR-J(20 v n沟道增强型MOSFET)
土壤墒情监测站的应用为农业生产提供科学数据支撑
酸蓄电池是怎样生产出来的?
路灯光控开关GUK-81/2/3/4/电路原理图
51单片机指令集详解 51单片机布尔操作指令集详解
TIMC案触礁,施颜祥提出3大处理原则