本人不入门的小白,最近使用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
|