本人不入门的小白,最近使用STM32F407VE采样数据并通过TFTLCD显示。数据采集系统的显示框架正常,可以正常修改内容。ADC采样部分参考原子的设计进行修改。但是主程序一旦对ADC进行操作(例如:ADC初始化、ADC相关函数的调用等),屏幕就不显示了,就连运行指示灯都不显示了。程序编译无错误无警告。怀疑根本就没有进入主程序。 希望大神们帮忙看看是什么原因。 1、硬件平台:STM32F407VET6 2、显示屏:4寸TFT_LCD 驱动IC:ST7796S SPI通信 3、编程平台:keil V5 4、引脚定义: // LCD模块 STM32单片机 // SDI(MOSI) 接 PB5 //液晶屏SPI总线数据写信号 // SDO(MISO) 接 PB4 //液晶屏SPI总线数据读信号,如果不需要读,可以不接线 //=======================================液晶屏控制线接线==========================================// // LCD模块 STM32单片机 // LED 接 PB13 //液晶屏背光控制信号,如果不需要控制,接5V或3.3V // SCK 接 PB3 //液晶屏SPI总线时钟信号 // DC/RS 接 PB14 //液晶屏数据/命令控制信号 // RST 接 PB12 //液晶屏复位控制信号 // CS 接 PB15 //液晶屏片选控制信号 不对ADC进行操作 这是主程序 #include "delay.h" #include "sys.h" #include "lcd.h" #include "led.h" #include "touch.h" #include "gui.h" #include "ADC1.H" extern u32 Vref;//ADC基准电压(uV) const u8 U_max[4]={33,50,100,240}; int main(void) { NVIC_PriorityGroupConfig(2); delay_init(168); //初始化延时函数 LCD_Init(); //液晶屏初始化 LED_Init(); LED0=LED_ON;//LED0点亮 TFT_ADC_INIT(); LED1=LED_ON;//LED0点亮 LCD_direction(1); waveform_display_main1(); waveform_display_main2(); ADC_DAT(1,10); while(1) { } } 这是ADC程序 #include "ADC1.H" #include "stdio.h" #include "delay.h" u32 Vref=3300000;//ADC基准电压(uV) u16 adc_ch; void TFT_ADC_INIT(void) { ADC_CommonInitTypeDef ADC_CommonInitStructure; GPIO_InitTypeDef GPIO_InitStructure; ADC_InitTypeDef ADC_InitStructure; //时钟使能 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//使能GPIOA时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);//使能GPIOB时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);//使能GPIOC时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); //使能ADC1时钟 //ADC时钟复位控制 == ADC_DeInit(); RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE); //复位ADC1时钟 RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);//复位ADC1时钟结束 //ADC相关的GPIO配置 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//GPIOA0-GPIOA7作为模拟输入端口模式 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//无上下拉 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure);//GPIOA初始化配置 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//GPIOB0-GPIOB2作为模拟输入端口模式 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//无上下拉 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitStructure);//GPIOB初始化配置 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//GPIOC0-GPIOC5作为模拟输入端口模式 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//无上下拉 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC,&GPIO_InitStructure);//GPIOC初始化配置 //ADCs通用配置初始化 ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式 ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;//预分频4分频。ADCCLK=PCLK2/4=84/4=21Mhz,ADC时钟最好不要超过36Mhz ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;//两个采样阶段之间的延迟5个时钟 ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; //不使能DMA传输 ADC_CommonInit(&ADC_CommonInitStructure);//初始化ADCs通用配置 //ADC1初始化配置 ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12位ADC工作模式 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//转换结果右对齐 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//关闭连续转换 ADC_InitStructure.ADC_ScanConvMode = DISABLE;//非扫描模式 ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//无外部触发,使用软件触发 ADC_InitStructure.ADC_NbrOfConversion=16; ADC_Init(ADC1,&ADC_InitStructure); //初始化ADC1配置 ADC_Cmd(ADC1,ENABLE);//使能ADC } u16 ADC_Value(u16 adc_ch) { ADC_RegularChannelConfig(ADC1,adc_ch,1,ADC_SampleTime_3Cycles); ADC_SoftwareStartConv(ADC1); while(!ADC_GetITStatus(ADC1,ADC_IT_EOC));//如果ADC转换完成标志位被置位 return ADC_GetConversionValue(ADC1); } float ADC_DAT(u8 channel,u8 times) { u8 t; u16 ADC_Sec,DAT; u32 adc; switch(channel) { case 0: adc_ch=ADC_Channel_0; DAT=ADC_Value(adc_ch); break; case 1: adc_ch=ADC_Channel_1; DAT=ADC_Value(adc_ch); break; case 2: adc_ch=ADC_Channel_2; DAT=ADC_Value(adc_ch); break; case 3: adc_ch=ADC_Channel_3; DAT=ADC_Value(adc_ch); break; case 4: adc_ch=ADC_Channel_4; DAT=ADC_Value(adc_ch); break; case 5: adc_ch=ADC_Channel_5; DAT=ADC_Value(adc_ch); break; case 6: adc_ch=ADC_Channel_6; DAT=ADC_Value(adc_ch); break; case 7: adc_ch=ADC_Channel_7; DAT=ADC_Value(adc_ch); break; case 8: adc_ch=ADC_Channel_8; DAT=ADC_Value(adc_ch); break; case 9: adc_ch=ADC_Channel_9; DAT=ADC_Value(adc_ch); break; case 10:adc_ch=ADC_Channel_10; DAT=ADC_Value(adc_ch); break; case 11:adc_ch=ADC_Channel_11; DAT=ADC_Value(adc_ch); break; case 12:adc_ch=ADC_Channel_12; DAT=ADC_Value(adc_ch); break; case 13:adc_ch=ADC_Channel_13; DAT=ADC_Value(adc_ch); break; case 14:adc_ch=ADC_Channel_14; DAT=ADC_Value(adc_ch); break; case 15:adc_ch=ADC_Channel_15; DAT=ADC_Value(adc_ch); break; } printf("channel=%d adc_ch=%drn",channel,adc_ch); for(t=0;t adc+=DAT; delay_ms(1); } ADC_Sec=(adc/times)*((Vref/1000/1000)/4095);//单位“V” // printf("ADC转换值(ADC_Value())=%x 加权平均值(adc)=%d 十进制数(ADC_Sec)=%drn",ADC_Value(),adc,ADC_Sec); return ADC_Sec; } #ifndef __ADC1_H #define __ADC1_H #include "sys.h" void TFT_ADC_INIT(void); u16 ADC_Value(u16 adc_ch); float ADC_DAT(u8 channel,u8 times); #endif |

举报
举报
更多回帖