- static void adc_config(void)
 
- {
 
- adc_common_config_type adc_common_struct;
 
- adc_base_config_type adc_base_struct;
 
- crm_periph_clock_enable(CRM_ADC1_PERIPH_CLOCK, TRUE);
 
- nvic_irq_enable(ADC1_2_IRQn, 0, 0);
 
- adc_common_default_para_init(&adc_common_struct);
 
- adc_common_struct.combine_mode = ADC_INDEPENDENT_MODE;
 
- adc_common_struct.div = ADC_HCLK_DIV_6;
 
- adc_common_struct.common_dma_mode = ADC_COMMON_DMAMODE_DISABLE;
 
- adc_common_struct.common_dma_request_repeat_state = FALSE;
 
- adc_common_struct.sampling_interval = ADC_SAMPLING_INTERVAL_4CYCLES;
 
- 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;
 
- 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_resolution_set(ADC1, ADC_RESOLUTION_12B);
 
- adc_ordinary_channel_set(ADC1, ADC_CHANNEL_2, 1, ADC_SAMPLETIME_239_5);
 
- adc_ordinary_channel_set(ADC1, ADC_CHANNEL_4, 2, ADC_SAMPLETIME_239_5);
 
- adc_ordinary_conversion_trigger_set(ADC1, ADC_ORDINARY_TRIG_TMR1CH1, ADC_ORDINARY_TRIG_EDGE_NONE);
 
- adc_dma_mode_enable(ADC1, TRUE);
 
- adc_dma_request_repeat_enable(ADC1, TRUE);
 
- adc_occe_each_conversion_enable(ADC1, TRUE);
 
- adc_interrupt_enable(ADC1, ADC_OCCO_INT, TRUE);
 
- adc_interrupt_enable(ADC1, ADC_TCF_INT, TRUE);
 
- adc_convert_fail_auto_abort_enable(ADC1, TRUE);
 
- adc_enable(ADC1, TRUE);
 
- while(adc_flag_get(ADC1, ADC_RDY_FLAG) == RESET);
 
- adc_calibration_init(ADC1);
 
- while(adc_calibration_init_status_get(ADC1));
 
- adc_calibration_start(ADC1);
 
- while(adc_calibration_status_get(ADC1));
 
- }
经运行,其结果图1所示。
 
图1 数据采集结果
为进行数据显示和波形绘制,TFT屏使用的J3接口,见图2所示。
 
图2 所用接口
TFT屏的具体连接关系为:
CS----PA5
RST---PA6
DC---PA7
SD---PA15
SCK---PB7
LED---PA9
TFT屏的引脚配置函数为:
- void TFT_config()
 
- {
 
- gpio_init_type gpio_init_struct;
 
- crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
 
- gpio_default_para_init(&gpio_init_struct);
 
- gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
 
- gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
 
- gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
 
- gpio_init_struct.gpio_pins = GPIO_PINS_5|GPIO_PINS_6|GPIO_PINS_7|GPIO_PINS_9|GPIO_PINS_15;
 
- gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
 
- gpio_init(GPIOA, &gpio_init_struct);
 
- crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
 
- gpio_init_struct.gpio_pins = GPIO_PINS_7;
 
- gpio_init(GPIOB, &gpio_init_struct);
 
- }
显示屏的初始化函数为:
- void tft_Init(void)
 
