- #include "at32f403a_407_wk_config.h"
- #include "wk_system.h"
- uint16_t dma_complete_flag = 0;//dma传输完成标志
- uint32_t adc_value[2] = {0};//adc总数据(32位)
- uint16_t adc1_channel0 = 0;//通道0的adc值
- uint16_t adc1_channel1 = 0;//通道1的adc值
- uint16_t adc2_channel2 = 0;//通道2的adc值
- uint16_t adc2_channel3 = 0;//通道3的adc值
- int main(void)
- {
- wk_system_clock_config();
- wk_periph_clock_config();
- wk_nvic_config();
- wk_timebase_init();
- wk_dma1_channel1_init();
- wk_dma_channel_config(DMA1_CHANNEL1,
- (uint32_t)&ADC1->odt,
- DMA1_CHANNEL1_MEMORY_BASE_ADDR,
- DMA1_CHANNEL1_BUFFER_SIZE);
- dma_channel_enable(DMA1_CHANNEL1, TRUE);
- wk_adc2_init();
- wk_adc1_init();
- adc_ordinary_conversion_trigger_set(ADC1, ADC12_ORDINARY_TRIG_SOFTWARE, TRUE);
- while(dma_complete_flag == 0);//等待dma传输完成
- adc1_channel0 = (adc_value[0] & 0xffff);//adc数组第一个元素低16位的数据
- adc1_channel1 = (adc_value[1] & 0xffff);//adc数组第二个元素低16位的数据
- adc2_channel2 = ((adc_value[0] >> 16) & 0xffff);//adc数组第一个元素高16位的数据
- adc2_channel3 = ((adc_value[1] >> 16) & 0xffff);//adc数组第二个元素高16位的数据
- while(1)
- {
- }
- }
at32f403a_407_wk_config.c
- #include "at32f403a_407_wk_config.h"
- void wk_system_clock_config(void)
- {
- crm_reset();
- crm_clock_source_enable(CRM_CLOCK_SOURCE_LICK, TRUE);
- while(crm_flag_get(CRM_LICK_STABLE_FLAG) != SET)
- {
- }
- crm_clock_source_enable(CRM_CLOCK_SOURCE_HICK, TRUE);
- while(crm_flag_get(CRM_HICK_STABLE_FLAG) != SET)
- {
- }
- crm_pll_config(CRM_PLL_SOURCE_HICK, CRM_PLL_MULT_60, CRM_PLL_OUTPUT_RANGE_GT72MHZ);
- crm_clock_source_enable(CRM_CLOCK_SOURCE_PLL, TRUE);
- while(crm_flag_get(CRM_PLL_STABLE_FLAG) != SET)
- {
- }
- crm_ahb_div_set(CRM_AHB_DIV_1);
- crm_apb2_div_set(CRM_APB2_DIV_2);
- crm_apb1_div_set(CRM_APB1_DIV_2);
- crm_auto_step_mode_enable(TRUE);
- crm_sysclk_switch(CRM_SCLK_PLL);
- while(crm_sysclk_switch_status_get() != CRM_SCLK_PLL)
- {
- }
- crm_auto_step_mode_enable(FALSE);
- system_core_clock_update();
- }
- void wk_periph_clock_config(void)
- {
- crm_periph_clock_enable(CRM_DMA1_PERIPH_CLOCK, TRUE);
- crm_periph_clock_enable(CRM_IOMUX_PERIPH_CLOCK, TRUE);
- crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
- crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
- crm_periph_clock_enable(CRM_ADC1_PERIPH_CLOCK, TRUE);
- crm_periph_clock_enable(CRM_ADC2_PERIPH_CLOCK, TRUE);
- }
- void wk_nvic_config(void)
- {
- nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
- NVIC_SetPriority(SysTick_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 15, 0));
- nvic_irq_enable(DMA1_Channel1_IRQn, 0, 0);
- }
- void wk_adc1_init(void)
- {
- gpio_init_type gpio_init_struct;
- adc_base_config_type adc_base_struct;
- gpio_default_para_init(&gpio_init_struct);
- gpio_init_struct.gpio_mode = GPIO_MODE_ANALOG;
- gpio_init_struct.gpio_pins = GPIO_PINS_0;
- gpio_init(GPIOA, &gpio_init_struct);
- gpio_init_struct.gpio_mode = GPIO_MODE_ANALOG;
- gpio_init_struct.gpio_pins = GPIO_PINS_1;
- gpio_init(GPIOA, &gpio_init_struct);
- crm_adc_clock_div_set(CRM_ADC_DIV_6);
- adc_combine_mode_select(ADC_ORDINARY_SMLT_ONLY_MODE);
- adc_base_default_para_init(&adc_base_struct);
- adc_base_struct.sequence_mode = TRUE;
- adc_base_struct.repeat_mode = FALSE;
- adc_base_struct.data_align = ADC_RIGHT_ALIGNMENT;
- adc_base_struct.ordinary_channel_length = 2;
- adc_base_config(ADC1, &adc_base_struct);
- adc_ordinary_channel_set(ADC1, ADC_CHANNEL_0, 1, ADC_SAMPLETIME_239_5);
- adc_ordinary_channel_set(ADC1, ADC_CHANNEL_1, 2, ADC_SAMPLETIME_239_5);
- adc_ordinary_part_mode_enable(ADC1, FALSE);
- adc_enable(ADC1, TRUE);
- adc_calibration_init(ADC1);
- while(adc_calibration_init_status_get(ADC1));
- adc_calibration_start(ADC1);
- while(adc_calibration_status_get(ADC1));
- adc_dma_mode_enable(ADC1, TRUE);//使能adc的dma传输
- }
- void wk_adc2_init(void)
- {
- gpio_init_type gpio_init_struct;
- adc_base_config_type adc_base_struct;
- gpio_default_para_init(&gpio_init_struct);
- gpio_init_struct.gpio_mode = GPIO_MODE_ANALOG;
- gpio_init_struct.gpio_pins = GPIO_PINS_2;
- gpio_init(GPIOA, &gpio_init_struct);
- gpio_init_struct.gpio_mode = GPIO_MODE_ANALOG;
- gpio_init_struct.gpio_pins = GPIO_PINS_3;
- gpio_init(GPIOA, &gpio_init_struct);
- crm_adc_clock_div_set(CRM_ADC_DIV_6);
- adc_base_default_para_init(&adc_base_struct);
- adc_base_struct.sequence_mode = TRUE;
- adc_base_struct.repeat_mode = FALSE;
- adc_base_struct.data_align = ADC_RIGHT_ALIGNMENT;
- adc_base_struct.ordinary_channel_length = 2;
- adc_base_config(ADC2, &adc_base_struct);
- adc_ordinary_channel_set(ADC2, ADC_CHANNEL_2, 1, ADC_SAMPLETIME_239_5);
- adc_ordinary_channel_set(ADC2, ADC_CHANNEL_3, 2, ADC_SAMPLETIME_239_5);
- adc_ordinary_conversion_trigger_set(ADC2, ADC12_ORDINARY_TRIG_SOFTWARE, TRUE);
- adc_ordinary_part_mode_enable(ADC2, FALSE);
- adc_enable(ADC2, TRUE);
- adc_calibration_init(ADC2);
- while(adc_calibration_init_status_get(ADC2));
- adc_calibration_start(ADC2);
- while(adc_calibration_status_get(ADC2));
- }
- void wk_dma1_channel1_init(void)
- {
- dma_init_type dma_init_struct;
- dma_reset(DMA1_CHANNEL1);
- dma_default_para_init(&dma_init_struct);
- dma_init_struct.direction = DMA_DIR_PERIPHERAL_TO_MEMORY;
- dma_init_struct.memory_data_width = DMA_MEMORY_DATA_WIDTH_WORD;
- dma_init_struct.memory_inc_enable = TRUE;
- dma_init_struct.peripheral_data_width = DMA_PERIPHERAL_DATA_WIDTH_WORD;
- dma_init_struct.peripheral_inc_enable = FALSE;
- dma_init_struct.priority = DMA_PRIORITY_LOW;
- dma_init_struct.loop_mode_enable = FALSE;
- dma_init(DMA1_CHANNEL1, &dma_init_struct);
- dma_flexible_config(DMA1, FLEX_CHANNEL1, DMA_FLEXIBLE_ADC1);
- dma_interrupt_enable(DMA1_CHANNEL1, DMA_FDT_INT, TRUE);
- }
- void wk_dma_channel_config(dma_channel_type* dmax_channely, uint32_t peripheral_base_addr, uint32_t memory_base_addr, uint16_t buffer_size)
- {
- dmax_channely->dtcnt = buffer_size;
- dmax_channely->paddr = peripheral_base_addr;
- dmax_channely->maddr = memory_base_addr;
- }
at32f403a_407_wk_config.h
- #ifndef __AT32F403A_407_WK_CONFIG_H
- #define __AT32F403A_407_WK_CONFIG_H
- #ifdef __cplusplus
- extern "C" {
- #endif
- #include "at32f403a_407.h"
- #define DMA1_CHANNEL1_BUFFER_SIZE 2
- #define DMA1_CHANNEL1_MEMORY_BASE_ADDR (uint32_t)adc_value
- void wk_system_clock_config(void);
- void wk_periph_clock_config(void);
- void wk_nvic_config(void);
- void wk_adc1_init(void);
- void wk_adc2_init(void);
- void wk_dma1_channel1_init(void);
- void wk_dma_channel_config(dma_channel_type* dmax_channely, uint32_t peripheral_base_addr, uint32_t memory_base_addr, uint16_t buffer_size);
- #ifdef __cplusplus
- }
- #endif
- #endif
at32f403a_407_int.c
- #include "at32f403a_407_int.h"
- #include "wk_system.h"
- extern uint16_t dma_complete_flag;//外部变量
- void SysTick_Handler(void)
- {
- wk_timebase_handler();
- }
- void DMA1_Channel1_IRQHandler(void)
- {
- if(dma_flag_get(DMA1_FDT1_FLAG) != RESET)
- {
- dma_flag_clear(DMA1_FDT1_FLAG);
- dma_complete_flag = 1;//dma传输完成
- }
- }
4.现象
PA0接3.3V,PA1和PA2接1.5V,PA3接0V;
在DEBUG模式下,查看各通道的adc值。
由于作者水平有限,文中如有错误之处,恳请读者批评指正。
参考资料:
《RM_AT32F403A_407_CH_V2.06》的19模拟数字转换(ADC)https://www.arterytek.com/file/download/1995