STM32/STM8技术论坛
直播中

李建

12年用户 158经验值
擅长:电源/新能源
私信 关注
[问答]

STM32F407VE通过TFTLCD采样数据显示程序有问题



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





我来回答


cc6002d9c673c60fefe94db7191c8c8.jpg (114.98 KB, 下载次数: 2)




回帖(2)

人中狼

2020-5-9 17:56:42
waveform_display_main1();      
        waveform_display_main2();
        ADC_DAT(1,10);
        while(1)
        {
         
        }
显示测量等需要更新显示的函数应该放在while(1)里
举报

jinniuxing

2020-6-1 10:38:13
谢谢分享,谢谢分享!
举报

更多回帖

发帖
×
20
完善资料,
赚取积分