- {
 
- // ili9220B
 
- LCD_REST_Low();
 
- delay_ms(20);
 
- LCD_REST_High();
 
- delay_ms(20);
 
- LCD_CS_Low();
 
- LCD_WR_REG(0xCB);
 
- LCD_WR_DATA8(0x39);
 
- LCD_WR_DATA8(0x2C);
 
- LCD_WR_DATA8(0x00);
 
- LCD_WR_DATA8(0x34);
 
- LCD_WR_DATA8(0x02);
 
- LCD_WR_REG(0xCF);
 
- LCD_WR_DATA8(0x00);
 
- LCD_WR_DATA8(0XC1);
 
- LCD_WR_DATA8(0X30);
 
- LCD_WR_REG(0xE8);
 
- LCD_WR_DATA8(0x85);
 
- LCD_WR_DATA8(0x00);
 
- LCD_WR_DATA8(0x78);
 
- LCD_WR_REG(0xEA);
 
- LCD_WR_DATA8(0x00);
 
- LCD_WR_DATA8(0x00);
 
- LCD_WR_REG(0xED);
 
- LCD_WR_DATA8(0x64);
 
- LCD_WR_DATA8(0x03);
 
- LCD_WR_DATA8(0X12);
 
- LCD_WR_DATA8(0X81);
 
- LCD_WR_REG(0xF7);
 
- LCD_WR_DATA8(0x20);
 
- LCD_WR_REG(0xC0); //Power control
 
- LCD_WR_DATA8(0x23); //VRH[5:0]
 
- LCD_WR_REG(0xC1); //Power control
 
- LCD_WR_DATA8(0x10); //SAP[2:0];BT[3:0]
 
- LCD_WR_REG(0xC5); //VCM control
 
- LCD_WR_DATA8(0x3e);
 
- LCD_WR_DATA8(0x28);
 
- LCD_WR_REG(0xC7); //VCM control2
 
- LCD_WR_DATA8(0x86); //--
 
- LCD_WR_REG(0x36); // Memory Access Control
 
- LCD_WR_DATA8(0x48);
 
- LCD_WR_REG(0x3A);
 
- LCD_WR_DATA8(0x55);
 
- LCD_WR_REG(0xB1);
 
- LCD_WR_DATA8(0x00);
 
- LCD_WR_DATA8(0x18);
 
- LCD_WR_REG(0xB6); // Display Function Control
 
- LCD_WR_DATA8(0x08);
 
- LCD_WR_DATA8(0x82);
 
- LCD_WR_DATA8(0x27);
 
- LCD_WR_REG(0xF2); // 3Gamma Function Disable
 
- LCD_WR_DATA8(0x00);
 
- LCD_WR_REG(0x26); //Gamma curve selected
 
- LCD_WR_DATA8(0x01);
 
- LCD_WR_REG(0xE0); //Set Gamma
 
- LCD_WR_DATA8(0x0F);
 
- LCD_WR_DATA8(0x31);
 
- LCD_WR_DATA8(0x2B);
 
- LCD_WR_DATA8(0x0C);
 
- LCD_WR_DATA8(0x0E);
 
- LCD_WR_DATA8(0x08);
 
- LCD_WR_DATA8(0x4E);
 
- LCD_WR_DATA8(0xF1);
 
- LCD_WR_DATA8(0x37);
 
- LCD_WR_DATA8(0x07);
 
- LCD_WR_DATA8(0x10);
 
- LCD_WR_DATA8(0x03);
 
- LCD_WR_DATA8(0x0E);
 
- LCD_WR_DATA8(0x09);
 
- LCD_WR_DATA8(0x00);
 
- LCD_WR_REG(0XE1); //Set Gamma
 
- LCD_WR_DATA8(0x00);
 
- LCD_WR_DATA8(0x0E);
 
- LCD_WR_DATA8(0x14);
 
- LCD_WR_DATA8(0x03);
 
- LCD_WR_DATA8(0x11);
 
- LCD_WR_DATA8(0x07);
 
- LCD_WR_DATA8(0x31);
 
- LCD_WR_DATA8(0xC1);
 
- LCD_WR_DATA8(0x48);
 
- LCD_WR_DATA8(0x08);
 
- LCD_WR_DATA8(0x0F);
 
- LCD_WR_DATA8(0x0C);
 
- LCD_WR_DATA8(0x31);
 
- LCD_WR_DATA8(0x36);
 
- LCD_WR_DATA8(0x0F);
 
- LCD_WR_REG(0x11); //Exit Sleep
 
- delay_ms(120);
 
- LCD_WR_REG(0x29); //Display on
 
- LCD_WR_REG(0x2c);
 
- LCD_LED_High();
 
- }
以软件方式模拟SPI进行字节数据方式的函数为:
- void LCD_Writ_Bus(unsigned char com)
 
