请配置GD32F303,ADC+DMA采样,使用注入模式
时间: 2023-12-04 12:02:52 浏览: 161
好的,以下是配置GD32F303 ADC+DMA采样使用注入模式的代码:
```c
#include "gd32f30x.h"
#define ADC_GPIO_PORT GPIOA
#define ADC_GPIO_PIN GPIO_PIN_0
#define ADC_CHANNEL ADC_CHANNEL_0
#define ADC_SAMPLE_TIME ADC_SAMPLETIME_55POINT5
#define ADC_INJ_SEQ ADC_INSERTED_CHANNEL_1
#define ADC_INJ_SEQ_LEN 1
#define DMA_CHANNEL DMA_CHANNEL_0
#define DMA_PRIORITY DMA_PRIORITY_HIGH
#define DMA_MODE DMA_CIRCULAR
#define DMA_INC DMA_INC_DISABLE
#define DMA_SIZE DMA_SIZE_16BITS
void adc_dma_init(void);
void adc_gpio_init(void);
int main(void) {
/* 使能 DMA 和 ADC 时钟 */
rcu_periph_clock_enable(RCU_DMA0);
rcu_adc_clock_enable();
/* 初始化 GPIO 和 ADC */
adc_gpio_init();
adc_dma_init();
/* 配置注入序列 */
adc_inserted_channel_config(ADC0, ADC_INJ_SEQ, ADC_CHANNEL, ADC_SAMPLE_TIME, ADC_INJ_SEQ_LEN);
/* 配置 DMA 触发源为 ADC 注入完成事件 */
dma_channel_parameter_struct dma_channel;
dma_deinit(DMA0, DMA_CHANNEL);
dma_channel_init(DMA0, DMA_CHANNEL, &dma_channel);
dma_circulation_disable(DMA0, DMA_CHANNEL);
dma_periph_address_config(DMA0, DMA_CHANNEL, (uint32_t)&ADC_RDATA(ADC0));
dma_memory_address_config(DMA0, DMA_CHANNEL, (uint32_t)data_array);
dma_transfer_direction_config(DMA0, DMA_CHANNEL, DMA_PERIPHERAL_TO_MEMORY);
dma_transfer_number_config(DMA0, DMA_CHANNEL, 1);
dma_periph_inc_mode_config(DMA0, DMA_CHANNEL, DMA_INC_DISABLE);
dma_memory_inc_mode_config(DMA0, DMA_CHANNEL, DMA_INC_ENABLE);
dma_periph_data_size_config(DMA0, DMA_CHANNEL, DMA_SIZE);
dma_memory_data_size_config(DMA0, DMA_CHANNEL, DMA_SIZE);
dma_priority_config(DMA0, DMA_CHANNEL, DMA_PRIORITY_HIGH);
dma_circulation_enable(DMA0, DMA_CHANNEL);
dma_channel_enable(DMA0, DMA_CHANNEL);
/* 启动 ADC 和 DMA */
adc_software_trigger_enable(ADC0, ADC_INSERTED_CHANNEL);
adc_dma_mode_enable(ADC0);
adc_enable(ADC0);
while (1) {
/* 循环等待 DMA 传输完成 */
while (dma_flag_get(DMA0, DMA_CHANNEL, DMA_FLAG_FTF) == RESET);
/* 处理数据 */
// ...
/* 清除 DMA 标志 */
dma_flag_clear(DMA0, DMA_CHANNEL, DMA_FLAG_FTF);
}
}
void adc_dma_init(void) {
/* 配置 DMA 时钟和中断 */
nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);
dma_interrupt_enable(DMA0, DMA_CHANNEL, DMA_INT_FTF);
}
void adc_gpio_init(void) {
/* 配置 GPIO 时钟 */
rcu_periph_clock_enable(RCU_GPIOA);
/* 配置 GPIO 为模拟输入 */
gpio_mode_set(ADC_GPIO_PORT, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, ADC_GPIO_PIN);
}
```
以上代码实现了 ADC+DMA 采样,使用了注入模式。在代码中,我们使用了 DMA 进行数据传输,并启用了循环模式,使得 DMA 可以不断地将 ADC 采集到的数据传输到内存中。同时,我们还配置了注入序列,并将 DMA 触发源设置为 ADC 注入完成事件,以便 DMA 能够及时地捕获到 ADC 采集完成的事件。在主循环中,我们循环等待 DMA 传输完成,并在传输完成后对数据进行处理。
阅读全文