stm32白屏_新人求助!!stm32板子外接TFT LCD一直白屏,不读写程序

本文档描述了一位开发者在使用STM32板子外接TFT LCD时遇到白屏问题的情况,详细展示了LCD相关的GPIO配置、FSMC设置、初始化函数等代码,并试图通过显示字符和字符串来验证LCD功能,但仍然遇到问题。开发者正在寻求解决方案。

#include "stm32f10x.h"

#include "bsp_ili9341_lcd.h"

//#include "bsp_usart1.h"

extern void Lcd_Delay(__IO uint32_t nCount);

uint32_t n;

int main(void)

{

LCD_Init();

//Lcd_Delay(0xAFFf>>4);

LCD_Clear(0, 0, 240, 320, YELLOW);

LCD_DispChar(60, 60, 'A', RED);

LCD_DispStr(10, 10, (uint8_t *)"This is a lcd demo to display ascii", RED);

LCD_DispStr(40, 100, (uint8_t *)"count:", RED);

for( n=0; n<500000; n++ )

{

LCD_DisNum(100, 100, n, RED);

Lcd_Delay(0xAFFf>>4);

}

while( 1 );

}

#include "bsp_ili9341_lcd.h"

#include "ascii.h"

#define DEBUG_DELAY()

void Lcd_Delay(__IO uint32_t nCount)

{

for(; nCount != 0; nCount--);

}

void LCD_GPIO_Config(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);

RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE

| RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOG

| RCC_APB2Periph_GPIOF , ENABLE);

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;

GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 ;

GPIO_Init(GPIOG, &GPIO_InitStructure);

/*LCD引脚,FSMC-D0~D15: PD 14 15 0 1,PE 7 8 9 10 11 12 13 14 15,PD 8 9 10*/

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_8 | GPIO_Pin_9 |

GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15;