- {
实现字符显示的函数为:
- void LCD_ShowChar(unsigned int x,unsigned int y,char num,char mode)
 
- {
 
- char temp;
 
- char pos,t;
 
- unsigned int x0=x;
 
- unsigned int colortemp=POINT_COLOR;
 
- if(x>LCD_W-16||y>LCD_H-16)return;
 
- num=num-' ';
 
- Address_set(x,y,x+8-1,y+16-1);
 
- if(!mode)
 
- {
 
- for(pos=0;pos<16;pos++)
 
- {
 
- temp=asc2_1608[(unsigned int)num*16+pos];
 
- for(t=0;t<8;t++)
 
- {
 
- if(temp&0x01)POINT_COLOR=colortemp;
 
- else POINT_COLOR=BACK_COLOR;
 
- LCD_WR_DATA(POINT_COLOR);
 
- temp>>=1;
 
- x++;
 
- }
 
- x=x0;
 
- y++;
 
- }
 
- }
实现数据显示的函数为:
- void LCD_ShowNum(unsigned int x,unsigned int y,unsigned int num,char len)
 
- {
 
- char t,temp;
 
- char enshow=0;
 
- num=(unsigned int)num;
 
- for(t=0;t<len;t++)
 
- {
 
- temp=(num/mypow(10,len-t-1))%10;
 
- if(enshow==0&&t<(len-1))
 
- {
 
- if(temp==0)
 
- {
 
- LCD_ShowChar(x+(8*t),y,' ',0);
 
- continue;
 
- }
实现字符串显示的函数为:
- void LCD_ShowString(unsigned int x,unsigned int y,const char *p)
 
- {
 
- while(*p!='\0')
 
- {
 
- if(x>LCD_W-16){x=0;y+=16;}
 
- if(y>LCD_H-16){y=x=0;}
 
- LCD_ShowChar(x,y,*p,0);
 
- x+=8;
 
- p++;
 
- }
 
- }
由于在进行多通道数据采集时会遇到引脚使用出现重叠的问题,为此这里仅使用PA2和PA4这2个引脚进行双通道的数据采集,这个引脚分别处于J5和J6上,见图3所示。
 
 
图3  A/D采集所用接口
实现双通道数据采集及显示的主程序为:
- int main(void)
 
- {
 
- __IO uint32_t index = 0;
 
- nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
 
- system_clock_config();
 
- at32_board_init();
 
- at32_led_off(LED2);
 
- at32_led_off(LED3);
 
- at32_led_off(LED4);
 
- p_adc1_ordinary = adc1_ordinary_valuetab;
 
- uart_print_init(115200);
 
- gpio_config();
 
- TFT_config();
 
- tft_Init();
 
- LCD_Clear(RED);
 
- BACK_COLOR=RED;
 
- POINT_COLOR=YELLOW ;
 
- LCD_ShowString(20,10,"AT32M412 TEST!");
 
- LCD_ShowString(20,40,"adc1_channel_2 =");
 
- LCD_ShowString(20,60,"adc1_channel_4 =");
 
- adc_config();
 
- printf("use_polling_get_conversion_data \r\n");
 
- adc_ordinary_software_trigger_enable(ADC1, TRUE);
 
- while(1)
 
- {
 
- while(adc_flag_get(ADC1, ADC_OCCE_FLAG) == RESET);
 
- *(p_adc1_ordinary++) = adc_ordinary_conversion_data_get(ADC1);
 
- index++;
 
- if((adc1_overflow_flag != 0) || (adc1_conversion_fail_flag != 0))
 
- {
 
- adc_enable(ADC1, FALSE);
 
- at32_led_on(LED3);
 
- at32_led_on(LED4);
 
- printf("error occur\r\n");
 
- printf("adc1_overflow_flag = %d\r\n",adc1_overflow_flag);
 
- printf("adc1_conversion_fail_flag = %d\r\n",adc1_conversion_fail_flag);
 
- index = 0;
 
- adc_enable(ADC1, TRUE);
 
- }
 
- if(index%2 == 0)
 
- {
 
- LCD_ShowNum(160,40,adc1_ordinary_valuetab[0],4);
 
- LCD_ShowNum(160,60,adc1_ordinary_valuetab[1],4);
 
- delay_sec(1);
 
- p_adc1_ordinary = adc1_ordinary_valuetab;
 
- adc_ordinary_software_trigger_enable(ADC1, TRUE);
 
- }
 
- }
 
- }
经程序的编译和下载,其测试效果如图4所示。为测试通道2的响应效果,是将输入接到GND,说明检测值完全可得到零。
 
图4 测试效果