- 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 测试效果