GPIO_Init(GPIOD, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 |

GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 |

GPIO_Pin_15;

GPIO_Init(GPIOE, &GPIO_InitStructure);

/ *LCD控制线

PD4-FSMC_NOE   :LCD-RD

* PD5-FSMC_NWE   :LCD-WR

* PG12-FSMC_NE4  :LCD-CS

* PG0-FSMC_A10   :LCD-DC

*/

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;

GPIO_Init(GPIOD, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;

GPIO_Init(GPIOD, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;

GPIO_Init(GPIOG, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;

GPIO_Init(GPIOG, &GPIO_InitStructure);

GPIO_ResetBits(GPIOB, GPIO_Pin_1);

}

void LCD_FSMC_Config(void)

{

FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;

FSMC_NORSRAMTimingInitTypeDef  p;

p.FSMC_AddressSetupTime = 0x02;

p.FSMC_AddressHoldTime = 0x00;

p.FSMC_DataSetupTime = 0x05;

p.FSMC_BusTurnAroundDuration = 0x00;

p.FSMC_CLKDivision = 0x00;

p.FSMC_DataLatency = 0x00;

p.FSMC_AccessMode = FSMC_AccessMode_B;         // Ò»°ãʹÓÃģʽBÀ´¿ØÖÆLCD

FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;

FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;

//FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;

FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_NOR;

FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;

FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;

FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;

FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;

FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;

FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;

FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;

FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;

FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;

FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;

FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;

FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);

FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);

}

void LCD_Rst(void)

{

GPIO_ResetBits(GPIOG, GPIO_Pin_11);         //µÍµçƽ¸´Î»

Lcd_Delay(0xAFFf<<2);

GPIO_SetBits(GPIOG, GPIO_Pin_11);

Lcd_Delay(0xAFFf<<2);

}

void LCD_REG_Config(void)

{太长了,官方的应该没错}

void LCD_Init(void)

{

LCD_GPIO_Config();

LCD_FSMC_Config();

LCD_Rst();

LCD_REG_Config();

}

void LCD_Clear(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color)

{

uint32_t i = 0;

/* column address control set */

LCD_ILI9341_CMD(0X2A);

LCD_ILI9341_Parameter( x >> 8 );         /* Ïȸß8λ£¬È»ºóµÍ8λ */

LCD_ILI9341_Parameter( x & 0xff );                 /* column start   */

LCD_ILI9341_Parameter( (x+width-1) >> 8 );   /* column end   */

LCD_ILI9341_Parameter( (x+width-1) & 0xff );

/* page address control set */

LCD_ILI9341_CMD(0X2B);

LCD_ILI9341_Parameter( y >> 8 );                        /* page start   */

LCD_ILI9341_Parameter( y & 0xff );

LCD_ILI9341_Parameter( (y+height-1) >> 8);  /* page end     */

LCD_ILI9341_Parameter( (y+height-1) & 0xff);

/* memory write */

LCD_ILI9341_CMD(0x2c);

for( i=0; i < width*height; i++ )

{

LCD_WR_Data( color );

//Delay(0x0FFf);

}

}

void LCD_SetCursor(uint16_t x, uint16_t y)

{

LCD_ILI9341_CMD(0X2A);

LCD_ILI9341_Parameter(x>>8);

LCD_ILI9341_Parameter(x&0xff);

LCD_ILI9341_Parameter(x>>8);

LCD_ILI9341_Parameter(x&0xff);

LCD_ILI9341_CMD(0X2B);

LCD_ILI9341_Parameter(y>>8);

LCD_ILI9341_Parameter(y&0xff);

LCD_ILI9341_Parameter(y>>8);

LCD_ILI9341_Parameter(y&0xff);

}

void LCD_OpenWindow(uint16_t x, uint16_t y, uint16_t width, uint16_t height)

{

LCD_ILI9341_CMD(0X2A);

LCD_ILI9341_Parameter( x >> 8 );

LCD_ILI9341_Parameter( x & 0xff );

LCD_ILI9341_Parameter( (x+width-1) >> 8 );

LCD_ILI9341_Parameter( (x+width-1) & 0xff );

LCD_ILI9341_CMD(0X2B);

LCD_ILI9341_Parameter( y >> 8 );

LCD_ILI9341_Parameter( y & 0xff );

LCD_ILI9341_Parameter( (y+height-1) >> 8);

LCD_ILI9341_Parameter( (y+height-1) & 0xff);

}

void LCD_SetPoint(uint16_t x , uint16_t y , uint16_t color)

{

LCD_SetCursor(x, y);

LCD_ILI9341_CMD(0x2c);

LCD_WR_Data(color);

}

uint16_t LCD_RD_data(void)

{

uint16_t R=0, G=0, B=0 ;

R = *(__IO uint16_t *)Bank1_LCD_D;           /*FIRST READ OUT DUMMY DATA*/

R = *(__IO uint16_t *)Bank1_LCD_D;          /*READ OUT RED DATA  */

B = *(__IO uint16_t *)Bank1_LCD_D;          /*READ OUT BLACK DATA*/

G = *(__IO uint16_t *)Bank1_LCD_D;          /*READ OUT GREEN DATA*/

return (((R>>11)<<11) | ((G>>10)<<5) | (B>>11));

}

uint16_t LCD_GetPoint(uint16_t x , uint16_t y)

{

uint16_t temp;

LCD_SetCursor(x, y);

LCD_ILI9341_CMD(0x2e);

temp=LCD_RD_data();

return (temp);

}

void LCD_DispChar(uint16_t x, uint16_t y, uint8_t ascii, uint16_t color)

{

uint16_t page, column, temp, i;

i = ascii - ' ';

LCD_OpenWindow(x, y, STR_WIDTH, STR_HEIGHT);

LCD_ILI9341_CMD(0X2C);

for( page=0; page < STR_HEIGHT; page++ )

{

temp = asc2_1206[i];

for( column=0; column < STR_WIDTH; column++ )

{

if( temp & 0x01 )

{

LCD_WR_Data( color );

}

else

{

LCD_WR_Data( BACKGROUND );

}

temp >>= 1;

}

}

}

void LCD_DispStr(uint16_t x, uint16_t y, uint8_t *pstr, uint16_t color)

{

while( *pstr != '\0' )

{

if( x > (COLUMN-STR_WIDTH) )

{

x = 0;

y += STR_HEIGHT;

}

if( y > (PAGE-STR_HEIGHT) )

{

x = 0;

y = 0;

}

LCD_DispChar(x, y, *pstr, color);

x += STR_WIDTH;

pstr++;

}

}

void LCD_DisNum(uint16_t x, uint16_t y, uint32_t num, uint16_t color)

{

uint32_t length = 0, temp = 0;

temp = num;

if( temp == 0 )

{

LCD_DispChar(x, y, '0', color);

return;

}

while( temp )

{

temp /= 10;

length ++;

}

while( num )

{

LCD_DispChar((x+STR_WIDTH*(length--)-STR_WIDTH), y, (num%10)+'0', color);

num /= 10;

}

}

这个是我用的例程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值