- void drv_adc_gpio_init(void)
- {
- gpio_init_type gpio_initstructure;
- adc_common_config_type adc_common_struct;
- adc_base_config_type adc_base_struct;
- crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
- crm_periph_clock_enable(CRM_ADC1_PERIPH_CLOCK, TRUE);
- crm_adc_clock_select(CRM_ADC_CLOCK_SOURCE_HCLK);
-
- gpio_default_para_init(&gpio_initstructure);
- /* config adc pin as analog input mode */
- gpio_initstructure.gpio_mode = GPIO_MODE_ANALOG;
- gpio_initstructure.gpio_pins = GPIO_PINS_0 | GPIO_PINS_1;
- gpio_init(GPIOA, &gpio_initstructure);
-
- adc_common_default_para_init(&adc_common_struct);
- /* config division,adcclk is division by hclk */
- adc_common_struct.div = ADC_HCLK_DIV_4;
- /* config inner temperature sensor and vintrv */
- adc_common_struct.tempervintrv_state = FALSE;
- adc_common_config(&adc_common_struct);
-
- adc_base_default_para_init(&adc_base_struct);
- adc_base_struct.sequence_mode = TRUE; //序列模式,TRUE=一个序列转换,false=只转换单一通道转换,设置多通道序列时也只转换第一个通道
- adc_base_struct.repeat_mode = FALSE; //重复模式,true=一次触发一直重复序列转换;false=一次触发只转换一次全序列
- adc_base_struct.data_align = ADC_RIGHT_ALIGNMENT; //右对齐
- adc_base_struct.ordinary_channel_length = 2; //2个普通通道
- adc_base_config(ADC1, &adc_base_struct);
- adc_resolution_set(ADC1, ADC_RESOLUTION_8B); //转换位数8bit位
- adc_occe_each_conversion_enable(ADC1,TRUE); //true=使能每次转换都设置完成标志。false=序列内全部转换完成才置完成标志
-
- /* config ordinary channel */
- adc_ordinary_channel_set(ADC1, ADC_CHANNEL_0, 1, ADC_SAMPLETIME_47_5);
- adc_ordinary_channel_set(ADC1, ADC_CHANNEL_1, 2, ADC_SAMPLETIME_47_5);
- /* config ordinary trigger source and trigger edge */
- adc_ordinary_conversion_trigger_set(ADC1, ADC_ORDINARY_TRIG_SOFTWARE, ADC_ORDINARY_TRIG_EDGE_NONE);
-
- /* enable adc overflow interrupt */
- adc_interrupt_enable(ADC1, ADC_OCCO_INT|ADC_OCCE_INT|ADC_PCCE_INT, TRUE); //使能ADC标志中断
-
- /* adc enable */
- adc_enable(ADC1, TRUE);
- while(adc_flag_get(ADC1, ADC_RDY_FLAG) == RESET); //等待ADC准备好
-
- nvic_irq_enable(ADC1_IRQn, 0, 0); //使能ADC中断
-
- /* adc calibration */
- adc_calibration_init(ADC1);
- while(adc_calibration_init_status_get(ADC1));
- adc_calibration_start(ADC1);
- while(adc_calibration_status_get(ADC1));
-
- adc_ordinary_software_trigger_enable(ADC1, TRUE); //启动软件触发转换
- }
使用普通序列转换模式。通过中断读取转换值。
- uint32_t adc_value[4];
- uint32_t adc_index = 0;
- void ADC1_IRQHandler(void)
- {
- if(adc_flag_get(ADC1, ADC_OCCE_FLAG) != RESET)
- {
- adc_flag_clear(ADC1, ADC_OCCE_FLAG);
- //转换完成
- adc_value[adc_index ++ ] = adc_ordinary_conversion_data_get(ADC1);
- if(adc_index == 2) adc_index = 0;
-
- }
- }
在main函数中调用ADC初始化,然后将转换的adc值显示在液晶屏上。
- int main(void)
- {
- volatile int32_t i=0;
- int adxl_x,adxl_y,adxl_z; //加速度
- char buff[64];
-
- system_clock_config();
- SysTick_Config(SystemCoreClock/1000);
-
- at32_led_init();
- at32_button_init();
- drv_usart_gpio_init(115200);
- printf("at32f423 board print test.\r\n");
-
- printf("adxl id=%X \r\n",ADXL345_Init());
-
- spilcd_init();
- Delay_ms(1);
- Lcd_Clear(LCD_RED);
- Delay_ms(1000);
- Lcd_Clear(LCD_GREEN);
- Delay_ms(1000);
- Lcd_Clear(LCD_BLUE);
- Delay_ms(1000);
- Lcd_Clear(LCD_WHITE);
- Delay_ms(1000);
- Lcd_SetWindow(0,-LCD_W/2,-LCD_H/2,LCD_W,LCD_H);
-
- drv_adc_gpio_init();
- while(1)
- {
- shell_usart_loop();
-
- ADXL345_GetXYZ(&adxl_x,&adxl_y,&adxl_z);
-
- // if(adxl_x>=0) printf("X=%d\t",adxl_x);
- // else printf("X=-%d\t",~adxl_x + 1);
- // if(adxl_y>=0) printf("Y=%d\t",adxl_y);
- // else printf("Y=-%d\t",~adxl_y + 1);
- // if(adxl_z>=0) printf("Z=%d\n",adxl_z);
- // else printf("Z=-%d\n",~adxl_z + 1);
-
- Lcd_Fill(adxl_y-5,adxl_x-5,adxl_y+5,adxl_x+5,LCD_RED);
- sprintf(buff,"x=%4d,y=%4d,z=%4d ",adxl_x,adxl_y,adxl_z);
- lcd_disp_str_at(-LCD_W/2,-LCD_H/2,buff);
-
- Lcd_Fill(adc_value[1]-5-LCD_W/2,adc_value[0]-5-LCD_H/2,adc_value[1]+5-LCD_W/2,adc_value[0]+5-LCD_H/2,LCD_BLUE);
- sprintf(buff,"adc-x=%6d,adc-y=%6d ",adc_value[1],adc_value[0]);
- lcd_disp_str_at(-LCD_W/2,-LCD_H/2 + 30,buff);
-
- Delay_ms(10);
- Lcd_Fill(adxl_y-5,adxl_x-5,adxl_y+5,adxl_x+5,LCD_WHITE);
- Lcd_Fill(adc_value[1]-5-LCD_W/2,adc_value[0]-5-LCD_H/2,adc_value[1]+5-LCD_W/2,adc_value[0]+5-LCD_H/2,LCD_WHITE);
-
- adc_ordinary_software_trigger_enable(ADC1, TRUE);
- }
- }