OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3638|回复: 11

【求助】STM32F407VE通过TFTLCD采样数据显示程序有问题

[复制链接]

10

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2015-5-3
在线时间
29 小时
发表于 2020-5-9 17:21:00 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 HA 于 2020-5-9 17:21 编辑

      本人不入门的小白,最近使用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=%d\r\n",channel,adc_ch);
        for(t=0;t<times;t++)
        {
                adc+=DAT;
                delay_ms(1);
        }
        ADC_Sec=(adc/times)*((Vref/1000/1000)/4095);//单位“V”
//        printf("ADC转换值(ADC_Value())=%x 加权平均值(adc)=%d  十进制数(ADC_Sec)=%d\r\n",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
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2020-5-3
在线时间
0 小时
发表于 2020-5-9 17:21:01 | 显示全部楼层
回复

使用道具 举报

0

主题

67

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2018-12-27
在线时间
0 小时
发表于 2020-5-9 17:21:02 | 显示全部楼层
不懂,帮顶,勇于提问总是好的!!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2020-5-9 23:15:14 | 显示全部楼层
IO有冲突没有啊?
回复

使用道具 举报

10

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2015-5-3
在线时间
29 小时
 楼主| 发表于 2020-5-11 08:59:08 | 显示全部楼层
端口没有冲突啊,显示屏用的是PB3--PB5、PB12-PB15    都不涉及ADC的IO啊,别的设备我也没有接,就一个显示屏。还有就是调试也进不去ADC函数。希望原子哥帮忙看看,谢谢
回复

使用道具 举报

10

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2015-5-3
在线时间
29 小时
 楼主| 发表于 2020-5-11 15:43:49 | 显示全部楼层
后来用原子哥的ADC历程修改一下,就可以显示了,但是有一个问题:
      把ADC采样到的数据转换成十进制数用:
      u16  ADC_Vref=3300     (全局变量 )   我这样做的目的是方便以后改变参考电压,
      float   ADC_Sec;
    ADC_Sec=(float)adcx*(3.3/4096)  这条语句就没问题,
用ADC_Sec=(float)adcx*(ADC_Vref/1000/4096) 这条语就不行(数值是“0“),
根据对每一次计算  找到   ADC_Vref/1000  结果直接输出“0”



如果大神看到了问题所在  请不吝赐教,详细解释。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2020-5-12 01:30:37 | 显示全部楼层
HA 发表于 2020-5-11 15:43
后来用原子哥的ADC历程修改一下,就可以显示了,但是有一个问题:
      把ADC采样到的数据转换成十进制数 ...

ADC_Vref 是int类型么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

10

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2015-5-3
在线时间
29 小时
 楼主| 发表于 2020-5-12 09:33:43 | 显示全部楼层
本帖最后由 HA 于 2020-5-12 10:22 编辑
正点原子 发表于 2020-5-12 01:30
ADC_Vref 是int类型么?

ADC_Vref 的变量改为SC16    S16   VSC16   VS16    都不行
但是对这个变量进行调用时可以显示 bec52c3c8e5dd9293a5aaf67e73dc43.jpg

没问题的语句

没问题的语句
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2020-5-13 01:35:20 | 显示全部楼层
HA 发表于 2020-5-12 09:33
ADC_Vref 的变量改为SC16    S16   VSC16   VS16    都不行
但是对这个变量进行调用时可以显示

简化这行代码, 就知道bug在哪里了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

10

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2015-5-3
在线时间
29 小时
 楼主| 发表于 2020-5-17 13:32:24 | 显示全部楼层
正点原子 发表于 2020-5-13 01:35
简化这行代码, 就知道bug在哪里了。

还是没有调试出来,
  
还有一个问题就是要显示的内容必须在被调用的数组之上,否则连显示都不显示,而且也不能显示数据  列如要显示的“ADC_SEC”数值(如下图)
016b51158cfc4b5fe26212dbe3ee306.png
bc3a74797c696f75a4b68abde6a78db.png
288f4dd84ef5d75609c722f806d79f0.png
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2020-5-18 00:57:07 | 显示全部楼层
HA 发表于 2020-5-17 13:32
还是没有调试出来,
  
还有一个问题就是要显示的内容必须在被调用的数组之上,否则连显示都不显示,而 ...

简化的不够彻底
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2020-5-25
在线时间
7 小时
发表于 2020-5-25 00:41:29 | 显示全部楼层
楼主好!我是业余喜欢电子,这段时间也是再弄st7796s四寸屏的显示,是stm32F407VGT6,界面的显示一直不能完整,有时还白屏,驱动是用的卖家案例里的,您能共享下您驱动部分的代码么!谢谢了!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-1 18:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表