開發板使用的是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);
修改之后測試,測試結果
讀取的值不會變化很大,而是再一定的范圍內變化。
-
GPIO
+關注
關注
16文章
1206瀏覽量
52175 -
CLK
+關注
關注
0文章
127瀏覽量
17183 -
ADC
+關注
關注
0文章
110瀏覽量
16845 -
GD32F450
+關注
關注
1文章
11瀏覽量
6660 -
RTThread
+關注
關注
8文章
132瀏覽量
40907
發布評論請先 登錄
相關推薦
評論