Nasip olursa stm32f407 ile ilgili sorunlarımı bu başlıkta yazmak istiyorum.
Bu gün elimde bulunan SSD1963 ÇipSetli 4.3" TFT ve Stm32f407 Discovery için Delikli Pertinaks ile bir board hazırladım. Boardda discovery ile TFT LCD bağlantılarını yaptım. Amacım FSMC ile TFT yi kullanmak.
Besleme Dışında Discovery ile TFT arasında yaptığım bağlantılar bu şekilde
PD14 -----FSMC_D0 ----TFT_D0
PD15 -----FSMC_D1 ----TFT_D1
PD0 -----FSMC_D2 ----TFT_D2
PD1 -----FSMC_D3 ----TFT_D3
PE7 -----FSMC_D4 ----TFT_D4
PE8 -----FSMC_D5 ----TFT_D5
PE9 -----FSMC_D6 ----TFT_D6
PE10 -----FSMC_D7 ----TFT_D7
PE11 -----FSMC_D8 ----TFT_D8
PE12 -----FSMC_D9 ----TFT_D9
PE13 -----FSMC_D10 ----TFT_D10
PE14 -----FSMC_D11 ----TFT_D11
PE15 -----FSMC_D12 ----TFT_D12
PD8 -----FSMC_D13 ----TFT_D13
PD9 -----FSMC_D14 ----TFT_D14
PD10 -----FSMC_D15 ----TFT_D15
PD4 -----FSMC_NOE ----TFT_RD
PD5 -----FSMC_NWE ----TFT_WR
PD7 -----FSMC_NE1 ----TFT_CS
PD11 -----FSMC_A16 ----TFT_RS
Bu bağlantıları Kullandığım TFT Kütüphanesininden çıkardım
Kullandığım Kütüphane ise Bu sayfada paylaşılan kütüphane
https://www.picproje.org/index.php/topic,46031.0.html (https://www.picproje.org/index.php/topic,46031.0.html)
Kütüphane ile Genel TFT ayarları dışında oynama yapmadım. Sadece TFT nin horizontal ve Vertical Tarama ayarlarını 480x272 TFT ye göre ayarladım. Kodun orjinali 800x480 TFT ye göreydi zaten.
/* Includes ------------------------------------------------------------------*/
#include "SSD1963.h"
#define ABS(X) ((X) > 0 ? (X) : -(X))
unsigned long color1=0;
unsigned int HDP=479; //Horizontal Display Period
unsigned int HT=525; //Horizontal Total
unsigned int HPS=43; //LLINE Pulse Start Position
unsigned int LPS=8; //Horizontal Display Period Start Position
unsigned char HPW=10; //LLINE Pulse Width
unsigned int VDP=271; //Vertical Display Period
unsigned int VT=285; //Vertical Total
unsigned int VPS=12; //LFRAME Pulse Start Position
unsigned int FPS=4; //Vertical Display Period Start Positio
unsigned char VPW=10; //LFRAME Pulse Width
extern u16 POINT_COLOR = BLACK;
extern u16 BACK_COLOR = WHITE;
static sFONT *LCD_Currentfonts;
/* Global variables to set the written text color */
static __IO uint16_t TextColor = 0x0000, BackColor = 0xFFFF;
/**
* @}
*/
#ifndef USE_Delay
static void delay(__IO uint32_t nCount);
#endif /* USE_Delay*/
void SSD1963_LCD_Init(void)
{
__IO uint32_t lcdid = 0;
/* Configure the LCD Control pins --------------------------------------------*/
LCD_CtrlLinesConfig();
/* Configure the FSMC Parallel interface -------------------------------------*/
LCD_FSMCConfig();
/* Start Initial Sequence ------------------------------------------------*/
GPIOC->BSRRL = GPIO_BSRR_BS_6;
_delay_(5);
GPIOC->BSRRH = GPIO_BSRR_BS_6;
_delay_(5);
GPIOC->BSRRL = GPIO_BSRR_BS_6;
_delay_(5);
/******************************************************/
LCD_WriteCommand(0x0001); // software reset
LCD_WriteCommand(0x0001); // software reset
_delay_(5);
LCD_WriteCommand(0x00E2); // PLL ayar bolumu.
LCD_WriteData(0x0023); //23
LCD_WriteData(0x0001); //N degeri Bolucu oran1
LCD_WriteData(0x0004); //4
LCD_WriteCommand(0x00E0); // Start PLL
LCD_WriteData(0x0001);
_delay_(5);
LCD_WriteCommand(0x00E0); // Lock PLL
LCD_WriteData(0x0003);
_delay_(5);
// LCD_WriteCommand(0x0001); // software reset
_delay_(5);
LCD_WriteCommand(0x00E6); // Set_lshift_freg
LCD_WriteData(0x0004); // 00/04
LCD_WriteData(0x00DD); // 93/DD
LCD_WriteData(0x00DC); // E0/DC
/************************************************
LCD Modu ayarlama
************************************************/
LCD_WriteCommand(0x00B0); // Set Lcd_Mode
LCD_WriteData(0x0000);
LCD_WriteData(0x0000);
LCD_WriteData((HDP>>8)&0X00FF); //Set HDP
LCD_WriteData(HDP&0X00FF);
LCD_WriteData((VDP>>8)&0X00FF); //Set VDP
LCD_WriteData(VDP&0X00FF);
LCD_WriteData(0x0000);
LCD_WriteCommand(0x00B4); //HSYNC Set_hori_period.
LCD_WriteData((HT>>8)&0X00FF); //Set HT
LCD_WriteData(HT&0X00FF);
LCD_WriteData((HPS>>8)&0X00FF); //Set HPS
LCD_WriteData(HPS&0X00FF);
LCD_WriteData(HPW); //Set HPW
LCD_WriteData((LPS>>8)&0X00FF); //Set HPS
LCD_WriteData(LPS&0X00FF);
LCD_WriteData(0x0000);
LCD_WriteCommand(0x00B6); //VSYNC Set_Vrt_period.
LCD_WriteData((VT>>8)&0X00FF); //Set VT
LCD_WriteData(VT&0X00FF);
LCD_WriteData((VPS>>8)&0X00FF); //Set VPS
LCD_WriteData(VPS&0X00FF);
LCD_WriteData(VPW); //Set VPW
LCD_WriteData((FPS>>8)&0X00FF); //Set FPS
LCD_WriteData(FPS&0X00FF);
LCD_WriteCommand(0x002a); //SET column address
LCD_WriteData(0x0000); //SET start column address=0
LCD_WriteData(0x0000);
LCD_WriteData(0x0001); //SET end column address=479
LCD_WriteData(0x00df);
LCD_WriteCommand(0x002b); //SET page address
LCD_WriteData(0x0000); //SET start page address=0
LCD_WriteData(0x0000);
LCD_WriteData(0x0001); //SET end page address=271
LCD_WriteData(0x000f);
LCD_WriteCommand(0x00BA); //Set_gpio_value
LCD_WriteData(0x000F); //GPIO[3:0] out 1
LCD_WriteCommand(0x00B8); //Set_gpio_conf
LCD_WriteData(0x0007); //GPIO3=input, GPIO[2:0]=output
LCD_WriteData(0x0001); //GPIO0 normal
LCD_WriteCommand(0x0036); //rotation
LCD_WriteData(0x0080);
LCD_WriteCommand(0x00F0); //pixel data interface
LCD_WriteData(0x0003);
_delay_(5);
LCD_WriteCommand(0x0026); //display on
LCD_WriteData(0x0001);
// LCD_WriteCommand(0x0029); //display on
LCD_WriteCommand(0x00BE); //set PWM for B/L
LCD_WriteData(0x0006);
LCD_WriteData(0x0080);
LCD_WriteData(0x0001);
LCD_WriteData(0x00f0);
LCD_WriteData(0x0000);
LCD_WriteData(0x0000);
LCD_WriteCommand(0x00d0); //set_dbc_conf
LCD_WriteData(0x0009); // d
LCD_WriteCommand(0x0029); //display on
}
/*******************************************************************************
* Hazirlayan : Mehmet
* Function Name :
* Kullanisi :
* Output :
* Return :
*******************************************************************************/
void LCD_SetColors(__IO uint16_t _TextColor, __IO uint16_t _BackColor)
{
TextColor = _TextColor;
BackColor = _BackColor;
}
/*******************************************************************************
* Hazirlayan : Mehmet
* Function Name :
* Kullanisi :
* Output :
* Return :
*******************************************************************************/
void LCD_GetColors(__IO uint16_t *_TextColor, __IO uint16_t *_BackColor)
{
*_TextColor = TextColor; *_BackColor = BackColor;
}
/*******************************************************************************
* Hazirlayan : Mehmet
* Function Name :
* Kullanisi :
* Output :
* Return :
*******************************************************************************/
void LCD_SetTextColor(__IO uint16_t Color)
{
TextColor = Color;
}
/*******************************************************************************
* Hazirlayan : Mehmet
* Function Name :
* Kullanisi :
* Output :
* Return :
*******************************************************************************/
void LCD_SetBackColor(__IO uint16_t Color)
{
BackColor = Color;
}
/*******************************************************************************
* Hazirlayan : Mehmet
* Function Name :
* Kullanisi :
* Output :
* Return :
*******************************************************************************/
void LCD_SetFont(sFONT *fonts)
{
LCD_Currentfonts = fonts;
}
/*******************************************************************************
* Hazirlayan : Mehmet
* Function Name :
* Kullanisi :
* Output :
* Return :
*******************************************************************************/
sFONT *LCD_GetFont(void)
{
return LCD_Currentfonts;
}
/*******************************************************************************
* Hazirlayan : Mehmet
* Function Name :
* Kullanisi :
* Output :
* Return :
*******************************************************************************/
void LCD_DrawChar(uint16_t Xpos, uint16_t Ypos, const uint16_t *c)
{
uint32_t index = 0, i = 0;
uint16_t Xaddress = 0;
Xaddress = Xpos;
SSD1963_Address_set(Xaddress,Ypos,Xaddress,Ypos);
for(index = 0; index < LCD_Currentfonts->Height; index++)
{
for(i = 0; i < LCD_Currentfonts->Width; i++)
{
if((((c[index] & ((0x80 << ((LCD_Currentfonts->Width / 12 ) * 8 ) ) >> i)) == 0x00) &&(LCD_Currentfonts->Width <= 12))||
(((c[index] & (0x1 << i)) == 0x00)&&(LCD_Currentfonts->Width > 12 )))
{
LCD_WriteData(BACK_COLOR);
}
else
{
LCD_WriteData(POINT_COLOR);
}
}
Xaddress++;
SSD1963_Address_set(Xaddress,Ypos,Xaddress,Ypos);
}
}
/*******************************************************************************
* Hazirlayan : Mehmet
* Function Name :
* Kullanisi :
* Output :
* Return :
*******************************************************************************/
void LCD_DisplayChar(uint16_t Line, uint16_t Column, uint8_t Ascii)
{
Ascii -= 32;
LCD_DrawChar(Line, Column, &LCD_Currentfonts->table[Ascii * LCD_Currentfonts->Height]);
}
/*******************************************************************************
* Hazirlayan : Mehmet
* Function Name :
* Kullanisi :
* Output :
* Return :
*******************************************************************************/
void LCD_WriteCommand(uint16_t LCD_Reg)
{
/* Write 16-bit Reg */
LCD->LCD_REG = LCD_Reg;
}
void LCD_WriteData(uint16_t LCD_RegValue)
{
LCD->LCD_RAM = LCD_RegValue;
}
void SendData(uint32_t color)
{
LCD_WriteData((color)>>16);
LCD_WriteData((color)>>8);
LCD_WriteData(color);
}
void windowSet(uint16_t s_x,uint16_t e_x,uint16_t s_y,uint16_t e_y)
{
LCD_WriteCommand(0x2a);
LCD_WriteData((s_x)>>8);
LCD_WriteData(s_x);
LCD_WriteData((e_x)>>8);
LCD_WriteData(e_x);
LCD_WriteCommand(0x2b);
LCD_WriteData((s_y)>>8);
LCD_WriteData(s_y);
LCD_WriteData((e_y)>>8);
LCD_WriteData(e_y);
}
void FULL_ON(uint32_t data)
{
uint16_t x,y;
windowSet(0x0000,0x013f,0x0000,0x00ef);
LCD_WriteCommand(0x2c);
for(x=0;x<320;x++)
{
for(y=0;y<240;y++)
{
SendData(data);
}
}
}
void TFT_CLEAR(unsigned int color)
{
unsigned int l=480,w;
LCD_WriteCommand(0x002A);
LCD_WriteData(0);
LCD_WriteData(0);
LCD_WriteData(HDP>>8);
LCD_WriteData(HDP&0x00ff);
LCD_WriteCommand(0x002b);
LCD_WriteData(0);
LCD_WriteData(0);
LCD_WriteData(VDP>>8);
LCD_WriteData(VDP&0x00ff);
LCD_WriteCommand(0x002c);
while(l--)
{
for(w=0;w<272;w++)
{
LCD_WriteData(color);
}
}
}
/***************************************************************/
void TFT_Fill(unsigned int xsta,unsigned int ysta,unsigned int xend,unsigned int yend,unsigned int color)
{
unsigned long n;
n=(unsigned long)(yend-ysta+1)*(xend-xsta+1);
LCD_WriteCommand(0x002A);
LCD_WriteData(xsta>>8);
LCD_WriteData(xsta&0x00ff);
LCD_WriteData(xend>>8);
LCD_WriteData(xend&0x00ff);
LCD_WriteCommand(0x002b);
LCD_WriteData(ysta>>8);
LCD_WriteData(ysta&0x00ff);
LCD_WriteData(yend>>8);
LCD_WriteData(yend&0x00ff);
LCD_WriteCommand(0x002c);
while(n--)LCD_WriteData(color);
}
void TFT_DrawPoint(unsigned int x,unsigned int y,unsigned int fontcolor)
{
LCD_WriteCommand(0x002A);
LCD_WriteData(x>>8);
LCD_WriteData(x&0x00ff);
LCD_WriteData(HDP>>8);
LCD_WriteData(HDP&0x00ff);
LCD_WriteCommand(0x002b);
LCD_WriteData(y>>8);
LCD_WriteData(y&0x00ff);
LCD_WriteData(VDP>>8);
LCD_WriteData(VDP&0x00ff);
LCD_WriteCommand(0x002c);
LCD_WriteData(fontcolor);
}
/*******************************************************************************
* Hazirlayan : Mehmet
* Function Name : SSD1963_Address_set(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2)
* Kullanisi :
* Output :
* Return :
*******************************************************************************/
void SSD1963_Address_set(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2)
{
LCD_WriteCommand(0x002A);
LCD_WriteData(x1>>8);
LCD_WriteData(x1&0x00ff);
LCD_WriteData(x2>>8);
LCD_WriteData(x2&0x00ff);
LCD_WriteCommand(0x002b);
LCD_WriteData(y1>>8);
LCD_WriteData(y1&0x00ff);
LCD_WriteData(y2>>8);
LCD_WriteData(y2&0x00ff);
LCD_WriteCommand(0x002c);
}
/*******************************************************************************
* Hazirlayan : Mehmet
* Function Name : SSD1963_LCD_DrawPoint(uint16_t x,uint16_t y)
* Kullanisi :
* Output :
* Return :
*******************************************************************************/
void SSD1963_LCD_DrawPoint(uint16_t x,uint16_t y)
{
SSD1963_Address_set(x,y,x,y);
LCD_WriteData(POINT_COLOR);
}
/*******************************************************************************
* Hazirlayan : Mehmet
* Function Name : SSD1963_LCD_DrawPoint_big(uint16_t x,uint16_t y)
* Kullanisi :
* Output :
* Return :
*******************************************************************************/
void SSD1963_LCD_DrawPoint_big(uint16_t x,uint16_t y)
{
SSD1963_LCD_Fill(x-1,y-1,x+1,y+1,POINT_COLOR);
}
/*********************************************************************************************************
* Hazirlayan : Mehmet
* Function Name : SSD1963_LCD_Fill(uint16_t xsta,uint16_t ysta,uint16_t xend,uint16_t yend,uint16_t color)
* Kullanisi :
* Output :
* Return :
**********************************************************************************************************/
void SSD1963_LCD_Fill(uint16_t xsta,uint16_t ysta,uint16_t xend,uint16_t yend,uint16_t color)
{
uint16_t i,j;
SSD1963_Address_set(xsta,ysta,xend,yend);
for(i=ysta;i<=yend;i++)
{
for(j=xsta;j<=xend;j++)LCD_WriteData(color);
}
}
/*******************************************************************************
* Hazirlayan : Mehmet
* Function Name : SSD1963_LCD_DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
* Kullanisi :
* Output :
* Return :
*******************************************************************************/
void SSD1963_LCD_DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
{
uint16_t t;
int xerr=0,yerr=0,delta_x,delta_y,distance;
int incx,incy,uRow,uCol;
delta_x=x2-x1;
delta_y=y2-y1;
uRow=x1;
uCol=y1;
if(delta_x>0)incx=1;
else if(delta_x==0)incx=0;
else {incx=-1;delta_x=-delta_x;}
if(delta_y>0)incy=1;
else if(delta_y==0)incy=0;
else{incy=-1;delta_y=-delta_y;}
if( delta_x>delta_y)distance=delta_x;
else distance=delta_y;
for(t=0;t<=distance+1;t++ )
{
SSD1963_LCD_DrawPoint(uRow,uCol);
xerr+=delta_x ;
yerr+=delta_y ;
if(xerr>distance)
{
xerr-=distance;
uRow+=incx;
}
if(yerr>distance)
{
yerr-=distance;
uCol+=incy;
}
}
}
/***********************************************************************************************
* Hazirlayan : Mehmet
* Function Name : SSD1963_LCD_DrawRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
* Kullanisi :
* Output :
* Return :
***************************************************************************************************/
void SSD1963_LCD_DrawRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
{
SSD1963_LCD_DrawLine(x1,y1,x2,y1);
SSD1963_LCD_DrawLine(x1,y1,x1,y2);
SSD1963_LCD_DrawLine(x1,y2,x2,y2);
SSD1963_LCD_DrawLine(x2,y1,x2,y2);
}
/*******************************************************************************
* Hazirlayan : Mehmet
* Function Name : SSD1963_Draw_Circle(uint16_t x0,uint16_t y0,uint8_t r)
* Kullanisi :
* Output :
* Return :
*******************************************************************************/
void SSD1963_Draw_Circle(uint16_t x0,uint16_t y0,uint8_t r)
{
int a,b;
int di;
a=0;b=r;
di=3-(r<<1);
while(a<=b)
{
SSD1963_LCD_DrawPoint(x0-b,y0-a); //3
SSD1963_LCD_DrawPoint(x0+b,y0-a); //0
SSD1963_LCD_DrawPoint(x0-a,y0+b); //1
SSD1963_LCD_DrawPoint(x0-b,y0-a); //7
SSD1963_LCD_DrawPoint(x0-a,y0-b); //2
SSD1963_LCD_DrawPoint(x0+b,y0+a); //4
SSD1963_LCD_DrawPoint(x0+a,y0-b); //5
SSD1963_LCD_DrawPoint(x0+a,y0+b); //6
SSD1963_LCD_DrawPoint(x0-b,y0+a);
a++;
if(di<0)di +=4*a+6;
else
{
di+=10+4*(a-b);
b--;
}
SSD1963_LCD_DrawPoint(x0+a,y0+b);
}
}
/***************************************************************************************
* Hazirlayan : Mehmet
* Function Name : SSD1963_LCD_ShowChar(uint16_t x,uint16_t y,uint8_t num,uint8_t mode)
* Kullanisi :
* Output :
* Return :
****************************************************************************************/
void SSD1963_LCD_ShowChar(uint16_t x,uint16_t y,uint8_t num,uint8_t mode)
{
uint8_t temp;
uint8_t pos,t;
uint16_t x0=x;
uint16_t colortemp=POINT_COLOR;
if(x>LCD_W-16||y>LCD_H-16)return;
num=num-' ';
SSD1963_Address_set(x,y,x+8-1,y+16-1);
if(!mode)
{
for(pos=0;pos<16;pos++)
{
temp=ASCII16x8_Table[(uint16_t)num*16+pos];
for(t=0;t<8;t++)
{
if(temp&0x01)POINT_COLOR=colortemp;
else
POINT_COLOR=BACK_COLOR;
LCD_WriteData(POINT_COLOR);
temp>>=1;
x++;
} x=x0; y++;
}
}else // bu kisimda yazi cikmiyor. Bu kisma ise 1 konulursa geliyor.
{
for(pos=0;pos<16;pos++)
{
temp=ASCII12x12_Table[(uint16_t)num*16+pos];
for(t=0;t<8;t++)
{
if(temp&0x01)SSD1963_LCD_DrawPoint(x+t,y+pos);
temp>>=1;
}
}
} POINT_COLOR=colortemp;
}
/***************************************************************************************
* Hazirlayan : Mehmet
* Function Name : SSD1963_LCD_ShowChar(uint16_t x,uint16_t y,uint8_t num,uint8_t mode)
* Kullanisi :
* Output :
* Return :
****************************************************************************************/
uint32_t mypow(uint8_t m,uint8_t n)
{
uint32_t result=1;
while(n--)result*=m;
return result;
}
/***************************************************************************************
* Hazirlayan : Mehmet
* Function Name : SSD1963_LCD_ShowChar(uint16_t x,uint16_t y,uint8_t num,uint8_t mode)
* Kullanisi :
* Output :
* Return :
****************************************************************************************/
void SSD1963_LCD_ShowNum(uint16_t x,uint16_t y,uint32_t num,uint8_t len)
{
uint8_t t,temp;
uint8_t enshow=0;
num=(uint16_t)num;
for(t=0;t<len;t++)
{
temp=(num/mypow(10,len-t-1))%10;
if(enshow==0&&t<(len-1))
{
if(temp==0)
{
SSD1963_LCD_ShowChar(x+8*t,y,' ',0);
continue;
}else enshow=1;
}
SSD1963_LCD_ShowChar(x+8*t,y,temp+48,0);
}
}
/***************************************************************************************
* Hazirlayan : Mehmet
* Function Name : SSD1963_LCD_ShowChar(uint16_t x,uint16_t y,uint8_t num,uint8_t mode)
* Kullanisi :
* Output :
* Return :
****************************************************************************************/
void SSD1963_LCD_Show2Num(uint16_t x,uint16_t y,uint16_t num,uint8_t len)
{
uint8_t t,temp;
for(t=0;t<len;t++)
{
temp=(num/mypow(10,len-t-1))%10;
SSD1963_LCD_ShowChar(x+8*t,y,temp+'0',0);
}
}
/***************************************************************************************
* Hazirlayan : Mehmet
* Function Name : SSD1963_LCD_ShowChar(uint16_t x,uint16_t y,uint8_t num,uint8_t mode)
* Kullanisi :
* Output :
* Return :
****************************************************************************************/
void SSD1963_LCD_ShowString(uint16_t x,uint16_t y,const uint8_t *p)
{
while(*p!='\0')
{
if(x>LCD_W-16){x=0;y+=16;}
if(y>LCD_H-16){y=x=0;SSD1963_LCD_Clear(WHITE);}
SSD1963_LCD_ShowChar(x,y,*p,0); //0 olacak aksi halde yazi farkli cikiyor
x+=8;
p++;
}
}
/***************************************************************************************
* Hazirlayan : Mehmet
* Function Name : SSD1963_LCD_ShowChar(uint16_t x,uint16_t y,uint8_t num,uint8_t mode)
* Kullanisi :
* Output :
* Return :
****************************************************************************************/
void SSD1963_LCD_Clear(uint16_t color)
{
unsigned int l=480,w;
LCD_WriteCommand(0x002A);
LCD_WriteData(0x00);
LCD_WriteData(0x00);
LCD_WriteData(HDP>>8);
LCD_WriteData(HDP&0x00ff);
LCD_WriteCommand(0x002b);
LCD_WriteData(0x00);
LCD_WriteData(0x00);
LCD_WriteData(VDP>>8);
LCD_WriteData(VDP&0x00ff);
LCD_WriteCommand(0x002c);
while(l--)
{
for(w=0;w<272;w++)
{
LCD_WriteData(color);
}
}
}
/***************************************************************************************
* Hazirlayan : Mehmet
* Function Name : SSD1963_LCD_ShowChar(uint16_t x,uint16_t y,uint8_t num,uint8_t mode)
* Kullanisi :
* Output :
* Return :
****************************************************************************************/
void SSD1963_LCD_SetColors(__IO uint16_t _TextColor, __IO uint16_t _BackColor)
{
POINT_COLOR = _TextColor;
BACK_COLOR = _BackColor;
}
/***************************************************************************************
* Hazirlayan : Mehmet
* Function Name : SSD1963_LCD_ShowChar(uint16_t x,uint16_t y,uint8_t num,uint8_t mode)
* Kullanisi :
* Output :
* Return :
****************************************************************************************/
void SSD1963_LCD_SetTextColor(__IO uint16_t Color)
{
POINT_COLOR = Color;
}
/****************** Fonksiyon sonu***************/
void LCD_CtrlLinesConfig(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable GPIOD, GPIOE, and AFIO clocks */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE |
RCC_AHB1Periph_GPIOC, ENABLE);
/*-- GPIO Configuration ------------------------------------------------------*/
/* SRAM Data lines, NOE and NWE configuration */
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_Pin_4 |GPIO_Pin_5 | GPIO_Pin_7 | GPIO_Pin_11;//|
//GPIO_Pin_12 | GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource4, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource7, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource8, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource9, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource10, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource11, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_FSMC);
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_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource7 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource8 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource9 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource10 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource11 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource12 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource13 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource14 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource15 , GPIO_AF_FSMC);
/* RESET lines configuration */
GPIOC->MODER |= GPIO_MODER_MODER6_0;
GPIOC->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR6_1;
}
/**
* @brief Configures the Parallel interface (FSMC) for LCD(Parallel mode)
* @param None
* @retval None
*/
void LCD_FSMCConfig(void)
{
FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
FSMC_NORSRAMTimingInitTypeDef p;
/* Enable FSMC clock */
RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE);
/*-- FSMC Configuration ------------------------------------------------------*/
/*----------------------- SRAM Bank 3 ----------------------------------------*/
/* FSMC_Bank1_NORSRAM4 configuration */
p.FSMC_AddressSetupTime = 30; // 0x06 /
p.FSMC_AddressHoldTime = 0; // 0 /
p.FSMC_DataSetupTime = 30; // 0x6 /
p.FSMC_BusTurnAroundDuration = 0;
p.FSMC_CLKDivision = 0;
p.FSMC_DataLatency = 0;
p.FSMC_AccessMode = FSMC_AccessMode_A;
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_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);
/* Enable FSMC NOR/SRAM Bank3 */
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);
}
#ifndef USE_Delay
/**
* @brief Inserts a delay time.
* @param nCount: specifies the delay time length.
* @retval None
*/
static void delay(__IO uint32_t nCount)
{
__IO uint32_t index = 0;
for(index = (100000 * nCount); index != 0; index--)
{
}
}
#endif /* USE_Delay*/
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
Sonuca Gelirsek main programda TFT yi init ettikten sonra TFT_Clear fonksiyonu ile Ekranı Kırmızıya veya herhangi bir renge boyamaya çalışıyorum.
Ekranda hiçbir hareket olmuyor. Karta enerji verdikten sonra TFT nin Hemen arka ışıkları yanıyor(Direk bağlı zaten). Ekran ise tamamen beyaz.
Bağlantıların hepsini teker teker kontrol ettim. Yukarıda verdiğim şekilde bağlılar. Burada sıkıntı olacağını sanmıyorum.
stm32f407 ile tft arasında hareketlenmeler oluyor. Onuda şurdan anlıyorum. Discovery üzrerindeki Ledlerden bazıları LCD data hattına denk geliyor.(PD14 ile PD15) TFT init Edilirken Bu ledler yanıyor.
TFT yi 3-4 ay önce almıştım. Hiç kullanmadım daha önce.
Acaba atladığım birşeymi var. Sorun ne olabilir sizce?
Hocam RESET ucunu bağlamadın mı? yoksa yazmayı mı unuttun. Göremedim onu
Yazmayı unutmuşum. Reset bağlı hocam. Başka birşey olmalı. ???
Yukarda verdiğin Pin baglantılarında sorun yok.
Ama kitle TFT arasındaki baglantını bilmiyorum ;)
Not: Ekranın 3v3 beslemesi dısında ayrıyetende 5V beslemesi var mı ?
Olması lazım. Onu da bagladınız mı ?
Almış olduğunuz ekranın linki var mı ? Ordan bir ekrana bakalım nasılmış
Hocam Ben Reset Pinini Discovery Kitin NRST hattına bağladım. Yani Resetler ortak.
Besleme Voltajı biraz düşük geldi bana 2.83V görüyorum. Resette de bu var Ana beslemedede bu gelirim var. Birtek USB den enerji veriyorum.
TFT yi alalı epeyce olmuştu.
http://www.ebay.com/itm/4-3-TFT-LCD-Module-Display-Touch-Panel-Screen-PCB-Adapter-Build-in-SSD1963-/190742815837?pt=LH_DefaultDomain_0&hash=item2c6928645d (http://www.ebay.com/itm/4-3-TFT-LCD-Module-Display-Touch-Panel-Screen-PCB-Adapter-Build-in-SSD1963-/190742815837?pt=LH_DefaultDomain_0&hash=item2c6928645d)
SSD1963 ile ilgili Boşta birtek SSS_TE pini kaldı.
Acaba FSMC ayarlarındamı sıkıntı var. İnterface kısmının düzgün çalışıp çalışmadığını nasıl test edebilirim.
Alıntı yapılan: Mucit23 - 02 Aralık 2013, 11:41:55
Hocam Ben Reset Pinini Discovery Kitin NRST hattına bağladım. Yani Resetler ortak.
PD11 niye baglamadınız.
NRST ile PD11 aynı mıki ?
Ben NRST ile PD11 olcuyorum kısa devre degil.
PD11 bir baglayıp deneyin bakalım.
Alıntı yapılan: M_B - 02 Aralık 2013, 12:28:18
PD11 niye baglamadınız.
NRST ile PD11 aynı mıki ?
Ben NRST ile PD11 olcuyorum kısa devre değil.
PD11 bir baglayıp deneyin bakalım.
Hocam Biraz Kafam Karıştı.
Ben PD11 i TFTnin RS pinine bağlamışım.TFTnin Reset Pini ise NRST Pinine bağladım. Yani reset butonuna basıldığı zaman TFT de resetlensin diye. Acaba Buradamı hata var.
Alıntı yapılan: Mucit23 - 02 Aralık 2013, 13:33:42
Hocam Biraz Kafam Karıştı.
Ben PD11 i TFTnin RS pinine bağlamışım.TFTnin Reset Pini ise NRST Pinine bağladım. Yani reset butonuna basıldığı zaman TFT de resetlensin diye. Acaba Buradamı hata var.
Pardon Hocam Kafanızı karıştırdım . Baglantı sekliniz dogru ben okurken yanlıs anlamısım.
Tekrar dan baktım kendi baglantı şeklimede sizin ki gibi.
PD11 --> TFT nin RS pinine
NRST--> TFT nini Reset pinine
LCD yi çalıştırırsam bir sonraki aşamada Kamera bağlayacağım. Şişmdilik FSMC olmasada olur ama kamera bağlandığı zaman Kesinlikle FSMC olması gerekiyor.
Hocam Adım adım TFTyi test etmem gerekecek. Ben bu FSMC donanımının düzgün çalışmadığından dolayı sorun yaşladığımı düşünüyorum. Yoksa TFT mutlaka tepki verirdi. Yani Genel TFT ayarları yanlış olsa bile mutlaka ekranda birşeyler çıkardı. Bence Hala TFT ye ulaşım sağlanamıyorum. Acaba TFT GPIO port ayarlarındamı sıkıntı var? Bunu nasıl test edebilirim
Acaba Şimdi ne yapayım kafam durdu resmen.
hocam stm32f407 ile 20khz'e kadar AC sinyal üretebilir miyiz aynı zamanda grafik basmada sıkıntı yaşar mıyız? Fikriniz nedir acaba?
Mehmet hocam akşam fsmc kullanılmayan başka bir kütüphane deneyeceğim. Sorunun fsmc ve control lines ayarlarıyla ilgili olabileceğini düşünüyorum.
@Mucit23 Hocam;
Elinizde 3.2" lik ssd1298 li TFT ekranınız varsa onunla FSMC deneyebilirsiniz.
Cunku Her iki displayde de FSMC ayarları aynı değişen bir şey yok
Tek fark :
/*----------------------- SRAM Bank 3 ----------------------------------------*/
/* FSMC_Bank1_NORSRAM4 configuration */
p.FSMC_AddressSetupTime = 30; // 0x06 /
p.FSMC_AddressHoldTime = 0; // 0 /
p.FSMC_DataSetupTime = 30; // 0x6 /
burda oluyor. Oda ekrana resim basma da falan etki yapıyor. Normal fontta sıkıntı yok.
Daha once elimdeki 3.2" TFT Lcd ye resim basarken bu kısımla cok oynadım.
Hocam ben şunu anlamıyorum. TFT neden hiç tepki vermiyor. Hani ekranda ufaktan karalama bişeyler olsa bir şekilde birseyler gidiyor lcd ye diyebilecegim.
Geçen hafta ebaydan aldım birtane ssd1289 lu 3.2" tft. Zaten asıl denemelerimi onunla yapacağım. Bunuda daha önce almıştım. Dedim deneyeyim bari
Sorun hakkında başka fikri olan varmı?
Edit; Fsmc olmadan başka kutuphaneyi çalıştıramam. Data pinleri sıralı degil. Yazılımla halletmek çok uğraştırır. Bu kütüphane niye çalışmıyor ona uğraşayım.
Benim aldığım LCD nin arka yüzü budur.
(http://s13.postimg.cc/civjgb02v/DSC06816.jpg) (http://postimg.cc/)
resim (http://postimg.cc/index.php?lang=turkish)
Bilmiyorum dünden beri uğraşıyorum. Acaba bu LCD üzerindemi bir işlem yapmak gerekiyor. LCD nin hiç tepki vermemesini anlamıyorum. Buna Neler Sebeb olabilir
Farklı Kaynaklardan FSMC ile kullanılmış kütüphaneler denedim. Sonuç aynı değişmiyor. Bence Kütüphane kodlar çalışıyor. Artık LCD den şüphelenmeye başladım.
hocam UTFT library (http://www.henningkarlsen.com/electronics/library.php?id=52) 'deki ssd1963 için 480x272 ayarları seninkinden farklı biraz. istersen bir de bu ayarlara göre dene:
SSD1963 480x272 UTFT library için initlcd.h dosyası:
case SSD1963_480:
LCD_Write_COM(0xE2); //PLL multiplier, set PLL clock to 120M
LCD_Write_DATA(0x23); //N=0x36 for 6.5M, 0x23 for 10M crystal
LCD_Write_DATA(0x02);
LCD_Write_DATA(0x54);
LCD_Write_COM(0xE0); // PLL enable
LCD_Write_DATA(0x01);
delay(10);
LCD_Write_COM(0xE0);
LCD_Write_DATA(0x03);
delay(10);
LCD_Write_COM(0x01); // software reset
delay(100);
LCD_Write_COM(0xE6); //PLL setting for PCLK, depends on resolution
LCD_Write_DATA(0x01);
LCD_Write_DATA(0x1F);
LCD_Write_DATA(0xFF);
LCD_Write_COM(0xB0); //LCD SPECIFICATION
LCD_Write_DATA(0x20);
LCD_Write_DATA(0x00);
LCD_Write_DATA(0x01); //Set HDP 479
LCD_Write_DATA(0xDF);
LCD_Write_DATA(0x01); //Set VDP 271
LCD_Write_DATA(0x0F);
LCD_Write_DATA(0x00);
LCD_Write_COM(0xB4); //HSYNC
LCD_Write_DATA(0x02); //Set HT 531
LCD_Write_DATA(0x13);
LCD_Write_DATA(0x00); //Set HPS 8
LCD_Write_DATA(0x08);
LCD_Write_DATA(0x2B); //Set HPW 43
LCD_Write_DATA(0x00); //Set LPS 2
LCD_Write_DATA(0x02);
LCD_Write_DATA(0x00);
LCD_Write_COM(0xB6); //VSYNC
LCD_Write_DATA(0x01); //Set VT 288
LCD_Write_DATA(0x20);
LCD_Write_DATA(0x00); //Set VPS 4
LCD_Write_DATA(0x04);
LCD_Write_DATA(0x0c); //Set VPW 12
LCD_Write_DATA(0x00); //Set FPS 2
LCD_Write_DATA(0x02);
LCD_Write_COM(0xBA);
LCD_Write_DATA(0x0F); //GPIO[3:0] out 1
LCD_Write_COM(0xB8);
LCD_Write_DATA(0x07); //GPIO3=input, GPIO[2:0]=output
LCD_Write_DATA(0x01); //GPIO0 normal
LCD_Write_COM(0x36); //rotation
LCD_Write_DATA(0x22);
LCD_Write_COM(0xF0); //pixel data interface
LCD_Write_DATA(0x03);
delay(1);
setXY(0, 0, 479, 271);
LCD_Write_COM(0x29); //display on
LCD_Write_COM(0xBE); //set PWM for B/L
LCD_Write_DATA(0x06);
LCD_Write_DATA(0xf0);
LCD_Write_DATA(0x01);
LCD_Write_DATA(0xf0);
LCD_Write_DATA(0x00);
LCD_Write_DATA(0x00);
LCD_Write_COM(0xd0);
LCD_Write_DATA(0x0d);
LCD_Write_COM(0x2C);
break;
setxy.h dosyası:
case SSD1963_480:
swap(word, x1, y1);
swap(word, x2, y2);
LCD_Write_COM(0x2a);
LCD_Write_DATA(x1>>8);
LCD_Write_DATA(x1);
LCD_Write_DATA(x2>>8);
LCD_Write_DATA(x2);
LCD_Write_COM(0x2b);
LCD_Write_DATA(y1>>8);
LCD_Write_DATA(y1);
LCD_Write_DATA(y2>>8);
LCD_Write_DATA(y2);
LCD_Write_COM(0x2c);
break;
Mucit23 Hocam;
Bu Link sanırsam işinizi görecek. en azından İnitle ilgili bilgiler var
http://electronix.ru/forum/index.php?s=90e6f763acf365e3bd89e15a1e91d6b0&act=Attach&type=post&id=56808 (http://electronix.ru/forum/index.php?s=90e6f763acf365e3bd89e15a1e91d6b0&act=Attach&type=post&id=56808)
Ben ilk başlarda STM32F407 ile ilgili olabileceğini düşünüyordum(fsmc veya controllines ayarları) Ama onlarda problem yok. Sorun bence LCD'nin init edilememesinden kaynaklanıyor.Belkide işlemci çok hızlı çalışıyor.İşleri Biraz yavaşlatmayı düşünüyorum. init kodlarında komutların arasına delaylar koyayım. Birde öyle deneyeyim.
Kaynaklar için Teşekkür ederim. Akşam Tekrardan ayrıntılı olarak bakacağım. Bu sefer çalışacağını umuyorum ::)
Mucit23 hocam;
İşlemci ne kadar hızlı çalışırsa çalışsın Sorun olmaz.
Eger SSD1963 init fonksiyonu na istediğin kadar delay koy farkeden bir şey olmaz.
Önemli olan initin doğru kurulmasıdır.
Örneğin ben 7" Lcd ile uğraşırken başıma geldi. SSD1963 PLL kısmını aktif etmedim. Ekrana yazılar o kadar çok yavaş geldi ki
dedim bu böyleyse işimiz var ;) Sonra verdiğim dokuman ve Datasheeti inceleyerek yapılması gereken init işlemlerini yaptım.
Bu işleri yaparken güzel bir not tutmuş olsaydım şimdi bu senin sorunlarını yaşamazdık.
@M_B
SSD1289 bir LCD' yi sürmeye çalışıyorum.Ama sizin dediğiniz gibi çok yavaş .3-4 sn de ekranı doldurabiliyor.Bunu nasıl çözebilirim ?
Alıntı yapılan: handybest06 - 03 Aralık 2013, 12:26:09
@M_B
SSD1289 bir LCD' yi sürmeye çalışıyorum.Ama sizin dediğiniz gibi çok yavaş .3-4 sn de ekranı doldurabiliyor.Bunu nasıl çözebilirim ?
ssd1289 hangi işlemci ile suruyorsunuz?
Eger Stm32F407 ile suruyorsanız.
stm322xg_eval_lcd.c
stm322xg_eval_lcd.h
işinizi görecektir. En azından ordaki init kısımlarını kontrol edersiniz.
Hocam İnit Winstarın Kodlarını Aynen Geçirdim. Ekranda Canlanma var. :) Heyecanlandım :D
(http://s12.postimg.cc/imbbchpy5/20131203_141400.jpg) (http://postimg.cc/image/lgegpxs49/full/)
yükle resim (http://postimg.cc/index.php?lang=turkish)
Çekmeyen Televizyonlar gibi görüntü veriyor şuanda. Mainde Yaptığım Tek şey Ekranı init ettikten sonra LCD Clear Komutuyla Ekranı Kırmızıya boyamak. Sanırsam Vertical ve Horizontal Tarama ayarlarında sıkıntı var.
Alıntı yapılan: Mucit23 - 03 Aralık 2013, 14:25:03
Hocam İnit Winstarın Kodlarını Aynen Geçirdim. Ekranda Canlanma var. :) Heyecanlandım :D
(http://s12.postimg.cc/imbbchpy5/20131203_141400.jpg) (http://postimg.cc/image/lgegpxs49/full/)
yükle resim (http://postimg.cc/index.php?lang=turkish)
Çekmeyen Televizyonlar gibi görüntü veriyor şuanda. Mainde Yaptığım Tek şey Ekranı init ettikten sonra LCD Clear Komutuyla Ekranı Kırmızıya boyamak. Sanırsam Vertical ve Horizontal Tarama ayarlarında sıkıntı var.
Devam et hocam olacak bu iş.
İstersen yaparkende not al ilerde bir gun gene lazım olabilir. İnsan o an unutmam sanıyor ama unutuyor. ;)
Deniyorum hocam bakalım. Donanımsal olarak bir problem yok. Sorun LCD yi init etmede. Fakat Hazır kodlarla olacak iş değil bu. Winstarınkide düzgün çalışmadı. UTF de düzgün çalışmadı. Anlaşılan Datasheete gömüleceğiz.
Hocam işi %80 Çözdüm.
4.3" için Doğru init kodları bunlar
LCD_WriteCommand(0x0001); // software reset
LCD_WriteCommand(0x0001); // software reset
LCD_WriteCommand(0x0001); // software reset
LCD_WriteCommand(0x00E2); //SET PLL freq=120MHz ;
LCD_WriteData(0x0023); //N=0x36 for 6.5M, 0x23 for 10M crystal
LCD_WriteData(0x0001);
LCD_WriteData(0x0004);
LCD_WriteCommand(0x00E0); // Start PLL
LCD_WriteData(0x0001);
_delay_(5);
LCD_WriteCommand(0x00E0); // Lock PLL
LCD_WriteData(0x0003);
_delay_(5);
LCD_WriteCommand(0x0001); // software reset
LCD_WriteCommand(0xE6); ///PLL setting for PCLK, depends on resolution
LCD_WriteData(0x0001);
LCD_WriteData(0x0033);
LCD_WriteData(0x0032);
LCD_WriteCommand(0x00B0); // Set Lcd_Mode
LCD_WriteData(0x0020);
LCD_WriteData(0x0000);
LCD_WriteData((HDP>>8)&0X00FF); //Set HDP
LCD_WriteData(HDP&0X00FF);
LCD_WriteData((VDP>>8)&0X00FF); //Set VDP
LCD_WriteData(VDP&0X00FF);
LCD_WriteData(0x0000);
LCD_WriteCommand(0x00B4); //HSYNC Set_hori_period.
LCD_WriteData((HT>>8)&0X00FF); //Set HT
LCD_WriteData(HT&0X00FF);
LCD_WriteData((HPS>>8)&0X00FF); //Set HPS
LCD_WriteData(HPS&0X00FF);
LCD_WriteData(HPW); //Set HPW
LCD_WriteData((LPS>>8)&0X00FF); //Set HPS
LCD_WriteData(LPS&0X00FF);
LCD_WriteData(0x0000);
LCD_WriteCommand(0x00B6); //VSYNC Set_Vrt_period.
LCD_WriteData((VT>>8)&0X00FF); //Set VT
LCD_WriteData(VT&0X00FF);
LCD_WriteData((VPS>>8)&0X00FF); //Set VPS
LCD_WriteData(VPS&0X00FF);
LCD_WriteData(VPW); //Set VPW
LCD_WriteData((FPS>>8)&0X00FF);
LCD_WriteData(FPS&0X00FF);
LCD_WriteCommand(0x002A); //SET column address
LCD_WriteData(0x0000); //SET start column address=0
LCD_WriteData(0x0000);
LCD_WriteData(0x0001); //SET end column address=479
LCD_WriteData(0x00df);
LCD_WriteCommand(0x002B); //SET page address
LCD_WriteData(0x0000); //SET start page address=0
LCD_WriteData(0x0000);
LCD_WriteData(0x0001); //SET end page address=271
LCD_WriteData(0x000f);
LCD_WriteCommand(0x00F0); //Pixel data interface
LCD_WriteData(0x0003); //16Bit RGB565 Format
LCD_WriteCommand(0x003A); //Pixel RGB Format
LCD_WriteData(0x0050); //16Bit RGB Format
LCD_WriteCommand(0x00BC); //Set image post processor
LCD_WriteData(0x001F); //Set the contrast value
LCD_WriteData(0x0080); //Set the brightness value
LCD_WriteData(0x0020); //Set the saturation value
LCD_WriteData(0x0001); //Enable Post Processor
LCD_WriteCommand(0x0029); //Display on
LCD Parametreleri
unsigned int HDP=479; //Horizontal Display Period
unsigned int HT=531; //Horizontal Total
unsigned int HPS=43; //LLINE Pulse Start Position
unsigned int LPS=8; //Horizontal Display Period Start Position
unsigned char HPW=10; //LLINE Pulse Width
unsigned int VDP=271; //Vertical Display Period
unsigned int VT=285; //Vertical Total
unsigned int VPS=12; //LFRAME Pulse Start Position
unsigned int FPS=4; //Vertical Display Period Start Positio
unsigned char VPW=10; //LFRAME Pulse Width
Renkleri ve Kontrast Ayarlarını elden geçirmem gerekecek. Bunlarla biraz oynadım daha beter ettim. Kırmızı pembe gibi çıkıyor. :D
Aldığım Sonuçlar Böyle
(http://s24.postimg.cc/m0e246p9x/20131203_163627.jpg) (http://postimg.cc/image/b0suskyup/full/)
resim (http://postimg.cc/index.php?lang=turkish)
(http://s18.postimg.cc/l6hpccull/20131203_163713.jpg) (http://postimg.cc/image/q557qvyed/full/)
hızlı resim yükle (http://postimg.cc/index.php?lang=turkish)
Fakat Kütüphaneyi Değiştirmeyi düşünüyorum. Birçok fonksiyon şuanda çalışmıyor. Renkler doğru düzgün çıkmıyor. Biraz elden geçirmem gerekecek. Neyse İşin En önemli kısmını yaptık. Yazıda çıktığına göre gerisi cilalama. Ama biraz uğraşacağım.
@Mehmet Hocam özellikle Size ve diğer yardımcı olan arkadaşlara teşekkür ederim
@Mucit23 hocam ;
Renk işi RGB sıralamasından kaynaklanıyordur. Oda gene init kısmından ayarlanıyor.
Datasheette Page 38 olsa gerek ordan bakarak duzenleme yapabilirsin.
Benimde başıma gelmişti. ;) Doğru yoldasınız.
Kolay gelsin.
Yardımcı olabildiysem/sek ne mutlu bize.
Merhaba Arkadaşlar
Şuanda stm3240f_lcd.c dosyasında ssd1289 için hazırlanmış olan Text Basma Rutinlerini SSD1963 Kütüphaneme adapte etmeye çalışıyorum. Aslında Bu kütüphanenin tümünü SSD1963'de çalışacak şekilde ayarladığımı söylesem daha yerinde olur.
Normalde SSD1289 için GRAM X ve Y Counterleri Vardır. Bu Counterleri Bir kere ayarladığınız zaman RAM Her yazışınızda Bu counter değerleri artarak sonraki kordinata gelinmiş olur. Yanlışım yoksa böyle olması gerekiyordu.
Orjinal Kütüphanede Bu iş için aşağıdaki fonksiyon var
void LCD_SetCursor(uint8_t Xpos, uint16_t Ypos)
{
LCD_WriteReg(0x004E, Xpos);
LCD_WriteReg(0x004F, Ypos);
}
0x4E ve 0x4F GRAM Counter Adresleri oluyor.
Bu işlemin Aynısının SSD1963de nasıl yapacağımı çözemedim. Ben karakterin basılacağı noktaya LCD_SetDisplayWindow fonksiyonu ile karakter boyutunda pencere açayıp dedim ama olmadı. İşlemci Fonksiyonda takılıp kalıyor şuanda. Peşi Sıra data göndermeyi Çözmem lazım. Yoksa başka bir yöntem bulmam gerekecek.
Şuanda text basma fonksiyonuyla uğraşıyorum. SSD1289 programında Text Basmak için şu 3 Fonksiyon kullanılıyor.
void LCD_DrawChar(uint8_t Xpos, uint16_t Ypos, const uint16_t *c)
{
uint32_t index = 0, i = 0;
uint8_t Xaddress = 0;
Xaddress = Xpos;
//GPIO_ResetBits(GPIOD, GPIO_Pin_11);
LCD_SetCursor(Xaddress, Ypos);
for(index = 0; index < LCD_Currentfonts->Height; index++)
{
LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
//GPIO_SetBits(GPIOD, GPIO_Pin_11);
for(i = 0; i < LCD_Currentfonts->Width; i++)
{
if((((c[index] & ((0x80 << ((LCD_Currentfonts->Width / 12 ) * 8 ) ) >> i)) == 0x00) &&(LCD_Currentfonts->Width <= 12))||
(((c[index] & (0x1 << i)) == 0x00)&&(LCD_Currentfonts->Width > 12 )))
{
LCD_WriteRAM(BackColor);
}
else
{
LCD_WriteRAM(TextColor);
}
}
Xaddress++;
//if(index!=LCD_Currentfonts->Height-1&&i!=LCD_Currentfonts->Width-1)
LCD_SetCursor(Xaddress, Ypos);
}
}
void LCD_DisplayChar(uint8_t Line, uint16_t Column, uint8_t Ascii)
{
Ascii -= 32;
LCD_DrawChar(Line, Column, &LCD_Currentfonts->table[Ascii * LCD_Currentfonts->Height]);
}
void LCD_DisplayStringLine(uint8_t Line, uint8_t *ptr)
{
uint16_t refcolumn = LCD_PIXEL_WIDTH - 1;
/* Send the string character by character on lCD */
while ((*ptr != 0) & (((refcolumn + 1) & 0xFFFF) >= LCD_Currentfonts->Width))
{
/* Display one character on LCD */
LCD_DisplayChar(Line, refcolumn, *ptr);
/* Decrement the column position by 16 */
refcolumn -= LCD_Currentfonts->Width;
/* Point on the next character */
ptr++;
}
}
Bu kodları ssd1963 driverine bu şekilde geçirdim.
void LCD_DrawChar(uint8_t Xpos, uint16_t Ypos, const uint16_t *c)
{
uint32_t index = 0, i = 0;
LCD_SetDisplayWindow(Xpos, Ypos, Xpos+(LCD_Currentfonts->Width-1), Ypos+(LCD_Currentfonts->Height-1));
for(index = 0; index < LCD_Currentfonts->Height; index++)
{
for(i = 0; i < LCD_Currentfonts->Width; i++)
{
if((((c[index] & ((0x80 << ((LCD_Currentfonts->Width / 12 ) * 8 ) ) >> i)) == 0x00) &&(LCD_Currentfonts->Width <= 12))||
(((c[index] & (0x1 << i)) == 0x00)&&(LCD_Currentfonts->Width > 12 )))
{
LCD_WriteData(BackColor);
}
else
{
LCD_WriteData(TextColor);
}
}
}
}
void LCD_DisplayChar(uint8_t Line, uint16_t Column, uint8_t Ascii)
{
Ascii -= 32;
LCD_DrawChar(Line, Column, &LCD_Currentfonts->table[Ascii * LCD_Currentfonts->Height]);
}
void LCD_DisplayStringLine(uint8_t Line, uint8_t *ptr)
{
uint16_t refcolumn = LCD_PIXEL_WIDTH - 1;
/* Send the string character by character on lCD */
while ((*ptr != 0) & (((refcolumn + 1) & 0xFFFF) >= LCD_Currentfonts->Width))
{
/* Display one character on LCD */
LCD_DisplayChar(Line, refcolumn, *ptr);
/* Decrement the column position by 16 */
refcolumn -= LCD_Currentfonts->Width;
/* Point on the next character */
ptr++;
}
}
Fark LCD_DrawChar Fonksiyonunda. Zaten özellikle burada sıkıntı çekiyorum.
Bu konuda ne yapabilirim. Fikri olan varmı?
maşallah güzel gidiyor çalışmalarınız kısmetse yakında ben de tft ile çalışmaya başlayacağım. bu arada hangi derleyiciyi kullanıyorsunuz acaba? anlayamadım da.
Text Fonksiyonları beni bayağı uğraştıracak anlaşılan. :o
Edit: Text basma İşini Çözmek üzereyim.Bunun dışında bir sorun var. LCD çok hassas. Mesela Ekrana beyaz renkte bir harf basayım LCD donuyor ve yavaşça ekran beyazlamaya başlıyor. Birtek beyaz değil. Başka renklerdede böyle yapıyor. Bu acaba SSD1963 init ayarlarıylamı ilgilidir. Anlam veremedim? Normalde Yeşil Kırmızı veya mavi düzgün çıkıyor. Diğer renkler ise problemli
Alıntı yapılan: Mucit23 - 04 Aralık 2013, 10:35:27
Text Fonksiyonları beni bayağı uğraştıracak anlaşılan. :o
Edit: Text basma İşini Çözmek üzereyim.Bunun dışında bir sorun var. LCD çok hassas. Mesela Ekrana beyaz renkte bir harf basayım LCD donuyor ve yavaşça ekran beyazlamaya başlıyor. Birtek beyaz değil. Başka renklerdede böyle yapıyor. Bu acaba SSD1963 init ayarlarıylamı ilgilidir. Anlam veremedim? Normalde Yeşil Kırmızı veya mavi düzgün çıkıyor. Diğer renkler ise problemli
Hocam neden emwin kullanmıyorsunuz?
Alıntı yapılan: yamak - 04 Aralık 2013, 14:01:19
Hocam neden emwin kullanmıyorsunuz?
Hocam emwin Gui ile birlikte kullanılmıyormu? Yani Tek başına sadece bir kütüphane olarak kullanabilirmiyim(Rtos benzeri bir yapı olmadan) Daha önce hiç uğraşmadım.
Bu konuyu biraz araştırayım. Youtube de birkaç video izledim. Bayağı hoşuma gitti. :)
SSD1963 ile ilgili şuanda Birtek renklerde sıkıntım kaldı. Nedense Ekrana beyaz renk yolladığım zaman TFT donuyor. Ekrandaki Bilgiler yavaştan kaybolup ekran beyazlamaya başlıyor. Bunu çözemiyorum. Neden Beyazın datasını gönderince ekran donsun? Sabahtan beri registerleri inceliyorum. İlgili birşey bulamadım Fikri olan varmı?
Bunun dışında Text basmada birkaç problem kaldı. Olarda basit gibi görünüyor
Hocam RTOS olmadan da kullanılabiliyor.
Merhaba arkadaşlar;
emwini bende zamanında incelemiştim ancak oldukça pahalı
bildiğiniz ücretsiz yada uygun fiyatlı ssd1963 ve xpt2046yı kapsayan grafif gui/library varmı ?
ST ve NXP ücretsiz olarak sunuyor.İsterseniz aşağıdaki linkteki örnek uygulamayı inceleyebilirsiniz.
http://www.yusufyamak.com/stm32f429i-disco-emwin-uygulamasi/ (http://www.yusufyamak.com/stm32f429i-disco-emwin-uygulamasi/)
cevap için teşekkür ederim
bu uygulama ile sadece f417 içinmi library geliyor yoksa f407 içinde kullanabiliyormuyuz ?
İstediğiniz stm ile kullanabilirsiniz. Yeterki kulandığınız ekranın driver ı emwin'de mevcut olsun.Normalde emwin ini satın alınca piyasadaki neredeyse tüm lcd driver ları destekliyor fakat ST nin ve NXP nin destekledikleri biraz kısıtlı.Desteklenen driverları daha önce aşağıdaki linkte konuşmuştuk:
https://www.picproje.org/index.php/topic,49785.0.html (https://www.picproje.org/index.php/topic,49785.0.html)
Yeminle Kafa Göz dalacam şimdi bu lcd ye >:( Renkler yanlış çıkıyor arkadaş. Kahverengi veriyorum ekranda sarımsı birşeyler çıkıyor. Buna benzer birçok renk düzgün çıkmıyor. Sadece Kırmızı mavi ve yeşil düzgün çıkıyor.
HSYNC ve VSYNC ayarlarını yaptım. Bunlarda sıkıntı yok artık. Birtek Renk problemim kaldı. Bunuda çözemiyorum.
Datasheette Renklerle ilgili iki adet register var.
Bunlar Pixel Data interface(0xF0) ve Pixel Format(0x3A)
Pixel Data interface Registerine 0x03 değerini vermişim. Buda Datasheete göre 16Bit 565 değerine denk geliyor. Bunda sıkıntı olmaması lazım. Renkleride zaten buna gönderiyorum.
Pixel Format Registerine ise 0x50 değerinie verdim. Buda 16 Bit Pixel Format değerine denk geliyor. Bunun dışında renklerle oynayabileceğim bir yer yok.
İşin ilginç olanı beyaz veya beyaza yakın bir renk datası göndersem SSD1963 donuyor? Buna hiç anlam veremiyorum.
Hata yaptığım bir yermi var takıldım kaldım burada
@Mucit23 hocam;
SSD1963 datasheet Rev0.20 86 Sayfalık Dec 2008 dokumanda
sayfa 39 dan 46 ya olan kısmı iyi inceleyin derim.
Set Pixel Format 0x3A adresinde sadece rengin kac bitle iletileceği belirleniyor.
0xB0 ve 0xB1 adreslerini incelemek lazım RGB diziliş şekli mevcut.
Sayfa 40 daki RGB dizilişine göre rengi de bulabilirsin.
Hocam Teker teker registerleri deniyorum şimdi. Renklerde problem kalmadı şuanda. Birtek Beyaz Çıkmıyor. Daha doğrusu beyaz renkte bir pixel basıldığı zaman SSD1963 donuyor?
Renk Kodlarım bunlar. Birkaç Makro kullanıyorum.
#define BLACK RGB565CONVERT(0, 0, 0)
#define DARKBLUE RGB565CONVERT(0, 0, 128)
#define DARKGREEN RGB565CONVERT(0, 128, 0)
#define DARKCYAN RGB565CONVERT(0, 128, 128)
#define DARKRED RGB565CONVERT(128, 0, 0)
#define DARKMAGENTA RGB565CONVERT(128, 0, 128)
#define DARKYELLOW RGB565CONVERT(128, 128, 0)
#define BLUE RGB565CONVERT(0, 0, 255)
#define GREEN RGB565CONVERT(0, 255, 0)
#define CYAN RGB565CONVERT(0, 255, 255)
#define RED RGB565CONVERT(255, 0, 0)
#define MAGENTA RGB565CONVERT(255, 0, 255)
#define BROWN RGB565CONVERT(102, 51, 0)
#define LIGHTGRAY RGB565CONVERT(128, 128, 128)
#define DARKGRAY RGB565CONVERT(64, 64, 64)
#define LIGHTBLUE RGB565CONVERT(128, 128, 255)
#define LIGHTGREEN RGB565CONVERT(128, 255, 128)
#define LIGHTCYAN RGB565CONVERT(128, 255, 255)
#define LIGHTRED RGB565CONVERT(255, 128, 128)
#define LIGHTMAGENTA RGB565CONVERT(255, 128, 255)
#define YELLOW RGB565CONVERT(255, 255, 0)
#define WHITE RGB565CONVERT(255, 255, 255)
#define GRAY0 RGB565CONVERT(224, 224, 224)
#define GRAY1 RGB565CONVERT(192, 192, 192)
#define GRAY2 RGB565CONVERT(160, 160, 160)
#define GRAY3 RGB565CONVERT(128, 128, 128)
#define GRAY4 RGB565CONVERT(96, 96, 96)
#define GRAY5 RGB565CONVERT(64, 64, 64)
#define GRAY6 RGB565CONVERT(32, 32, 32)
#define RGB565CONVERT(red, green, blue) (u16) (((red >> 3) << 11) | ((green >> 2) << 5) | (blue >> 3))
Beyaz pixel Basıldığı zaman 16 bit renk datası olarak 65535 gidiyor TFT ye. Renk Sıralaması RGB ama burada Renk sıralamasıda farketmezki, Her türlü beyaz çıkması gerekiyor. Ben beyaz gönderdğim zaman donuyor.
Ne yapacağım bilmiyorum. Bunun neden kaynaklanabileceği hakkında fikri olan varmı?
Alıntı yapılan: Mucit23 - 05 Aralık 2013, 13:27:53
Hocam Teker teker registerleri deniyorum şimdi. Renklerde problem kalmadı şuanda. Birtek Beyaz Çıkmıyor. Daha doğrusu beyaz renkte bir pixel basıldığı zaman SSD1963 donuyor?
SSD1289 da da aynı durum mevcut. Beyaz rengi göstermiyor... Bu SSD serisi lcd driver ları hiç beğenmedim doğrusu. Display taraması ILI serisine göre çok kötü. Belkide TFT LCD Modülün camı çok adîdir..
Alıntı yapılan: fgokcegoz - 05 Aralık 2013, 21:47:43
SSD1289 da da aynı durum mevcut. Beyaz rengi göstermiyor... Bu SSD serisi lcd driver ları hiç beğenmedim doğrusu. Display taraması ILI serisine göre çok kötü. Belkide TFT LCD Modülün camı çok adîdir..
Hiç mantıklı gelmiyor hocam. Beyaz renk basamayan TFT Sürücüsümü olurmuş. Ben hala bir yerlerde hata yaptığımı düşünüyorum. (ki bulamıyorum) Öyleki ileride resim felan basarsam. Tek bir beyaz pixel olsa işlemci donacak. Çözmek gerekiyor bunu
Elinde deneme imkanı olanlar deneyebilirmi? Mehmet Hocam 7" TFT board hala duruyormu beyaz rengi deneyebilirmisiniz?
Alıntı yapılan: Mucit23 - 05 Aralık 2013, 22:08:54
Hiç mantıklı gelmiyor hocam. Beyaz renk basamayan TFT Sürücüsümü olurmuş. Ben hala bir yerlerde hata yaptığımı düşünüyorum. (ki bulamıyorum) Öyleki ileride resim felan basarsam. Tek bir beyaz pixel olsa işlemci donacak. Çözmek gerekiyor bunu
Elinde deneme imkanı olanlar deneyebilirmi? Mehmet Hocam 7" TFT board hala duruyormu beyaz rengi deneyebilirmisiniz?
Mucit23 hocam;
Yarın inşallah denerim. Şu an yanımda değil. Belki bu sayede tekrar üzerinde calışmaya başlarım. Ara verdim ya bir sogukluk geldi ;)
Hocam Text Basmada sorun kalmadı. Şuanda tek problem beyaz ve beyaza yakın renklerin TFT yi dondurması. Mesela Sarı bile göndersem bazen donduğu oluyor. Buna anlam veremiyorum. İlgili birçok register ile oynadım. Beyaz renk sorununa çözüm bulamadım.
LCD nin kalitesiz olduğu doğru ama beyaz renk çıkmaması lcd ile ilgili olmayacağını düşünüyorum.
Alıntı yapılan: Mucit23 - 05 Aralık 2013, 22:08:54
Hiç mantıklı gelmiyor hocam. Beyaz renk basamayan TFT Sürücüsümü olurmuş. Ben hala bir yerlerde hata yaptığımı düşünüyorum. (ki bulamıyorum) Öyleki ileride resim felan basarsam. Tek bir beyaz pixel olsa işlemci donacak. Çözmek gerekiyor bunu
Elinde deneme imkanı olanlar deneyebilirmi? Mehmet Hocam 7" TFT board hala duruyormu beyaz rengi deneyebilirmisiniz?
Beyaz renk basamayan TFT sürücüsü olamaz bencede hocam. Haklısınız. Bir yerde problem olduğu kesin. Büyük ihtimalle piksellere giden analog voltaj değerlerinin konfigürasyonunda problem var. Bir pikselin beyaz renk görünebilmesi için oraya en yüksek voltaj değeri gitmesi gerekiyor galiba. Zaten White = 0xFFFF, Black = 0x0000... Siyahsa voltaj minimum, beyazsa maksimum... Bizim ayarlarda da problem olduğu için taşma gibi birşey oluyor herhalde... Aklıma böyle birşey geliyor ama ne kadar doğrudur bilmiyorum açıkçası :) O yüzden beyaz yerine gri kullanıyorum. Zaten neredeyse beyaz gibi görünüyor...
Aslında banada mantıklı gelmeye başladı. Beyaz pixel demek tüm RGB değerlerinin en yüksek şiddetle yanması demek. Belkide Ekranın tümü beyaz olunca LCD nin enerji tüketimi artıp Besleme voltajında düşüşe neden olup bir şekilde ssd1963'ün çalışmasına engel oluyordur. Gerçi TFT de beyaz pixel enerji tüketimini arttırırmı emin değilim.(Led Olsa neyse) Besleme Voltajı zaten düşük. Tüm kitte 2,85 volt civarı bir gelirim vardı. Bununda LCD aydınlatmasıyla ilgili olabileceğini düşünüyorum. Fazla akım çekiyor olabilir.
Mucit23 hocam;
Ekranın basmıs olduğu beyaz.
İlgili kodlar
SSD1963_LCD_Clear(WHITE);
Fonksiyonu:
void SSD1963_LCD_Clear(uint16_t color)
{
unsigned int l=800,w;
LCD_WriteCommand(0x002A);
LCD_WriteData(0x00);
LCD_WriteData(0x00);
LCD_WriteData(HDP>>8);
LCD_WriteData(HDP&0x00ff);
LCD_WriteCommand(0x002b);
LCD_WriteData(0x00);
LCD_WriteData(0x00);
LCD_WriteData(VDP>>8);
LCD_WriteData(VDP&0x00ff);
LCD_WriteCommand(0x002c);
while(l--)
{
for(w=0;w<480;w++)
{
LCD_WriteData(color);
}
}
}
Renk Tablosu:
#define BLUE 0XF800
#define GREEN 0X07E0
#define RED 0X001F
#define BRED 0XF81F
#define GRED 0XFFE0
#define GBLUE 0X07FF
#define WHITE 0XFFFF
#define BLACK 0X0000
#define BROWN 0XBC40
#define BRRED 0XFC07
#define GRAY 0X8430
#define LGRAY 0XC618
#define FSIZE 16
#define LCD_W 800
#define LCD_H 480
(http://u1312.hizliresim.com/1j/6/v71z1.jpg) (http://bit.ly/c25MCx)
(http://u1312.hizliresim.com/1j/6/v71z8.jpg) (http://bit.ly/c25MCx)
Mehmet Hocam Test için Teşekkür ederim. Ben birkaç test daha yapacağım.
Umarım problemi çözebilirim.
Şöyle birşey denedim. LCD Ekran Aydınlatması önceden direk bağlıydı ben şimdi SSD1963'ün PWM çıkışına bağladım. Beyaz Renk gönderdiğim zaman PWM duruyor yani ekran kararıyor. Demekki SSD1963 donuyor. Ama neden donduğunu hala çözemedim
Mucit23 hocam;
Neden Beyaz gonderince donsun ki ?
Beyaz gonderdiğinizde SSD1963 besleme voltajını kontrol edin.
Varsa elinizde 3v3 dısardan besleyip deneyin.
Hocam siz 7" TFT yi Yine USB den ve discovery üzerinden besliyorsunuz değilmi? Benim USB voltajımda düşük. 4,5V civarında. 3.3V Beslemesi de 2.8V civarında. Bayağı düşük.
Tek bir pixel basmayı denedim. Tek bir beyaz pixelde herzaman donmuyor. Ard arda beyaz data gönderilince donuyor.
Ben yine Harici beslemeyi deneyeyim
Hocam Değişik birşey keşfettim. Şimdi Pixel Fonksiyonu ile Ekrana noktacıklar koyuyorum. Normalde Nokta koyma fonksiyonu ekrandaki verilen kordinata ait pixelin rengini değiştirir. Bende böyle olmuyor. Verilen Renk Datasına göre verilen kordinattaki pixeli ve bu pixelin hemen sağındaki pixelin rengini değiştiriyor. Ama Her renkte olmuyor. Testlerim sırasında 0xFF7F den daha büyük bir renk datası olursa eğer bu dediğim işlemin gerçekleştiği kanısına vardım. Yani iki pixel birden renk değiştiriyor. Pixel RGB data uzunluğu 16 bit. Tekrar bi göz atayım ama neden böyle olsunki? Sorun Bence bundan kaynaklanıyor.
Peki 0xFF7F den buyuk degil de mesela
0x0080, 0x01E0 0x02A0, 0x00FF gibi renk datalarinda da iki pixel birden renk degistiriyormu? (Merak ettim)
Z hocam 0x01E0 da da oluyor. Diğer pixel biraz farklı sanki böyle titrer gibi yanıyor. Demekki 0xFF7F ile alakası yok.
Ama şimdi Pixel format değerini 24 bite çıkardım. 0xFFFE değerine kadar bul etti. Yani donmadan pixelleri çiftlemeden ekrana bastı. Hatta Ekranın Tümünü 0xFFFE ile boyayabildim. Büyük bir gelişme ama Yine 0XFFFF de donuyor.
Aslında 0xFFFE ile 0xFFFF arasında bir fark yok ikiside beyaz. Beyaz rengi 0xFFFE olarak tanımlayabilirim ama Resim bassam sıkıntı çıkacak.
Biraz mantık yürütelim. 0xFFFF 16 bit sınırı içerisinde. Ekranda iki adet pixelin rengi boyanması için kordinat verildikten sonra iki adet 16 bitlik data göndermek gerekiyor. Bunun dışında ne gibi olaylar olsunki ikinci pixelin rengi değişsin? Yine iş SSD1963 de bitiyor.
Peki 24 oncesinde renkler icin kac byte kullaniliyordu? 16 Byte mi?
FF7F den buyuk degerler kafamda su isigi yakti.
MSB LSB yi yer degistirirsek 7FFF eder. Bu 16 bit sayilar icindeki en buyuk degerdir. Bunu 1 artirirsak negatif sayilari elde ederiz.
Programda negatif degerler soruna neden oluyordur.
Bu yuzden 0x0080, 0x01E0 0x02A0, 0x00FF gibi negatif degerleri denemeni istedim.
signed int, unsigned int vs gibi onemli bir ayrinti atlaniyor olabilir.
Alıntı yapılan: Mucit23 - 05 Aralık 2013, 13:27:53
Hocam Teker teker registerleri deniyorum şimdi. Renklerde problem kalmadı şuanda. Birtek Beyaz Çıkmıyor. Daha doğrusu beyaz renkte bir pixel basıldığı zaman SSD1963 donuyor?
Renk Kodlarım bunlar. Birkaç Makro kullanıyorum.
#define BLACK RGB565CONVERT(0, 0, 0)
#define DARKBLUE RGB565CONVERT(0, 0, 128)
#define DARKGREEN RGB565CONVERT(0, 128, 0)
#define DARKCYAN RGB565CONVERT(0, 128, 128)
#define DARKRED RGB565CONVERT(128, 0, 0)
#define DARKMAGENTA RGB565CONVERT(128, 0, 128)
#define DARKYELLOW RGB565CONVERT(128, 128, 0)
#define BLUE RGB565CONVERT(0, 0, 255)
#define GREEN RGB565CONVERT(0, 255, 0)
#define CYAN RGB565CONVERT(0, 255, 255)
#define RED RGB565CONVERT(255, 0, 0)
#define MAGENTA RGB565CONVERT(255, 0, 255)
#define BROWN RGB565CONVERT(102, 51, 0)
#define LIGHTGRAY RGB565CONVERT(128, 128, 128)
#define DARKGRAY RGB565CONVERT(64, 64, 64)
#define LIGHTBLUE RGB565CONVERT(128, 128, 255)
#define LIGHTGREEN RGB565CONVERT(128, 255, 128)
#define LIGHTCYAN RGB565CONVERT(128, 255, 255)
#define LIGHTRED RGB565CONVERT(255, 128, 128)
#define LIGHTMAGENTA RGB565CONVERT(255, 128, 255)
#define YELLOW RGB565CONVERT(255, 255, 0)
#define WHITE RGB565CONVERT(255, 255, 255)
#define GRAY0 RGB565CONVERT(224, 224, 224)
#define GRAY1 RGB565CONVERT(192, 192, 192)
#define GRAY2 RGB565CONVERT(160, 160, 160)
#define GRAY3 RGB565CONVERT(128, 128, 128)
#define GRAY4 RGB565CONVERT(96, 96, 96)
#define GRAY5 RGB565CONVERT(64, 64, 64)
#define GRAY6 RGB565CONVERT(32, 32, 32)
#define RGB565CONVERT(red, green, blue) (u16) (((red >> 3) << 11) | ((green >> 2) << 5) | (blue >> 3))
Beyaz pixel Basıldığı zaman 16 bit renk datası olarak 65535 gidiyor TFT ye. Renk Sıralaması RGB ama burada Renk sıralamasıda farketmezki, Her türlü beyaz çıkması gerekiyor. Ben beyaz gönderdğim zaman donuyor.
Ne yapacağım bilmiyorum. Bunun neden kaynaklanabileceği hakkında fikri olan varmı?
16 bit modunda iken
#define RGB565CONVERT(red, green, blue) (u16) (((red >> 3) << 11) | ((green >> 2) << 5) | (blue >> 3))
kullanarak asagidaki degerlerin sonucu ne cikiyor?
#define WHITE RGB565CONVERT(255, 255, 255)
#define GRAY3 RGB565CONVERT(128, 128, 128)
Hocam LSB veya MSB işi olmaması gerekir. Çünkü Renk datalarını tutan değişkenler unsigned int16 şeklinde tanımlı
static __IO uint16_t TextColor = 0x0000, BackColor = 0xFFFF;
Yani negatif değerler almaması gerekiyor.
RGB565CONVERT Makrosunun çıkışını ekrana bastım.
RGB565CONVERT(255, 255, 255) = 0xFFFF
RGB565CONVERT(128, 128, 128) = 0x8410
çıktılar yukarıdaki gibi oldu.
@Z hocam başka yorumunuz varmı?
Hala neden 0XFFFF'i kabul etmediğini çözemedim. Başka ne yapabilirim bu konuda
@Mucit23 hocam;
SSD1963_LCD_Clear(WHITE);
Fonksiyonu kullanarak denediniz mi
SSD1963_LCD_Clear(0xFFFF);
olarak
Bahsettiğim biraz mantıksız gibi ama denemek lazım.
Veya debug ederek adım adım calıstırarak test etmek lazım
Mehmet Hocam o fonksiyonu kullanmıyorum. En temelden şekilde direk data göndererek yapıyorum. Yani ilk önce kordinatı belirleyip, sonra direk renk datası göndererek pixel basımı yapıyorum. Problem ararken datasheeti ezberlediğimi söyleyebilirim.
Şuanda bilgisayarım ölü durumda hocam. Son 1 haftaki çalışmalarım masaüstündeydi onları kurtarınca çalışmalara devam edecem.
Önceden derlenen program şimdi bir hata veriyor
.\Output\Discovery.axf: error: L6007U: Could not recognize the format of file .\output\startup_stm32f40xx.o.
Acaba geri dönüşüm dosya yapısınımı bozmuş.
Sorunu buldum. Birkaç dosyaya geri dönüşüm esnasında null karakter atanmış. Onları temizleyince düzeldi.
Hocam son halini paylaşmanız mümkün mü?
Kütüphaneye diğer fonksiyonları (Circle, Line, Rectangle, Resim basma vs...) ekleyeyim sonra paylaşıcam. Yanlız Beyaz sorunu çözemedim. Halla 0xFFFF kabul etmiyor. Farklı fikir görüş ve önerileri olanlar yazarsa sevinirim.
Ben lcd'de resim basarken renkler bozuk çıkıyor. Örneğin LCD_Clear(BLUE); komutunu gönderdiğimde ekranın rengi yeşil oluyor. Mavi ile yeşil ters. Renk sıralamasını datasheete bakıp değiştirdim datasheetteki tüm ihtimalleri tek tek denedim hiç bir şey değişmedi. Sürücü kodlarında ki;
unsigned int HDP=799; //Horizontal Display Period
unsigned int HT=1000; //Horizontal Total
unsigned int HPS=51; //LLINE Pulse Start Position
unsigned int LPS=3; // Horizontal Display Period Start Position
unsigned char HPW=8; // LLINE Pulse Width
unsigned int VDP=479; //Vertical Display Period
unsigned int VT=530; //Vertical Total
unsigned int VPS=24; // LFRAME Pulse Start Position
unsigned int FPS=23; //Vertical Display Period Start Positio
unsigned char VPW=3; // LFRAME Pulse Width
bu kısım ekranın boyutuna göre mi ayarlanıyor. Bu değerler tam olarak neyi ifade ediyor. Sürücü dosyasında renk sıralamasını değiştirmeme rağmen neden tepki alamadığımı da anlamış değilim.
Ayrıca resim basarken bazen ekran donup kalıyor yavaş yavaş beyaza dönüyor. Bu sadece resim basarken de değil dokunmatik kullanırken de olabiliyor. Bu donmanın nedeni ne olabilir.
Alıntı yapılan: matador - 12 Aralık 2013, 11:46:33
Ben lcd'de resim basarken renkler bozuk çıkıyor. Örneğin LCD_Clear(BLUE); komutunu gönderdiğimde ekranın rengi yeşil oluyor. Mavi ile yeşil ters. Renk sıralamasını datasheete bakıp değiştirdim datasheetteki tüm ihtimalleri tek tek denedim hiç bir şey değişmedi. Sürücü kodlarında ki;
unsigned int HDP=799; //Horizontal Display Period
unsigned int HT=1000; //Horizontal Total
unsigned int HPS=51; //LLINE Pulse Start Position
unsigned int LPS=3; // Horizontal Display Period Start Position
unsigned char HPW=8; // LLINE Pulse Width
unsigned int VDP=479; //Vertical Display Period
unsigned int VT=530; //Vertical Total
unsigned int VPS=24; // LFRAME Pulse Start Position
unsigned int FPS=23; //Vertical Display Period Start Positio
unsigned char VPW=3; // LFRAME Pulse Width
bu kısım ekranın boyutuna göre mi ayarlanıyor. Bu değerler tam olarak neyi ifade ediyor. Sürücü dosyasında renk sıralamasını değiştirmeme rağmen neden tepki alamadığımı da anlamış değilim.
Ayrıca resim basarken bazen ekran donup kalıyor yavaş yavaş beyaza dönüyor. Bu sadece resim basarken de değil dokunmatik kullanırken de olabiliyor. Bu donmanın nedeni ne olabilir.
Benzer sorunları yaşadım.
LCD_WriteCommand(0x0001); // software reset
LCD_WriteCommand(0x0001); // software reset
LCD_WriteCommand(0x0001); // software reset
LCD_WriteCommand(0x00E2); //SET PLL freq=120MHz ;
LCD_WriteData(0x0021); //23 N=0x36 for 6.5M, 0x23 for 10M crystal
LCD_WriteData(0x0002); //02
LCD_WriteData(0x0004); //04
LCD_WriteCommand(0x00E0); // Start PLL
LCD_WriteData(0x0001);
_delay_(10);
LCD_WriteCommand(0x00E0); // Lock PLL
LCD_WriteData(0x0003);
_delay_(10);
LCD_WriteCommand(0x0001); // software reset
LCD_WriteCommand(0xE6); ///PLL setting for PCLK, depends on resolution
LCD_WriteData(0x0002); //0x0002
LCD_WriteData(0x00EA); //0x00ea
LCD_WriteData(0x00EC); //0x00ec
LCD_WriteCommand(0x00B0); // Set Lcd_Mode
LCD_WriteData(0x003F); //0x003F
LCD_WriteData(0x0080); //0x0080
LCD_WriteData((HDP>>8)&0X00FF); //Set HDP
LCD_WriteData(HDP&0X00FF);
LCD_WriteData((VDP>>8)&0X00FF); //Set VDP
LCD_WriteData(VDP&0X00FF);
LCD_WriteData(0x0000);
LCD_WriteCommand(0x00B4); //HSYNC Set_hori_period.
LCD_WriteData((HT>>8)&0X00FF); //Set HT
LCD_WriteData(HT&0X00FF);
LCD_WriteData((HPS>>8)&0X00FF); //Set HPS
LCD_WriteData(HPS&0X00FF);
LCD_WriteData(HPW); //Set HPW
LCD_WriteData((LPS>>8)&0X00FF); //Set HPS
LCD_WriteData(LPS&0X00FF);
LCD_WriteData(0x0000);
LCD_WriteCommand(0x00B6); //VSYNC Set_Vrt_period.
LCD_WriteData((VT>>8)&0X00FF); //Set VT
LCD_WriteData(VT&0X00FF);
LCD_WriteData((VPS>>8)&0X00FF); //Set VPS
LCD_WriteData(VPS&0X00FF);
LCD_WriteData(VPW); //Set VPW
LCD_WriteData((FPS>>8)&0X00FF);
LCD_WriteData(FPS&0X00FF);
LCD_WriteCommand(0x002A); //SET column address
LCD_WriteData(0x0000); //SET start column address=0
LCD_WriteData(0x0000);
LCD_WriteData(0x0001); //SET end column address=479
LCD_WriteData(0x00df);
LCD_WriteCommand(0x002B); //SET page address
LCD_WriteData(0x0000); //SET start page address=0
LCD_WriteData(0x0000);
LCD_WriteData(0x0001); //SET end page address=271
LCD_WriteData(0x000f);
LCD_WriteCommand(0x00B8); //Set GPIO Configuration
LCD_WriteData(0x0007); //GPIO3=input, GPIO[2:0]=output
LCD_WriteData(0x0001); //GPIO0 normal
LCD_WriteCommand(0x00BA); //Set Gpio Value
LCD_WriteData(0x0005);
LCD_WriteCommand(0x00F0); //Pixel data interface
LCD_WriteData(0x0003); //16Bit RGB565 Format
// LCD_WriteCommand(0x003A); //Pixel RGB Format
// LCD_WriteData(0x0070); //16Bit RGB Format
LCD_WriteCommand(0x00BE); //Set PWM for B/L
LCD_WriteData(0x0006); //PWM Frequency
LCD_WriteData(0x00FF); //PWM Duty Cyle
LCD_WriteData(0x0001);
LCD_WriteData(0x00F0);
LCD_WriteData(0x0000);
LCD_WriteData(0x0000);
LCD_WriteCommand(0x00D0);
LCD_WriteData(0x000C);
LCD_WriteCommand(0x0029); //Display on
Şuan Bende birtek beyaz pixel basmada problem kaldı. Diğer renklerde sıkıntı yok sanırım. Birde bazen durduk yere donuyor. Oda sanırım PCLK ayarlarıyla ilgili. Ben Bu ayarlarla çok oynadım. Ekranda titreme oluyordu onları giderdim.
Şöyle bir çıkarım yaptım. Her LCD nin türüne göre birçok ayarın değişmesi gerekiyor. Yani Sadece LCD parametreleriyle oynamak çözüm değil.
Yinede yukarıdaki kodları bir deneyin.
Renk sorunu için RGB ayarlarını yaptıysanız 0XB0 nolu adrese bakıp ayarları gözden geçirin.
Hocam bu kodları denedim ekran tam istediğim gibi çalışıyor. Allah razı olsun :)
Sağol Teşekkürler.
Ekrana LCD_Clear ile 0XFFFF gönderebilirmisin Ekran tamamen beyaza boyanacakmı?
Beyazda ki sıkıntı devam ediyor
Hocam M_B'nin paylaştığı projede ki resmi basmayı dener misin bir ben denedim sıkıntı çıkmadı resmin hex kodlarında tonla 0xFF var herhangi bir sorun çıkmıyor.
Hocam resim basmayla ilgisi yok. Eğer SSD1963 data olarak 0xFFFF kabul etse resim basma fonksiyonunu iki dakikada bende yazarım. Ama yok öyle birşey. Ben anlamıyorum. M_B hocanın verdiği kodlar bende hiç çalışmıyor. Akşam yine LCD parametreleri hariç diğer tüm ayarları M_B hocanınkiyle değiştireceğim. Bakalım ne olacak?
işin kötüsü kamerada sıkıntı yaşayacağım. Beyaz pixel geldiyse ekran donar
M_B hocanın paylaştıkları çalışmıştı bende sadece renk ayarı vardı. Sormak istediğim bir şey var M_B'nin paylaştığı projede ki 01.c resmini basarken sorun yok ama ben herhangi bir resmi image2lcd ile hexe çeviriyorum bunu lcd'ye basarken lcd donup kalıyor.
M_B hocanın paylaştığı projede ki 01.c resmini dener misiniz?
Tekrar Çalışmalara başladım.
Beyaz pixel problemi devam ediyor. Kitin üzerindeki reset butonuna biraz basılı tutup çekince bazen donmadan beyaz pixeli ekrana bastığı olabiliyor. Çok nadir gerçekleşiyor.
Bu konuda yorumu olan varmı?
Bu sorunu çözmem gerek! Bir Bitlik sorun yüzünden bütün ilerlemem durdu!
Bir sorum olacak.
Benim discovery kitin üzerindeki 3.3V besleme hattında voltaj çok düşüyor. Genelde 2,85 volt civarında bir gelirim var. Normalde USB beslemeside 4.5 volt civarında ama ben kart üzerinde 5V hattına direk 5v veriyorum karta lcd felan bağlamama rağmen yine 3.3V çıkışı düşüyor. Bunun sebebi nedendir.
Arkadaşlar neden böyle olduğunu çözemedim bir türlü. Acaba kit üzerindeki 3.3 regülatörü mü bozuk? LCD bağlı değilken sistem 40ma civarı bir akım çekiyor. LCD varken 150ma çekiliyor.
Artık bu 4.3" TFT ile uğraşmayı bırakıyorum. Şuan TFT stabil çalışıyor ama hala 0xFFFF renk datası gönderdiğim zaman SSD1963 susuyor. Açıkçası pes ettirdi beni :o
3.2" TFT ile devam edeceğim. Bu LCD'nin sürücüsü SSD1289 umarım abisi gibi aynı problemleri yaşatmaz.
Şimdi Stm32F407 ile bağlantılarını yapıyordum bir yerde takıldım.
LCD'nin Pin bağlantıları şöyle.
(http://s11.postimg.cc/58jgioijn/3_2pinout.jpg) (http://postimg.cc/)
jpg upload (http://postimg.cc/index.php?lang=turkish)
Daha önceki 4.3" TFT'de LCD ekran ledini SSD1963'ün PWM çıkışına bağlamıştım. Oradan parlaklığını ayarlıyordum.
Sanırım SSD1289 da böyle bir seçenek yok. Zaten sadece LED_A şeklinde pin çıkarmışlar. Parlaklık için buradan harici pwm uygulamak gerekiyor değilmi? Eğer direk yakmak istersem +3.3V'a direk bağlamam yeterli sanırım.
Bendeki 3.2" ssd1289 LCD'de LED için ayrıca pin yok, besleme verilince ekran ışığı yanıyor. Yani sen ister direnç üzerinden 3.3V bağla ister PWM ile sür, her ikisininde olacağını düşünüyorum.
Arkadaşlar Merhaba
Elimde OV9655 Kamera bordu var. Bunu STM32F407 nin DCMI modülüne bağlamaya çalışıyorum.
Kameranın 2x10 header bağlantıları aşağıdaki gibi.
(http://s30.postimg.cc/7wphi4igt/Ekran_Al_nt_s.jpg) (http://postimg.cc/image/7wphi4igt/)
Dikkat ederseniz Data bacakları 2. bitten itibaren başlıyor. Bildiğim kadarıyla kamera max 10 bit haberleşiyor. Acaba buradaki bağlantıya göre 10 bit formatında datalar sola dayalı olarakmı geliyor? Yani Y2 pini D0, Y9 pini D7 olarak almam gerekiyor değilmi?
Merhaba,
Daha öncede sormuştum fakat net bir cevap alamadım.
Keilde Ana programa eklediğim kütüphanelerdeki tanımlı olan bir değişkeni main programında da kullanmak istiyorum.
Örneğin DMA ile ADC okuması yapıyorum. ADC değerini DMA ile ADC kütüphanesindeki bir değişkene aktarıyorum. Şuan ADC değerini main programına almak için bir fonksiyon yazıp değişken değerini fonksiyondan geri yolluyorum.
Bu dediğim işlemi nasıl yaparım.
extern Degisken ile.
Mesela ADC dosyasındaki değişken
uint16_t ADC olsun.
main.c içerisinde
extern uint16_t ADC; demeniz yeterli.
Evet, istediğim buydu, Teşekkürler..
Stm32f4X de delay fonksiyonu ile us bazında gecikme yaptıran oldumu? Stm32F10x için systick.c ve systick.h kütüphanelerim vardı onda kolay oluyordu. Stm32f4'de ise systick örneğindeki yapıyı kullanıyordum fakat farkettimki düzgün çalışmıyor. Yani 1ms yerine 3.120 ms gecikme yapıyordu. Bende SysTick_Config fonksiyonuna gönderdiğim parametreyi 1000 yerine 3119 yaparak çözdüm.
Bundan daha düşük gecikmeleri SysTick ile nasıl yaparım?
SystemTick her clock darbesiyle 24bitten geri sayar. LOAD resisterındaki değere gelince kesme üretir.
delay.h
#ifndef DELAY_H_
#define DELAY_H_
#include <stm32f10x.h>
extern volatile uint32_t tick;
extern void delay_ms(uint32_t value);
extern void delay_us(uint32_t value);
extern uint32_t yuzmicrosec(void);
extern void SystemTick_init(uint32_t freq);
extern void SysTick_Handler(void);
#endif // DELAY_H_
delay.c
#include <stm32f10x.h>
#include <delay.h>
volatile uint32_t tick=0;
void delay_yuz_us(uint32_t delay_value)
{
uint32_t currentTicks;
currentTicks = tick;
while ((tick - currentTicks) < delay_value);
}
void delay_ms(uint32_t delay_value)
{
uint32_t currentTicks;
currentTicks = tick;
while ((tick - currentTicks) < 10 * delay_value);
}
uint32_t yuzmicrosec(void)
{
uint32_t sonzaman;
sonzaman=tick;
return sonzaman;
}
void SystemTick_init(uint32_t freq)
{
if( freq > 0x00FFFFFF ){
freq = 0x00FFFFFF;
}
SysTick -> LOAD = freq;
SysTick -> VAL = 0;
SysTick -> CTRL &=~(1 << 16);
SysTick -> CTRL |= 7;
}
void SysTick_Handler(void)
{
SysTick -> CTRL &=~(1 << 16);
tick++;
}
SystemTick_init(SystemCoreClock/10000) yaptığınızda 100us'de kesme üretir.
Osiloskopta baktığımda 100us'ye çok yakın değerlerde gecikme alabiliyordum yarın tekrar kontrol edeyim.
Teşekkür ederim deneyelim.
Bir sorum daha olacak. Keil'de bazı lib dosyalarının üzerinde anahtar işareti var. Yani o dosya kilitlenmiş, Hiçbir şekilde dosyayı editleyemiyorum. Bu dosya üzerindeki korumayı nasıl kaldırırım.
ST'nin DSP librarysindeki math fonksiyonlarını kullanmak istiyorum fakat ATMCM4.h bulunamadı diye hata veriyor.
.\Libraries\CMSIS\Include\arm_math.h(280): error: #5: cannot open source input file "ARMCM4.h": No such file or directory
ARMCM4.h yerine "stm32f4xx.h" dosyasını çağırmam gerekiyor bildiğim kadarıyla.
O konuda bilgim yok ama bende merak ediyorum.
Dosyayı 'salt okunur' yaptığınızda üzerinde değişiklik yapılamıyor , bu da Keil'da kilit olarak gözüküyor. STM library'leri bu şekilde.
mesaj birleştirme:: 04 Şubat 2014, 09:23:17
Alıntı yapılan: Mucit23 - 03 Şubat 2014, 22:34:38
Stm32f4X de delay fonksiyonu ile us bazında gecikme yaptıran oldumu? Stm32F10x için systick.c ve systick.h kütüphanelerim vardı onda kolay oluyordu. Stm32f4'de ise systick örneğindeki yapıyı kullanıyordum fakat farkettimki düzgün çalışmıyor. Yani 1ms yerine 3.120 ms gecikme yapıyordu. Bende SysTick_Config fonksiyonuna gönderdiğim parametreyi 1000 yerine 3119 yaparak çözdüm.
Bundan daha düşük gecikmeleri SysTick ile nasıl yaparım?
Hocam bu şekilde olmaması lazım , ya kullandığın fonsiyonda sıkıntı var , yada system clock sıkıntılı.
Ben hem F4 hem de F1 için aşağıdakileri kullanıyorum.
//====== SysTick Handler ======================================================
void SysTick_Handler(void)
{
TimingDelay_Decrement();
}//============================================================================
//====== Systick Init =========================================================
void Systick_Init(void)
{
SysTick_Config(SystemCoreClock/1000000); // 1us step for Delay Function
STK_CTRL &=~ 0x00000001; // 1: Counter disabled
}//============================================================================
#include "delay.h"
static __IO uint32_t TimingDelay;
//====== Delay ================================================================
void Delay(__IO uint32_t nTime)
{
STK_CTRL |= 0x00000001; // 1: Tick Counter enabled
TimingDelay = nTime;
while(TimingDelay != 0);
STK_CTRL &=~ 0x00000001; // 1: Tick Counter disabled
}//============================================================================
//====== Timing Delay =========================================================
void TimingDelay_Decrement(void)
{
if (TimingDelay != 0x00)
{
TimingDelay--;
}
}//============================================================================
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __delay_H
#define __delay_H
/* Includes ------------------------------------------------------------------*/
#include "stm32f4xx.h"
#define STK_CTRL (*((volatile unsigned int*) 0xE000E010))
/* Exported functions ------------------------------------------------------- */
void TimingDelay_Decrement(void);
void Delay(__IO uint32_t nTime);
#endif /* __MAIN_H */
Kullanım :
GPIO_WriteBit(GPIOB,GPIO_Pin_7,Bit_SET); // Signal LED
Delay(1000000);
GPIO_WriteBit(GPIOB,GPIO_Pin_7,Bit_RESET); // Signal LED
Merhaba
Stm32f4 için PIC C Compiler da yazdığım standart c fonksiyonlarını kullanabilir miyim? Keil IDE kullanıyorum.
Keilin şu L6200E hataları çok canımı sıkıyor.. Yazım hatası felan olsa hataya çift tıklayınca hatanın yapıldığı satıra gidiyor. Gösteriyor orayı. Fakat bu tür hatalarda göstermiyor.
Multiply defined hatası var fakat nerede olduğunu bulamıyorum. Siz bu tür problemleri nasıl aşıyorsunuz?
"Find in files" ile kelimeyi projenin neresinde olduğunu bi araştırın isterseniz.
Ic ice header , define tanimlamalarini dikkatli yapmak lazim , yoksa dediginiz gibi cildirtiyor.
Define tanimlamalari .h icine alin , header dosyasinda header guard olsun.
Benim kendi yazdigim kutuphanelerde kendilerine ait .h dosyalari var , onun icinde kendi tanimlamalari ve main.h cagrisu var.
keil saçlarımı ağarttı.
Kendi yazdığım kütüphanelerde zaten problem olmuyor ama başka bir kütüphaneyi programa ekleyince uğraş babam uğraş.... Uğraşki hatayı bulasın..
mistek dediğin gibi yaptım, Bütün dosyaların içerisinde teker teker arama yapıp buldum.
Alıntı yapılan: camby - 11 Şubat 2014, 23:58:30
Define tanimlamalari .h icine alin , header dosyasinda header guard olsun.
Hocam header guard dediğiniz bu mu?
#ifndef __PWM_SETUP_H
#define __PWM_SETUP_H
Alıntı yapılan: Mucit23 - 03 Şubat 2014, 23:19:13
Teşekkür ederim deneyelim.
Bir sorum daha olacak. Keil'de bazı lib dosyalarının üzerinde anahtar işareti var. Yani o dosya kilitlenmiş, Hiçbir şekilde dosyayı editleyemiyorum. Bu dosya üzerindeki korumayı nasıl kaldırırım.
ST'nin DSP librarysindeki math fonksiyonlarını kullanmak istiyorum fakat ATMCM4.h bulunamadı diye hata veriyor.
.\Libraries\CMSIS\Include\arm_math.h(280): error: #5: cannot open source input file "ARMCM4.h": No such file or directory
ARMCM4.h yerine "stm32f4xx.h" dosyasını çağırmam gerekiyor bildiğim kadarıyla.
Kilitli olmasının sebebi dosyanın salt okunur olarak işaretlenmesi olabilir. Kilitli dosyayı bulup özelliklerden salt okunur kutucuğundaki işareti kaldırırsanız dosya üzerinde değişiklik yapabilirsiniz.
Alıntı yapılan: mistek - 12 Şubat 2014, 00:09:52
Hocam header guard dediğiniz bu mu?
#ifndef __PWM_SETUP_H
#define __PWM_SETUP_H
Evet , tekrar tekrar cagirilmasinin onune geciyor.
Arkadaşlar merhaba, Malum bu aralar kamera ile uğraşıyorum. Kamerayı uyandırabilmek için STM32F4'den 10Mhz Clock uygulamam gerekiyor. Bu iş için Timer ve PWM kullandım fakat istediğim frekansı ayarlayamadım.
Ayarlarım bu şekilde,
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
uint16_t PrescalerValue=0;
/* TIM3 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
/* GPIOC and GPIOB clock enable */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOB, ENABLE);
/* GPIOC Configuration: TIM3 CH1 (PC6) and TIM3 CH2 (PC7) */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
GPIO_Init(GPIOC, &GPIO_InitStructure);
/* Connect TIM3 pins to AF2 */
GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_TIM3);
/* Compute the prescaler value */
PrescalerValue = (uint16_t) ((SystemCoreClock /4) / 10000000) - 1;
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = 665;
TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
/* PWM1 Mode configuration: Channel1 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 333;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM3, ENABLE);
/* TIM3 enable counter */
TIM_Cmd(TIM3, ENABLE);
Benim SystemCoreClock değerim 168000000, ABP1 Prescaler bölücüsü ise 4 olarak ayarlı. Yani ABP1 Hattında max frekans olan 42Mhz olmalı. Buara kadar sıkıntı olmaması gerekiyor.
Timer Prescaller değerini böyle ayarladım
PrescalerValue = (uint16_t) ((SystemCoreClock /4) / 10000000) - 1;
ABP1 hattında 42Mhz olduğu için SystemCoreClock değerini 4'e böldüm. Ardından elde edilen değeri de 10Mhz için 10000000 değerine böldüm.
Ayarlar böyle olunca Benim 10Mhz sinyal almam gerekir ama gerçekte sadece 10 küsür khz sinyal alıyorum.
Yapılan hesap hatası nedir?
Kesme Frekansı = SystemFreq / (ARR+1)(PR+1)
Burada sizin
System Freq=42MHz
ARR=665
PR=3.2
Hocam tamam ama hesaplarımla elde ettiğim sonuçlar birbirini tutmuyor.
Forumdan @muzoo arkadaşımızın sitesinden bir alıntı. (Yazı için teşekkürler)
http://gunluk.muuzoo.gen.tr/2012/08/13/stm32f4-discovery-maceralari-8-tim10-pwm-pin-yon/ (http://gunluk.muuzoo.gen.tr/2012/08/13/stm32f4-discovery-maceralari-8-tim10-pwm-pin-yon/)
Alıntı YapTIM bileşenleri bağlı oldukları veri yolunun 2 katı bir hızla tetikleniyor. APB2 normalde 84MHz'de çalışmaktadır.
Benim ABP1 Hattımda 42Mhz var ama yukarıdaki bilgiye dayanarak timer'in girişinde 84Mhz olduğunu varsayıyorum.
Timer Prescaller değerini ayarlayacağım. Timer 21Mhz de çalışsın istiyorum.
((SystemCoreClock /2) / 21000000) - 1 //(168000000/2)/21000000
Sonuç olarak Prescaller değerimiz 3 oldu.
Bundan sonra Preload değerini 0 versem olmaz. 1 versem frekans ikiye bölünecek. Tamam bölünsün. Peki Duty Değerini nasıl yapacağım. Çözünürlük aşırı düşüyor. Hatta hiç kalmıyor. 1 veya 0.
Bana 10Mhz için gerçek bir örnek verebilirmisiniz. Hesaplamaları biliyorum. Her yerde yazıyor. Ama hiçbirini tutturamıyorum.
Bu arada System CoreClock Değerini ekrana yazdırdım. Ekranda 168000000 değeri göründü.
Mesela 1Khz için prescaler değerini,
PrescalerValue = (uint16_t) ((SystemCoreClock /2) / 1000000) - 1;
yaparak Timeri 1Mhz ile beslemiş oldum. Fakat 1Khz lazım olduğu için Preload değerini 1000 yapıyorum(1 eksiği). Duty Registerinede 500 verdiğim zaman alacağım sinyal %50 duty'ye sahip 1Khz sinyal olması gerekirken 320Hz alıyorum. :o
Evet çözünürlük düşüyor aynı sorunu bende yaşıyorum, kare dalga çıkartabilmek için kesme içerisinden bir pini toggle edin.
Systeminit() çağırın ilk önce 168MHz ayarlandığına emin olun.
Sonra
PR=16
ARR=0
Clockdiv=0
Kesme Frekansı = 10.5MHz olması gerekiyor.
Kesme içerisinde Pin toggle işlemi yapın bunu kontrol edin.
muzoo sayfasında demek istediği şu normalde veri yolu 84MHz ile çalışıyor ancak timerlarda istisna durumlar var clockdiv değeri 1 ise doğrudan SystemClock ile besleniyor yani 168MHz olarak çalışıyor.
Hocam verdiğiniz ayarlarla çıkışta hiçbirşey olmuyor. Duty registerine 0 verirsem çıkış 0, 1 verirsem çıkış 1 oluyor.
Fakat Prescaler değerini 16 Yaptığımda, Period değerini 1 yaptığımda ve duty registerini 1 yaptığımda tam olarak 800Khz düzgün bir sinyal alıyorum.
Period değerini 1 yaptığım için her iki clock darbesinde kesme üretilir. Dolayısıyla Timer girişindeki frekans ikiye bölünür. 800Khz aldığıma göre Timer girişinde 1.6Mhz sinyal olması gerekir. Fakat Timer Prescaler değerini 16 olarak belirlediğimiz için Asıl ABP1 değeri 1.6*16 dan 25.6Mhz çıkıyor. ??? ???
Neden ABP1 frekansı bu derece düşük anlamadım.Başlangıçta System_init fonksiyonunu çağırıyorum. İçeriğide böyle
/**
******************************************************************************
* @file system_stm32f4xx.c
* @author MCD Application Team
* @version V1.0.0
* @date 30-September-2011
* @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File.
* This file contains the system clock configuration for STM32F4xx devices,
* and is generated by the clock configuration tool
* stm32f4xx_Clock_Configuration_V1.0.0.xls
*
* 1. This file provides two functions and one global variable to be called from
* user application:
* - SystemInit(): Setups the system clock (System clock source, PLL Multiplier
* and Divider factors, AHB/APBx prescalers and Flash settings),
* depending on the configuration made in the clock xls tool.
* This function is called at startup just after reset and
* before branch to main program. This call is made inside
* the "startup_stm32f4xx.s" file.
*
* - SystemCoreClock variable: Contains the core clock (HCLK), it can be used
* by the user application to setup the SysTick
* timer or configure other parameters.
*
* - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must
* be called whenever the core clock is changed
* during program execution.
*
* 2. After each device reset the HSI (16 MHz) is used as system clock source.
* Then SystemInit() function is called, in "startup_stm32f4xx.s" file, to
* configure the system clock before to branch to main program.
*
* 3. If the system clock source selected by user fails to startup, the SystemInit()
* function will do nothing and HSI still used as system clock source. User can
* add some code to deal with this issue inside the SetSysClock() function.
*
* 4. The default value of HSE crystal is set to 25MHz, refer to "HSE_VALUE" define
* in "stm32f4xx.h" file. When HSE is used as system clock source, directly or
* through PLL, and you are using different crystal you have to adapt the HSE
* value to your own configuration.
*
* 5. This file configures the system clock as follows:
*=============================================================================
*=============================================================================
* Supported STM32F4xx device revision | Rev A
*-----------------------------------------------------------------------------
* System Clock source | PLL (HSE)
*-----------------------------------------------------------------------------
* SYSCLK(Hz) | 168000000
*-----------------------------------------------------------------------------
* HCLK(Hz) | 168000000
*-----------------------------------------------------------------------------
* AHB Prescaler | 1
*-----------------------------------------------------------------------------
* APB1 Prescaler | 4
*-----------------------------------------------------------------------------
* APB2 Prescaler | 2
*-----------------------------------------------------------------------------
* HSE Frequency(Hz) | 25000000
*-----------------------------------------------------------------------------
* PLL_M | 25
*-----------------------------------------------------------------------------
* PLL_N | 336
*-----------------------------------------------------------------------------
* PLL_P | 2
*-----------------------------------------------------------------------------
* PLL_Q | 7
*-----------------------------------------------------------------------------
* PLLI2S_N | NA
*-----------------------------------------------------------------------------
* PLLI2S_R | NA
*-----------------------------------------------------------------------------
* I2S input clock | NA
*-----------------------------------------------------------------------------
* VDD(V) | 3.3
*-----------------------------------------------------------------------------
* Main regulator output voltage | Scale1 mode
*-----------------------------------------------------------------------------
* Flash Latency(WS) | 5
*-----------------------------------------------------------------------------
* Prefetch Buffer | OFF
*-----------------------------------------------------------------------------
* Instruction cache | ON
*-----------------------------------------------------------------------------
* Data cache | ON
*-----------------------------------------------------------------------------
* Require 48MHz for USB OTG FS, | Enabled
* SDIO and RNG clock |
*-----------------------------------------------------------------------------
*=============================================================================
******************************************************************************
* @attention
*
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
******************************************************************************
*/
/** @addtogroup CMSIS
* @{
*/
/** @addtogroup stm32f4xx_system
* @{
*/
/** @addtogroup STM32F4xx_System_Private_Includes
* @{
*/
#include "stm32f4xx.h"
/**
* @}
*/
/** @addtogroup STM32F4xx_System_Private_TypesDefinitions
* @{
*/
/**
* @}
*/
/** @addtogroup STM32F4xx_System_Private_Defines
* @{
*/
/************************* Miscellaneous Configuration ************************/
/*!< Uncomment the following line if you need to use external SRAM mounted
on STM324xG_EVAL board as data memory */
/* #define DATA_IN_ExtSRAM */
/*!< Uncomment the following line if you need to relocate your vector Table in
Internal SRAM. */
/* #define VECT_TAB_SRAM */
#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field.
This value must be a multiple of 0x200. */
/******************************************************************************/
/************************* PLL Parameters *************************************/
/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
#define PLL_M 25
#define PLL_N 336
/* SYSCLK = PLL_VCO / PLL_P */
#define PLL_P 2
/* USB OTG FS, SDIO and RNG Clock = PLL_VCO / PLLQ */
#define PLL_Q 7
/******************************************************************************/
/**
* @}
*/
/** @addtogroup STM32F4xx_System_Private_Macros
* @{
*/
/**
* @}
*/
/** @addtogroup STM32F4xx_System_Private_Variables
* @{
*/
uint32_t SystemCoreClock = 168000000;
__I uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9};
/**
* @}
*/
/** @addtogroup STM32F4xx_System_Private_FunctionPrototypes
* @{
*/
static void SetSysClock(void);
#ifdef DATA_IN_ExtSRAM
static void SystemInit_ExtMemCtl(void);
#endif /* DATA_IN_ExtSRAM */
/**
* @}
*/
/** @addtogroup STM32F4xx_System_Private_Functions
* @{
*/
/**
* @brief Setup the microcontroller system
* Initialize the Embedded Flash Interface, the PLL and update the
* SystemFrequency variable.
* @param None
* @retval None
*/
void SystemInit(void)
{
/* FPU settings ------------------------------------------------------------*/
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */
#endif
/* Reset the RCC clock configuration to the default reset state ------------*/
/* Set HSION bit */
RCC->CR |= (uint32_t)0x00000001;
/* Reset CFGR register */
RCC->CFGR = 0x00000000;
/* Reset HSEON, CSSON and PLLON bits */
RCC->CR &= (uint32_t)0xFEF6FFFF;
/* Reset PLLCFGR register */
RCC->PLLCFGR = 0x24003010;
/* Reset HSEBYP bit */
RCC->CR &= (uint32_t)0xFFFBFFFF;
/* Disable all interrupts */
RCC->CIR = 0x00000000;
#ifdef DATA_IN_ExtSRAM
SystemInit_ExtMemCtl();
#endif /* DATA_IN_ExtSRAM */
/* Configure the System clock source, PLL Multiplier and Divider factors,
AHB/APBx prescalers and Flash settings ----------------------------------*/
SetSysClock();
/* Configure the Vector Table location add offset address ------------------*/
#ifdef VECT_TAB_SRAM
SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
#else
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
#endif
}
/**
* @brief Update SystemCoreClock variable according to Clock Register Values.
* The SystemCoreClock variable contains the core clock (HCLK), it can
* be used by the user application to setup the SysTick timer or configure
* other parameters.
*
* @note Each time the core clock (HCLK) changes, this function must be called
* to update SystemCoreClock variable value. Otherwise, any configuration
* based on this variable will be incorrect.
*
* @note - The system frequency computed by this function is not the real
* frequency in the chip. It is calculated based on the predefined
* constant and the selected clock source:
*
* - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*)
*
* - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**)
*
* - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**)
* or HSI_VALUE(*) multiplied/divided by the PLL factors.
*
* (*) HSI_VALUE is a constant defined in stm32f4xx.h file (default value
* 16 MHz) but the real value may vary depending on the variations
* in voltage and temperature.
*
* (**) HSE_VALUE is a constant defined in stm32f4xx.h file (default value
* 25 MHz), user has to ensure that HSE_VALUE is same as the real
* frequency of the crystal used. Otherwise, this function may
* have wrong result.
*
* - The result of this function could be not correct when using fractional
* value for HSE crystal.
*
* @param None
* @retval None
*/
void SystemCoreClockUpdate(void)
{
uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2;
/* Get SYSCLK source -------------------------------------------------------*/
tmp = RCC->CFGR & RCC_CFGR_SWS;
switch (tmp)
{
case 0x00: /* HSI used as system clock source */
SystemCoreClock = HSI_VALUE;
break;
case 0x04: /* HSE used as system clock source */
SystemCoreClock = HSE_VALUE;
break;
case 0x08: /* PLL used as system clock source */
/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N
SYSCLK = PLL_VCO / PLL_P
*/
pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22;
pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM;
if (pllsource != 0)
{
/* HSE used as PLL clock source */
pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
}
else
{
/* HSI used as PLL clock source */
pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
}
pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2;
SystemCoreClock = pllvco/pllp;
break;
default:
SystemCoreClock = HSI_VALUE;
break;
}
/* Compute HCLK frequency --------------------------------------------------*/
/* Get HCLK prescaler */
tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)];
/* HCLK frequency */
SystemCoreClock >>= tmp;
}
/**
* @brief Configures the System clock source, PLL Multiplier and Divider factors,
* AHB/APBx prescalers and Flash settings
* @Note This function should be called only once the RCC clock configuration
* is reset to the default reset state (done in SystemInit() function).
* @param None
* @retval None
*/
static void SetSysClock(void)
{
/******************************************************************************/
/* PLL (clocked by HSE) used as System clock source */
/******************************************************************************/
__IO uint32_t StartUpCounter = 0, HSEStatus = 0;
/* Enable HSE */
RCC->CR |= ((uint32_t)RCC_CR_HSEON);
/* Wait till HSE is ready and if Time out is reached exit */
do
{
HSEStatus = RCC->CR & RCC_CR_HSERDY;
StartUpCounter++;
} while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
if ((RCC->CR & RCC_CR_HSERDY) != RESET)
{
HSEStatus = (uint32_t)0x01;
}
else
{
HSEStatus = (uint32_t)0x00;
}
if (HSEStatus == (uint32_t)0x01)
{
/* Select regulator voltage output Scale 1 mode, System frequency up to 168 MHz */
RCC->APB1ENR |= RCC_APB1ENR_PWREN;
PWR->CR |= PWR_CR_VOS;
/* HCLK = SYSCLK / 1*///AHB Prescaller
RCC->CFGR |= RCC_CFGR_HPRE_DIV1;
/* PCLK2 = HCLK / 2*///APB2 Prescaller
RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;
/* PCLK1 = HCLK / 4*///APB1 Prescaller
RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;
/* Configure the main PLL */
RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |
(RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);
/* Enable the main PLL */
RCC->CR |= RCC_CR_PLLON;
/* Wait till the main PLL is ready */
while((RCC->CR & RCC_CR_PLLRDY) == 0)
{
}
/* Configure Flash prefetch, Instruction cache, Data cache and wait state */
FLASH->ACR = FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS;
/* Select the main PLL as system clock source */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC->CFGR |= RCC_CFGR_SW_PLL;
/* Wait till the main PLL is used as system clock source */
while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL);
{
}
}
else
{ /* If HSE fails to start-up, the application will have wrong clock
configuration. User can add here some code to deal with this error */
}
}
/**
* @brief Setup the external memory controller. Called in startup_stm32f4xx.s
* before jump to __main
* @param None
* @retval None
*/
#ifdef DATA_IN_ExtSRAM
/**
* @brief Setup the external memory controller.
* Called in startup_stm32f4xx.s before jump to main.
* This function configures the external SRAM mounted on STM324xG_EVAL board
* This SRAM will be used as program data memory (including heap and stack).
* @param None
* @retval None
*/
void SystemInit_ExtMemCtl(void)
{
/*-- GPIOs Configuration -----------------------------------------------------*/
/*
+-------------------+--------------------+------------------+------------------+
+ SRAM pins assignment +
+-------------------+--------------------+------------------+------------------+
| PD0 <-> FSMC_D2 | PE0 <-> FSMC_NBL0 | PF0 <-> FSMC_A0 | PG0 <-> FSMC_A10 |
| PD1 <-> FSMC_D3 | PE1 <-> FSMC_NBL1 | PF1 <-> FSMC_A1 | PG1 <-> FSMC_A11 |
| PD4 <-> FSMC_NOE | PE3 <-> FSMC_A19 | PF2 <-> FSMC_A2 | PG2 <-> FSMC_A12 |
| PD5 <-> FSMC_NWE | PE4 <-> FSMC_A20 | PF3 <-> FSMC_A3 | PG3 <-> FSMC_A13 |
| PD8 <-> FSMC_D13 | PE7 <-> FSMC_D4 | PF4 <-> FSMC_A4 | PG4 <-> FSMC_A14 |
| PD9 <-> FSMC_D14 | PE8 <-> FSMC_D5 | PF5 <-> FSMC_A5 | PG5 <-> FSMC_A15 |
| PD10 <-> FSMC_D15 | PE9 <-> FSMC_D6 | PF12 <-> FSMC_A6 | PG9 <-> FSMC_NE2 |
| PD11 <-> FSMC_A16 | PE10 <-> FSMC_D7 | PF13 <-> FSMC_A7 |------------------+
| PD12 <-> FSMC_A17 | PE11 <-> FSMC_D8 | PF14 <-> FSMC_A8 |
| PD13 <-> FSMC_A18 | PE12 <-> FSMC_D9 | PF15 <-> FSMC_A9 |
| PD14 <-> FSMC_D0 | PE13 <-> FSMC_D10 |------------------+
| PD15 <-> FSMC_D1 | PE14 <-> FSMC_D11 |
| | PE15 <-> FSMC_D12 |
+-------------------+--------------------+
*/
/* Enable GPIOD, GPIOE, GPIOF and GPIOG interface clock */
RCC->AHB1ENR = 0x00000078;
/* Connect PDx pins to FSMC Alternate function */
GPIOD->AFR[0] = 0x00cc00cc;
GPIOD->AFR[1] = 0xcc0ccccc;
/* Configure PDx pins in Alternate function mode */
GPIOD->MODER = 0xaaaa0a0a;
/* Configure PDx pins speed to 100 MHz */
GPIOD->OSPEEDR = 0xffff0f0f;
/* Configure PDx pins Output type to push-pull */
GPIOD->OTYPER = 0x00000000;
/* No pull-up, pull-down for PDx pins */
GPIOD->PUPDR = 0x00000000;
/* Connect PEx pins to FSMC Alternate function */
GPIOE->AFR[0] = 0xc00cc0cc;
GPIOE->AFR[1] = 0xcccccccc;
/* Configure PEx pins in Alternate function mode */
GPIOE->MODER = 0xaaaa828a;
/* Configure PEx pins speed to 100 MHz */
GPIOE->OSPEEDR = 0xffffc3cf;
/* Configure PEx pins Output type to push-pull */
GPIOE->OTYPER = 0x00000000;
/* No pull-up, pull-down for PEx pins */
GPIOE->PUPDR = 0x00000000;
/* Connect PFx pins to FSMC Alternate function */
GPIOF->AFR[0] = 0x00cccccc;
GPIOF->AFR[1] = 0xcccc0000;
/* Configure PFx pins in Alternate function mode */
GPIOF->MODER = 0xaa000aaa;
/* Configure PFx pins speed to 100 MHz */
GPIOF->OSPEEDR = 0xff000fff;
/* Configure PFx pins Output type to push-pull */
GPIOF->OTYPER = 0x00000000;
/* No pull-up, pull-down for PFx pins */
GPIOF->PUPDR = 0x00000000;
/* Connect PGx pins to FSMC Alternate function */
GPIOG->AFR[0] = 0x00cccccc;
GPIOG->AFR[1] = 0x000000c0;
/* Configure PGx pins in Alternate function mode */
GPIOG->MODER = 0x00080aaa;
/* Configure PGx pins speed to 100 MHz */
GPIOG->OSPEEDR = 0x000c0fff;
/* Configure PGx pins Output type to push-pull */
GPIOG->OTYPER = 0x00000000;
/* No pull-up, pull-down for PGx pins */
GPIOG->PUPDR = 0x00000000;
/*-- FSMC Configuration ------------------------------------------------------*/
/* Enable the FSMC interface clock */
RCC->AHB3ENR = 0x00000001;
/* Configure and enable Bank1_SRAM2 */
FSMC_Bank1->BTCR[2] = 0x00001015;
FSMC_Bank1->BTCR[3] = 0x00010603;
FSMC_Bank1E->BWTR[2] = 0x0fffffff;
/*
Bank1_SRAM2 is configured as follow:
p.FSMC_AddressSetupTime = 3;
p.FSMC_AddressHoldTime = 0;
p.FSMC_DataSetupTime = 6;
p.FSMC_BusTurnAroundDuration = 1;
p.FSMC_CLKDivision = 0;
p.FSMC_DataLatency = 0;
p.FSMC_AccessMode = FSMC_AccessMode_A;
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM2;
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_PSRAM;
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_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;
*/
}
#endif /* DATA_IN_ExtSRAM */
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
Bu hesaba göre İşlemcide 25,6*4=102,4 Mhz de çalışması gerekir.
Acep system init fonksiyonumu problemli? Mümkünse kendi kullandığınız system init fonksiyonuyla karşılaştırabilirmisiniz?
Ben keil'in SystemInit(); fonksiyonunu çağırıyorum kendim yazmadım. İşlemciyi en yüksek hıza ayarlıyor.
Şunuda belirteyim ben F1 de çalışıyorum genelde F4 tecrübem pek yok sadece benzer yapılar olduğu için yorum yapıyorum
z hocanın örneklerden birini çalıştırıp test edebilirsiniz aslında.
Bir hata buldum.
Bendeki Kartta 8Mhz kristal var. Fakat Systeminit fonksiyonunda PLLM değeri 25 olarak verilmiş. Yani Sistem 25Mhz'ye göre kurulmuş. Ben bu değeri 8 Yapınca biraz hızlanma oldu fakat tam değil. PWM için Aynı değerlerle 800Khz'den 2.4Mhz ye çıktı. Yani 3 kat arttı. Fakat yine Hesaba vurunca ABP1 81 Küsür Mhz ediyor. Bu değer Normal'mi? Ya yine Hesapta yanlış yapıyoruz yada başka atladığım nokta var. Çünkü ABP1 Değerinin bölücüsü 4 olarak ayarlı. Yani 168Mhz çalışsa bile ABP1'de 42Mhz olacak.
@z hocam şu konuyu bi aydınlatsan çok iyi olacak. Kafam çok karışık :o :o
Benim bulduğum hatalar şöyle
Sistem 25Mhz osilatöre göre kurulmuştu. Bunu 8Mhz ye göre yaptım. Ayrıca HSI osilatör kullanılmıştı. Ben bunuda HSE osilatörle çalışacak şekilde düzenledim.
Diğer ayarlara hiç karışmadım. AHB ve ABP bölücü oranları aynı. Fakat bunlara rağmen timer hesaplarım gerçektekini tutmuyor.
Hesabı geçtim deneme yanılma ile belki tuttururum dedim ama ne yaptıysam 10Mhz sağlıklı bir sinyal alamadım. Acaba timer ile yapmak mümkün değilmi?
Z hocanın init kodlarını kullanıyorum. Ondada sıkıntı yaşıyorum.
Bana işlemcinin 168Mhz'de çalıştıına emin olduğunuz bir system init fonksiyonu verebilirmisiniz.
Galiba Yanlış yoldayım. Timer ile bu iş yapılmıyor. Bu kadar yüksek Frekans almak sıkıntılı.
MCO2 ve I2S ile yapılabiliyor. Bu konuları araştırayım.
(http://www.cncdesigner.com/STM/CLK_PLL.JPG)
Kamera ile çalışırken MCO pininden clock sinyali almıştım.
Aşağıdaki iki başlığa gözatmakta fayda var.
https://www.picproje.org/index.php/topic,35896.msg256592.html#msg256592 (https://www.picproje.org/index.php/topic,35896.msg256592.html#msg256592)
https://www.picproje.org/index.php/topic,35896.msg256669.html#msg256669 (https://www.picproje.org/index.php/topic,35896.msg256669.html#msg256669)
Evet hocam, MCO bu iş için.
Fakat şuan konuya çok yabancıyım. Nasıl çalıştığını ve frekansın nasıl ayarlandığı konusunda çok az bilgim var. Biraz araştırma yapmam gerekiyor.
MCO dan çıkacak sinyalin frekansını ayarlama üzerine çok fazla şansın yok.
Aşağıdaki linkte MCO pini ile ilgili bir çalışma yapmıştık. Sayfa numaraları vs yardımcı olacaktır.
https://www.picproje.org/index.php/topic,35896.msg256592.html#msg256592 (https://www.picproje.org/index.php/topic,35896.msg256592.html#msg256592)
Hocam MCO nun nasıl çalıştığını anladım. Ama MCO'saat kaynağı olarak SYSCLK yı gösterirsem istediğim frekansı yakalayamam. Anladığım kadarıyla Araya PLLI2S donanımını koymak gerekiyor. Bu I2S denen şeyin nasıl çalıştığını anlayamadım. Benim bildiğim audio çipleriyle iletişim kurmak amacıyla kullanılıyor. Galiba Sampling Rate vs gibi konuları ilgilendiriyor.
Hocam bu konuda bilginiz varmı? Siz kendi uygulamanızda kameraya kaç Mhz sinyal uyguladınız?
Hocam I2S meselesini anladım. Şimdi PLLI2S çarpanlarıyla oynayarak 10Mhz 10Mhz sinyal aldım fakat sinyal biraz dengesiz çıkıyor sanki.
Lojik anallyser ile incelediğimde değişken bir sinyal görüyorum.
(http://s28.postimg.cc/s66ofwl71/Ekran_Al_nt_s.jpg) (http://postimg.cc/image/fesi9ebex/full/)
resim upload (http://postimg.cc/index.php?lang=turkish)
Genişliği dar olan saykıllar 41.7ns Burada 12Mhz gösteriyor frekansı. Geniş olanlar ise 83.3ns, burada ise 8Mhz gösteriyor.
Anlam veremedim.
Birde osiloskop ile bakayım.
Edit
Lojik Analyserin Band genişliği yetmiyor anlaşılan. Osiloskop ile baktım problem göremedim. 24Mhz yi denedim. Ondada sıkıntısız bir şekilde 24Mhz sinyal aldım.
Arkadaşlar merhaba,
Kamera ile uğraşıyorum. Amacım kameradan aldığım görüntüyü işlemci de tanımladığım bir diziye atmak. Kamerayı snapshot moduna aldım. Yapabilirsem eğer cameraya start verdiğimde görüntüyü diziye atıp kesme oluşturacağım. İşte bu noktada bayağı bir sıkıntı yaşıyorum.
320x240 bir görüntü için dizinin boyutu 76800 olması gerekiyor. Benim en ilk başta böyle bir dizi tanımlamam gerekiyor ama STM32F407 de 64kb'dan daha büyük diziler tanımlayamıyorum.
Manual'de şöyle bir ifade var.
Up to 192+4 Kbytes of SRAM including 64-
Kbyte of CCM (core coupled memory) data
RAM
Bu tam olarak ne anlama geliyor?
Eğer İşlemcinin Ram'ini kullanamazsam STM32F407'ye harici flash ram takmayı düşünüyorum. Eğer bu yönde bir çalışma yapmam gerekirse FSMC kullanmam gerekir ama FSMC ile zaten LCD sürüyorum. FSMC kullanılırsa eğer LCD ile flashı aynı anda kullanabilirmiyim. Yada Flashı başka nasıl kullanabilirim.
Amacım dediğim gibi görüntüyü diziye atmak. Bu konuda neler yapılabilir?
Hocam diziye atmayın direkt gelen veriyi LCD'nizin frame buffer ına yazın.LCD'nizde hangi sürücü mevcut?
Hocam şuanda öyle yapıyorum zaten. Ama benim amacım görüntüyü lcd ye hiç göndermemek. Lcd ye gönderdiğim zaman görüntü ekranda çıkıyor. Bunu istemiyorum. Bu arada lcd'nin çipi ssd1289.
Hocam o zaman harici RAM kullanmanız gerekiyo.Zaten 240*320 lik görüntü 150 kb yer kaplıyo.
Doğru söylüyorsunuz. Aslında LCD'nin ram alanını kullanabilseydik güzel olurdu. Yani LCD nin Ram'ine data yazacağım ama LCD de görünmeyecek. SSD1289'un böyle bir özelliği varmı?
Bu konuda öneriye ihtiyacım var.
Harici RAM bakıyorum ama daha önce hiç kullanmadım. Hangi Özelliklerde ne tür bir ram almalıyım. STM32F103 kartımda NAND512 diye Memory bulunuyor. Fakat kullanılan ram 8 bitlik. Bana 16 bitlik lazım.
Özellikle şunu yapmayı isterdim.
LCD yi FSMC ile zaten sürüyorum. LCD'nin Chip Select(CS) pini var. Büyük ihtimal kullanacağım harici RAM'in de CS pini bulunacaktır. LCD ile Aynı Data hattını kullanarak data gönderip fakat CS pinleri ile istediğim zaman LCD ye istediğim zaman Harici RAM'e yazma yapabileceğim bir çip arıyorum.
LCD'nin RAM' indeki aynı özellikleri gösteren bir çip varmıdır. Ne diye araştırmalıyım?
P5Q PCM diye spi dan kullandığım 128Mb lik bir ram vardı.
Büyük veriler için Usart tan dma ile spi a, spidan dma ile kullandığım buffer'a aktarım sağlıyordum.
sizde benzer bir yapı kullanabilirsiniz.
Aslında SPI ram olsa süper olur. İşlemcimdeki SPI kanalları boşta duruyor zaten.
Ben hız konusunda endişeliyim. Örneğin 15FPS de görüntü alıp Ram'e atarsam eğer yaklaşık 66ms de bir 153600 byte veri alacağım kameradan. Bu değeri saniyeye vurunca 15*153600=2304000Byte yani saniyede 2,19 Megabyte veri elimde olur. Gerçekte kamera ile Snapshot modunda çalışacağım için bu hıza yaklaşmam zor ama yinede kullanacağım harici ram bu hızlarda çalışmabilmesi gerekir. Boyutta önemli değil. 256kb'dan aşağı olmasın yeter. Seçeceğim SPI Ram'in bu dediğim şartları sağlamam lazım.
Ersin Hocam sizin kullandığınız çip 66Mhz'e kadar çalışabiliyor. Yani yukarıda bahsettiğim hızlarda rahatlıkla çalışır ama piyasa bulunan birşey değil. Microchip'in ürünleri var ama hızları düşük. Başka önererebileceğiniz spi sram varmı?
Birtek SPI bakmıyorum. Paralel olsada olur. 8 bit bile olur. SRAM'i illa donanımsal kullanacağım diye birşey yok. Nasıl olsa DMA kullanıyorum. DMA kesmesini aktif eder kesme ile yazarım.
http://expkits.com/smagaza/entegre-component/memory/AT25DF041A-SSH-B#.UyoF7KiSxZ4 (http://expkits.com/smagaza/entegre-component/memory/AT25DF041A-SSH-B#.UyoF7KiSxZ4)
http://expkits.com/smagaza/entegre-component/memory/32Mb-SDRAM#.UyoF7KiSxZ4 (http://expkits.com/smagaza/entegre-component/memory/32Mb-SDRAM#.UyoF7KiSxZ4)
Ersin hocam teşekkürler..
SPI olan süpermiş. Hemen alıp denemelere başlayacağım. Hızı çok iyi.
Beni bir süreliğine oyalar bu çip.
ram olsa çok daha iyi olurdu, 100,000 yazma ömrü sıkıntı çıkarmazdı
ama idare eder soketli yaptın mı en azından değişirirken kolaylık sağlar
şu an için üretime geçerken kullandığım ürün p5q spi ram e en uygun seçenek gibi gözüküyor.
oda ram değil ama 10 kat daha fazla yazma ömrü var ve hafıza alanı çok daha geniş
bozulma olan alanları bad sector misali kenara ayırma imkanı mevcut en azından
100 000 yazma ömrü açıkçası ilk etapda gözüme çarpmadı. Microchip'in de SPI SRAM lerine baktım. Hızda problem yok ama yazma ömrü yine 100 000. Eeprom olsa tamam ama ram için çok düşük değilmi bu değerler. Adı üstünde ram bu. sürekli yazma okuma yapılacak buna. Ben yinede SPI ramlerde ışık görüyorum. Belki daha gelişmişi vardır. Biraz araştırayım.
Seri olanların dışında Paralel haberleşen ürünlerede baksam iyi olacak. Sizin gönderdiğiniz 32Mb sd ram iyi de hocam bunlarda çok fazla pin kullanıyor. Discoveryde zaten LCD kamera felan derken epeyce pin harcadım. Diğer Pinlerde zaten sıralı değiller. (Örneğin D portunun x kadar pini başka birşey için kullanılıyor. ) Kullanırsam FSMC ile kullanmam gerek. Bunun içinde LCD yi sökmem lazım.
LCD ile aynı hat üzerinde kullanılabilecek paralel ram tipleri varmıdır piyasada. Hem adresi hemde datayı aynı hat üzerinde alacak. Böyle birşey bulsam çok sevinirim.
Ram de okuma yazma siniri olmaz , emin misiniz
Alıntı yapılan: camby - 20 Mart 2014, 00:09:19
Ram de okuma yazma siniri olmaz , emin misiniz
olur ama flash vs kadar kısıtlı değildir. ayrıca spi olarak bahsedilen ürünler ram değil
@mucit23
fsmc ile 32Mb lik ram ve lcd yi paralel çalıştırabilirsin
reference manual i iyi incele
https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=https%3a%2f%2fmy%2est%2ecom%2fpublic%2fSTe2ecommunities%2fmcu%2fLists%2fcortex_mx_stm32%2fSDD1963%20LCD%20Controller%20with%20FSMC&FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F0FFD06506F5B¤tviews=1111 (https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=https%3a%2f%2fmy%2est%2ecom%2fpublic%2fSTe2ecommunities%2fmcu%2fLists%2fcortex_mx_stm32%2fSDD1963%20LCD%20Controller%20with%20FSMC&FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F0FFD06506F5B¤tviews=1111)
SSD1963 480x272 display on STM32 F1 (http://www.youtube.com/watch?v=32Q-PeT5H8c#ws)
Ersin Hocam RAM'in LCD ile beraber nasıl çalışacaklarını anlayamadım. LCD' de adres bacakları(A0- A15) yok. Yazma okuma, Data, Komut gibi işlemleri belirleyen pinler var. Datalar neysede Adres için yeniden bağlantı çekmem lazım. Diğer bir yandan yazılımsal olarak nasıl bir işlem yapacam. Her LCD kullanırsam FSMC yi LCD ye göre, RAM kullanırsam FSMC'yi Ram'e göremi ayarlamam gerekiyor?
Birde Normal RAM ile ile SRAM arasında ne gibi farklar var. Yani demek istediğim SPI Ram'lerin neden ömürleri kısa. Normal ram ile aynı performansta kullanılabilecek SPI memory ürünleri varmıdır?
kullandığınız tft sürücüsünün kodu nedir?
sitenizde gördüğüm kadarıyla ssd1963 kullanmışsınız fsmc ile şuan ki driver farklı mı?
FSMC de 4 page bulunmakta bu page leri farklı modlara ayarlayabiliyorsunuz
reference manualde detayları mevcut
1. page atıyorum 70000000-7fffffff
2. page 80000000-8fffffff
3. ..
4. ...
arasında gibi
siz 70000000 adersine ulaşmaya çalıştığınızda fsmc otomatik o adres yapısına göre hareket ederken
8000000 diğer yapıya göre hareket edebiliyorsunuz
nor/nand sram vs gibi modlar mevcut
nand için ya 2.page ya 3, sram 1-4 farketmiyor gibi sınırlandırmalarda var dikkat etmek lazım
spi ram ler nvram olarak geçiyor içeriği elektrik kesilince silinmiyor. bu sebepten daha az yazma yapılabiliyor.
normal ram ile aynı performansta spi ram yok en yakını fram diye biliyorum mram, pcm diye sıralama devam ediyor.
boyut/ maliyet oranıda ters yönde
SSD1289
#include "stm3240f_lcd.h"
#include "fonts.c"
typedef struct
{
__IO uint16_t LCD_REG;
__IO uint16_t LCD_RAM;
} LCD_TypeDef;
#define Bank1_LCD_D ((uint32_t)0x60020000) //disp Data ADDR
#define Bank1_LCD_C ((uint32_t)0x60000000) //disp Reg ADDR
#define MAX_POLY_CORNERS 200
#define POLY_Y(Z) ((int32_t)((Points + Z)->X))
#define POLY_X(Z) ((int32_t)((Points + Z)->Y))
#define ABS(X) ((X) > 0 ? (X) : -(X))
static sFONT *LCD_Currentfonts;
static __IO uint16_t TextColor = 0x0000, BackColor = 0xFFFF;
#ifndef USE_Delay
static void delay(__IO uint32_t nCount);
#endif /* USE_Delay*/
static void LCD_PolyLineRelativeClosed(pPoint Points, uint16_t PointCount, uint16_t Closed);
void STM3240F_LCD_Init(void)
{
LCD_CtrlLinesConfig();
LCD_FSMCConfig();
GPIOC->BSRRL = GPIO_BSRR_BS_6;
_delay_(5);
GPIOC->BSRRH = GPIO_BSRR_BS_6;
_delay_(30);
GPIOC->BSRRL = GPIO_BSRR_BS_6;
_delay_(5);
// power supply setting
// set R07h at 0021h (GON=1,DTE=0,D[1:0]=01)
LCD_WriteReg(0x0007,0x0021);
// set R00h at 0001h (OSCEN=1)
LCD_WriteReg(0x0000,0x0001);
// set R07h at 0023h (GON=1,DTE=0,D[1:0]=11)
LCD_WriteReg(0x0007,0x0023);
// set R10h at 0000h (Exit sleep mode)
LCD_WriteReg(0x0010,0x0000);
// Wait 30ms
_delay_(3);
// set R07h at 0033h (GON=1,DTE=1,D[1:0]=11)
LCD_WriteReg(0x0007,0x0033);
// Entry mode setting (R11h)
// R11H Entry mode
// vsmode DFM1 DFM0 TRANS OEDef WMode DMode1 DMode0 TY1 TY0 ID1 ID0 AM LG2 LG2 LG0
// 0 1 1 0 0 0 0 0 0 1 1 1 * 0 0 0
LCD_WriteReg(0x0011,0x6038);
// LCD driver AC setting (R02h)
LCD_WriteReg(0x0002,0x0600);
// power control 1
// DCT3 DCT2 DCT1 DCT0 BT2 BT1 BT0 0 DC3 DC2 DC1 DC0 AP2 AP1 AP0 0
// 1 0 1 0 1 0 0 0 1 0 1 0 0 1 0 0
// DCT[3:0] fosc/4 BT[2:0] DC{3:0] fosc/4
LCD_WriteReg(0x0003,0xA8A4);//0xA8A4
LCD_WriteReg(0x000C,0x0000);//0x0000
LCD_WriteReg(0x000D,0x080C);// 0x080C --> 0x0808
// power control 4
// 0 0 VCOMG VDV4 VDV3 VDV2 VDV1 VDV0 0 0 0 0 0 0 0 0
// 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0
LCD_WriteReg(0x000E,0x2B00); //0x2900
LCD_WriteReg(0x001E,0x00B8); //0x00B8
LCD_WriteReg(0x0001,0x293F); //0110000000101000 293f
LCD_WriteReg(0x0010,0x0000);
LCD_WriteReg(0x0005,0x0000);
LCD_WriteReg(0x0006,0x0000);
LCD_WriteReg(0x0016,0xEF1C);
LCD_WriteReg(0x0017,0x0003);
LCD_WriteReg(0x0007,0x0233);
LCD_WriteReg(0x000B,0x0000|(3<<6));
LCD_WriteReg(0x000F,0x0000);
LCD_WriteReg(0x0041,0x0000);
LCD_WriteReg(0x0042,0x0000);
LCD_WriteReg(0x0048,0x0000);
LCD_WriteReg(0x0049,0x013F);
LCD_WriteReg(0x004A,0x0000);
LCD_WriteReg(0x004B,0x0000);
LCD_WriteReg(0x0044,0xEF00);
LCD_WriteReg(0x0045,0x0000);
LCD_WriteReg(0x0046,0x013F);
LCD_WriteReg(0x0030,0x0707);
LCD_WriteReg(0x0031,0x0204);
LCD_WriteReg(0x0032,0x0204);
LCD_WriteReg(0x0033,0x0502);
LCD_WriteReg(0x0034,0x0507);
LCD_WriteReg(0x0035,0x0204);
LCD_WriteReg(0x0036,0x0204);
LCD_WriteReg(0x0037,0x0502);
LCD_WriteReg(0x003A,0x0302);
LCD_WriteReg(0x003B,0x0302);
LCD_WriteReg(0x0023,0x0000);
LCD_WriteReg(0x0024,0x0000);
LCD_WriteReg(0x0025,0x8000);
LCD_WriteReg(0x004f,0);
LCD_WriteReg(0x004e,0);
LCD_SetFont(&LCD_DEFAULT_FONT);
}
/**
* @brief Sets the LCD Text and Background colors.
* @param _TextColor: specifies the Text Color.
* @param _BackColor: specifies the Background Color.
* @retval None
*/
void LCD_SetColors(__IO uint16_t _TextColor, __IO uint16_t _BackColor)
{
TextColor = _TextColor;
BackColor = _BackColor;
}
/**
* @brief Gets the LCD Text and Background colors.
* @param _TextColor: pointer to the variable that will contain the Text
Color.
* @param _BackColor: pointer to the variable that will contain the Background
Color.
* @retval None
*/
void LCD_GetColors(__IO uint16_t *_TextColor, __IO uint16_t *_BackColor)
{
*_TextColor = TextColor; *_BackColor = BackColor;
}
/**
* @brief Sets the Text color.
* @param Color: specifies the Text color code RGB(5-6-5).
* @retval None
*/
void LCD_SetTextColor(__IO uint16_t Color)
{
TextColor = Color;
}
/**
* @brief Sets the Background color.
* @param Color: specifies the Background color code RGB(5-6-5).
* @retval None
*/
void LCD_SetBackColor(__IO uint16_t Color)
{
BackColor = Color;
}
/**
* @brief Sets the Text Font.
* @param fonts: specifies the font to be used.
* @retval None
*/
void LCD_SetFont(sFONT *fonts)
{
LCD_Currentfonts = fonts;
}
/**
* @brief Gets the Text Font.
* @param None.
* @retval the used font.
*/
sFONT *LCD_GetFont(void)
{
return LCD_Currentfonts;
}
/**
* @brief Clears the selected line.
* @param Line: the Line to be cleared.
* This parameter can be one of the following values:
* @arg Linex: where x can be 0..n
* @retval None
*/
void LCD_ClearLine(uint8_t Line)
{
uint16_t refcolumn = LCD_PIXEL_WIDTH - 1;
/* Send the string character by character on lCD */
while (((refcolumn + 1)& 0xFFFF) >= LCD_Currentfonts->Width)
{
/* Display one character on LCD */
LCD_DisplayChar(Line, refcolumn, ' ');
/* Decrement the column position by 16 */
refcolumn -= LCD_Currentfonts->Width;
}
}
/**
* @brief Clears the hole LCD.
* @param Color: the color of the background.
* @retval None
*/
void LCD_Clear(uint16_t Color)
{
uint32_t index = 0;
int i;
// GPIO_ResetBits(GPIOD, GPIO_Pin_11);
// LCD_SetCursor(0x00, 0x013F);
LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
// _delay_(5);
// GPIO_SetBits(GPIOD, GPIO_Pin_11);
for(index = 0; index < 76800; index++)
{
// LCD->LCD_RAM = Color;
*(__IO uint16_t *) (Bank1_LCD_D)= Color;
for(i=0;i<2;i++);
}
}
/**
* @brief Sets the cursor position.
* @param Xpos: specifies the X position.
* @param Ypos: specifies the Y position.
* @retval None
*/
void LCD_SetCursor(uint16_t Xpos, uint8_t Ypos)
{
LCD_WriteReg(0x004E, Ypos);
LCD_WriteReg(0x004F, Xpos);
LCD_WriteRAM_Prepare();
}
/**
* @brief Draws a character on LCD.
* @param Xpos: the Line where to display the character shape.
* @param Ypos: start column address.
* @param c: pointer to the character data.
* @retval None
*/
void LCD_DrawChar(uint16_t Xpos, uint8_t Ypos, const uint16_t *c)
{
uint32_t index = 0, i = 0;
// LCD_SetDisplayWindow(Xpos, Ypos, Xpos+(LCD_Currentfonts->Width-1), Ypos+(LCD_Currentfonts->Height-1));
for(index = 0; index <LCD_Currentfonts->Height; index++)
{
for(i = 0; i < LCD_Currentfonts->Width; i++)
{
LCD_SetCursor(Xpos+i,Ypos+index);
if((((c[index] & ((0x80 << ((LCD_Currentfonts->Width / 12 ) * 8 ) ) >> i)) == 0x00) &&(LCD_Currentfonts->Width <= 12))||
(((c[index] & (0x1 << i)) == 0x00)&&(LCD_Currentfonts->Width > 12 )))
{
LCD_WriteRAM(BackColor);
}
else
{
LCD_WriteRAM(TextColor);
}
}
}
}
/**
* @brief Displays one character (16dots width, 24dots height).
* @param Line: the Line where to display the character shape .
* This parameter can be one of the following values:
* @arg Linex: where x can be 0..9
* @param Column: start column address.
* @param Ascii: character ascii code, must be between 0x20 and 0x7E.
* @retval None
*/
void LCD_DisplayChar(uint16_t Column, uint8_t Line, uint8_t Ascii)
{
Ascii -= 32;
LCD_DrawChar(Column, Line, &LCD_Currentfonts->table[Ascii * LCD_Currentfonts->Height]);
}
/**
* @brief Displays a maximum of 20 char on the LCD.
* @param Line: the Line where to display the character shape .
* This parameter can be one of the following values:
* @arg Linex: where x can be 0..9
* @param *ptr: pointer to string to display on LCD.
* @retval None
*/
void LCD_DisplayStringLine(uint16_t Xpos, uint8_t Ypos, uint8_t *ptr)
{
uint16_t refcolumn = Xpos, refrow = Ypos;
/* Send the string character by character on lCD */
while (*ptr != 0)
{
/* Display one character on LCD */
LCD_DisplayChar(refcolumn, refrow, *ptr);
/* increment the column position by 16 */
refcolumn += LCD_Currentfonts->Width;
if (refcolumn>=LCD_PIXEL_WIDTH-1)
{
refcolumn=0;
refrow+=LCD_Currentfonts->Height;
}
/* Point on the next character */
ptr++;
}
}
/**
* @brief Sets a display window
* @param Xpos: specifies the X buttom left position.
* @param Ypos: specifies the Y buttom left position.
* @param Height: display window height.
* @param Width: display window width.
* @retval None
*/
void LCD_SetDisplayWindow(uint16_t Xpos, uint8_t Ypos, uint16_t Width, uint8_t Height)
{
LCD_WriteReg(0x0044,(uint16_t)(Height<<8)|Ypos);
LCD_WriteReg(0x0045,Xpos);
LCD_WriteReg(0x0046,Width);
LCD_SetCursor(Xpos,Ypos);
}
/**
* @brief Put Pixel LCD.
* @param Xpos, Ypos, rgb_data
* @retval None
*/
void LCD_PutPixel(uint16_t Xpos, uint8_t Ypos, uint16_t rgb_data)
{
LCD_SetCursor(Xpos, Ypos);
LCD_WriteRAM(rgb_data);
}
/**
* @brief Get Pixel LCD.
* @param Xpos, Ypos
* @retval RGB_Data
*/
uint16_t LCD_GetPixel(uint16_t Xpos, uint8_t Ypos)
{
LCD_SetCursor(Xpos, Ypos);
return LCD_ReadRAM();
}
/**
* @brief Disables LCD Window mode.
* @param None
* @retval None
*/
void LCD_WindowModeDisable(void)
{
//LCD_SetDisplayWindow(239, 0x13F, 240, 320);
LCD_WriteReg(LCD_REG_3, 0x1018);
}
/**
* @brief Displays a rectangle.
* @param X1: specifies the X position.
* @param Y1: specifies the Y position.
* @param X2: display rectangle height.
* @param Y2: display rectangle width.
* @retval None
*/
void LCD_Rectangle(uint16_t x1, uint8_t y1, uint16_t x2, uint8_t y2, uint8_t fill)
{
LCD_DrawLine(x1, y1, x2, y1);
LCD_DrawLine(x1, y2, x2, y2);
LCD_DrawLine(x1, y1, x1, y2);
LCD_DrawLine(x2, y1, x2, y2);
}
/**
* @brief Displays a circle.
* @param Xpos: specifies the X position.
* @param Ypos: specifies the Y position.
* @param Radius
* @retval None
*/
void LCD_DrawCircle(uint8_t Xpos, uint16_t Ypos, uint16_t Radius)
{
int32_t D;/* Decision Variable */
uint32_t CurX;/* Current X Value */
uint32_t CurY;/* Current Y Value */
D = 3 - (Radius << 1);
CurX = 0;
CurY = Radius;
while (CurX <= CurY)
{
LCD_SetCursor(Xpos + CurX, Ypos + CurY);
LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
LCD_WriteRAM(TextColor);
LCD_SetCursor(Xpos + CurX, Ypos - CurY);
LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
LCD_WriteRAM(TextColor);
LCD_SetCursor(Xpos - CurX, Ypos + CurY);
LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
LCD_WriteRAM(TextColor);
LCD_SetCursor(Xpos - CurX, Ypos - CurY);
LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
LCD_WriteRAM(TextColor);
LCD_SetCursor(Xpos + CurY, Ypos + CurX);
LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
LCD_WriteRAM(TextColor);
LCD_SetCursor(Xpos + CurY, Ypos - CurX);
LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
LCD_WriteRAM(TextColor);
LCD_SetCursor(Xpos - CurY, Ypos + CurX);
LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
LCD_WriteRAM(TextColor);
LCD_SetCursor(Xpos - CurY, Ypos - CurX);
LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
LCD_WriteRAM(TextColor);
if (D < 0)
{
D += (CurX << 2) + 6;
}
else
{
D += ((CurX - CurY) << 2) + 10;
CurY--;
}
CurX++;
}
}
/**
* @brief Displays an uni line (between two points).
* @param x1: specifies the point 1 x position.
* @param y1: specifies the point 1 y position.
* @param x2: specifies the point 2 x position.
* @param y2: specifies the point 2 y position.
* @retval None
*/
void LCD_DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
{
int16_t deltax = 0, deltay = 0, x = 0, y = 0, xinc1 = 0, xinc2 = 0,
yinc1 = 0, yinc2 = 0, den = 0, num = 0, numadd = 0, numpixels = 0,
curpixel = 0;
deltax = ABS(x2 - x1); /* The difference between the x's */
deltay = ABS(y2 - y1); /* The difference between the y's */
x = x1; /* Start x off at the first pixel */
y = y1; /* Start y off at the first pixel */
if (x2 >= x1) /* The x-values are increasing */
{
xinc1 = 1;
xinc2 = 1;
}
else /* The x-values are decreasing */
{
xinc1 = -1;
xinc2 = -1;
}
if (y2 >= y1) /* The y-values are increasing */
{
yinc1 = 1;
yinc2 = 1;
}
else /* The y-values are decreasing */
{
yinc1 = -1;
yinc2 = -1;
}
if (deltax >= deltay) /* There is at least one x-value for every y-value */
{
xinc1 = 0; /* Don't change the x when numerator >= denominator */
yinc2 = 0; /* Don't change the y for every iteration */
den = deltax;
num = deltax / 2;
numadd = deltay;
numpixels = deltax; /* There are more x-values than y-values */
}
else /* There is at least one y-value for every x-value */
{
xinc2 = 0; /* Don't change the x for every iteration */
yinc1 = 0; /* Don't change the y when numerator >= denominator */
den = deltay;
num = deltay / 2;
numadd = deltax;
numpixels = deltay; /* There are more y-values than x-values */
}
for (curpixel = 0; curpixel <= numpixels; curpixel++)
{
LCD_PutPixel(x, y, TextColor); /* Draw the current pixel */
num += numadd; /* Increase the numerator by the top of the fraction */
if (num >= den) /* Check if numerator >= denominator */
{
num -= den; /* Calculate the new numerator value */
x += xinc1; /* Change the x as appropriate */
y += yinc1; /* Change the y as appropriate */
}
x += xinc2; /* Change the x as appropriate */
y += yinc2; /* Change the y as appropriate */
}
}
/**
* @brief Displays a monocolor picture.
* @param Pict: pointer to the picture array.
* @retval None
*/
void LCD_DrawMonoPict(const uint32_t *Pict)
{
uint32_t index = 0, i = 0;
//LCD_SetCursor(0, (LCD_PIXEL_WIDTH - 1));
LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
for(index = 0; index < 2400; index++)
{
for(i = 0; i < 32; i++)
{
if((Pict[index] & (1 << i)) == 0x00)
{
LCD_WriteRAM(BackColor);
}
else
{
LCD_WriteRAM(TextColor);
}
}
}
}
/**
* @brief Displays a bitmap picture loaded in the internal Flash.
* @param BmpAddress: Bmp picture address in the internal Flash.
* @retval None
*/
void LCD_WriteBMP(uint32_t BmpAddress)
{
uint32_t index = 0, size = 0;
/* Read bitmap size */
size = *(__IO uint16_t *) (BmpAddress + 2);
size |= (*(__IO uint16_t *) (BmpAddress + 4)) << 16;
/* Get bitmap data address offset */
index = *(__IO uint16_t *) (BmpAddress + 10);
index |= (*(__IO uint16_t *) (BmpAddress + 12)) << 16;
size = (size - index)/2;
BmpAddress += index;
/* Set GRAM write direction and BGR = 1 */
/* I/D=00 (Horizontal : decrement, Vertical : decrement) */
/* AM=1 (address is updated in vertical writing direction) */
LCD_WriteReg(LCD_REG_3, 0x1008);
LCD_WriteRAM_Prepare();
for(index = 0; index < size; index++)
{
LCD_WriteRAM(*(__IO uint16_t *)BmpAddress);
BmpAddress += 2;
}
/* Set GRAM write direction and BGR = 1 */
/* I/D = 01 (Horizontal : increment, Vertical : decrement) */
/* AM = 1 (address is updated in vertical writing direction) */
LCD_WriteReg(LCD_REG_3, 0x1018);
}
/**
* @brief Displays a bitmap picture loaded in the internal Flash.
* @param BmpAddress: Bmp picture address in the internal Flash.
* @retval None
*/
void LCD_WriteBMP2(uint16_t Xpos, uint8_t Ypos, uint16_t Width, uint16_t Height, unsigned char *bitmap)
{
volatile uint32_t index;
unsigned short *bitmap_ptr = (unsigned short *)bitmap;
uint16_t i;
LCD_SetDisplayWindow(Xpos, Ypos, Width, Height);
//LCD_SetCursor(Xpos, Ypos);
LCD_WriteRAM_Prepare();
for(index = 0; index < 76800; index++)
{
LCD_WriteRAM(bitmap_ptr[index]);
for(i=0;i<100;i++);
}
}
/**
* @brief Displays a full rectangle.
* @param Xpos: specifies the X position.
* @param Ypos: specifies the Y position.
* @param Height: rectangle height.
* @param Width: rectangle width.
* @retval None
*/
void LCD_DrawFullRect(uint16_t x1, uint8_t y1, uint16_t x2, uint8_t y2)
{
unsigned char i, xmin, xmax, ymin, ymax;
unsigned char xend=x2-x1;
unsigned char yend=y2-y1;
LCD_SetDisplayWindow(x1,y1,xend+1,yend+1);
if(x1 < x2)
{
xmin = x1;
xmax = x2;
}
else
{
xmin = x2;
xmax = x1;
}
if(y1 < y2)
{
ymin = y1;
ymax = y2;
}
else
{
ymin = y2;
ymax = y1;
}
for(; xmin <= xmax; ++xmin)
{
for(i=ymin; i<=ymax; ++i)
{
LCD_PutPixel(xmin, i, TextColor);
}
}
}
/**
* @brief Displays a full circle.
* @param Xpos: specifies the X position.
* @param Ypos: specifies the Y position.
* @param Radius
* @retval None
*/
void LCD_DrawFullCircle(uint16_t Xpos, uint8_t Ypos, uint16_t Radius)
{
signed int a,b,P;
a=0;
b=Radius;
P=1-Radius;
do
{
LCD_DrawLine(Xpos-a, Ypos+b, Xpos+a, Ypos+b);
LCD_DrawLine(Xpos-a, Ypos-b, Xpos+a, Ypos-b);
LCD_DrawLine(Xpos-b, Ypos+a, Xpos+b, Ypos+a);
LCD_DrawLine(Xpos-b, Ypos-a, Xpos+b, Ypos-a);
if(P < 0)
P+= 3 + 2*a++;
else
P+= 5 + 2*(a++ - b--);
}while(a<=b);
}
/**
* @brief Displays an polyline (between many points).
* @param Points: pointer to the points array.
* @param PointCount: Number of points.
* @retval None
*/
void LCD_PolyLine(pPoint Points, uint16_t PointCount)
{
int16_t X = 0, Y = 0;
if(PointCount < 2)
{
return;
}
while(--PointCount)
{
X = Points->X;
Y = Points->Y;
Points++;
LCD_DrawLine(X, Y, Points->X, Points->Y);
}
}
/**
* @brief Displays an relative polyline (between many points).
* @param Points: pointer to the points array.
* @param PointCount: Number of points.
* @param Closed: specifies if the draw is closed or not.
* 1: closed, 0 : not closed.
* @retval None
*/
static void LCD_PolyLineRelativeClosed(pPoint Points, uint16_t PointCount, uint16_t Closed)
{
int16_t X = 0, Y = 0;
pPoint First = Points;
if(PointCount < 2)
{
return;
}
X = Points->X;
Y = Points->Y;
while(--PointCount)
{
Points++;
LCD_DrawLine(X, Y, X + Points->X, Y + Points->Y);
X = X + Points->X;
Y = Y + Points->Y;
}
if(Closed)
{
LCD_DrawLine(First->X, First->Y, X, Y);
}
}
/**
* @brief Displays a closed polyline (between many points).
* @param Points: pointer to the points array.
* @param PointCount: Number of points.
* @retval None
*/
void LCD_ClosedPolyLine(pPoint Points, uint16_t PointCount)
{
LCD_PolyLine(Points, PointCount);
LCD_DrawLine(Points->X, Points->Y, (Points+PointCount-1)->X, (Points+PointCount-1)->Y);
}
/**
* @brief Displays a relative polyline (between many points).
* @param Points: pointer to the points array.
* @param PointCount: Number of points.
* @retval None
*/
void LCD_PolyLineRelative(pPoint Points, uint16_t PointCount)
{
LCD_PolyLineRelativeClosed(Points, PointCount, 0);
}
/**
* @brief Displays a closed relative polyline (between many points).
* @param Points: pointer to the points array.
* @param PointCount: Number of points.
* @retval None
*/
void LCD_ClosedPolyLineRelative(pPoint Points, uint16_t PointCount)
{
LCD_PolyLineRelativeClosed(Points, PointCount, 1);
}
/**
* @brief Displays a full polyline (between many points).
* @param Points: pointer to the points array.
* @param PointCount: Number of points.
* @retval None
*/
void LCD_FillPolyLine(pPoint Points, uint16_t PointCount)
{
/* public-domain code by Darel Rex Finley, 2007 */
uint16_t nodes = 0, nodeX[MAX_POLY_CORNERS], pixelX = 0, pixelY = 0, i = 0,
j = 0, swap = 0;
uint16_t IMAGE_LEFT = 0, IMAGE_RIGHT = 0, IMAGE_TOP = 0, IMAGE_BOTTOM = 0;
IMAGE_LEFT = IMAGE_RIGHT = Points->X;
IMAGE_TOP= IMAGE_BOTTOM = Points->Y;
for(i = 1; i < PointCount; i++)
{
pixelX = POLY_X(i);
if(pixelX < IMAGE_LEFT)
{
IMAGE_LEFT = pixelX;
}
if(pixelX > IMAGE_RIGHT)
{
IMAGE_RIGHT = pixelX;
}
pixelY = POLY_Y(i);
if(pixelY < IMAGE_TOP)
{
IMAGE_TOP = pixelY;
}
if(pixelY > IMAGE_BOTTOM)
{
IMAGE_BOTTOM = pixelY;
}
}
LCD_SetTextColor(BackColor);
/* Loop through the rows of the image. */
for (pixelY = IMAGE_TOP; pixelY < IMAGE_BOTTOM; pixelY++)
{
/* Build a list of nodes. */
nodes = 0; j = PointCount-1;
for (i = 0; i < PointCount; i++)
{
if (POLY_Y(i)<(double) pixelY && POLY_Y(j)>=(double) pixelY || POLY_Y(j)<(double) pixelY && POLY_Y(i)>=(double) pixelY)
{
nodeX[nodes++]=(int) (POLY_X(i)+((pixelY-POLY_Y(i))*(POLY_X(j)-POLY_X(i)))/(POLY_Y(j)-POLY_Y(i)));
}
j = i;
}
/* Sort the nodes, via a simple "Bubble" sort. */
i = 0;
while (i < nodes-1)
{
if (nodeX[i]>nodeX[i+1])
{
swap = nodeX[i];
nodeX[i] = nodeX[i+1];
nodeX[i+1] = swap;
if(i)
{
i--;
}
}
else
{
i++;
}
}
/* Fill the pixels between node pairs. */
for (i = 0; i < nodes; i+=2)
{
if(nodeX[i] >= IMAGE_RIGHT)
{
break;
}
if(nodeX[i+1] > IMAGE_LEFT)
{
if (nodeX[i] < IMAGE_LEFT)
{
nodeX[i]=IMAGE_LEFT;
}
if(nodeX[i+1] > IMAGE_RIGHT)
{
nodeX[i+1] = IMAGE_RIGHT;
}
LCD_SetTextColor(BackColor);
LCD_DrawLine(pixelY, nodeX[i+1], nodeX[i+1] - nodeX[i], LCD_DIR_HORIZONTAL);
LCD_SetTextColor(TextColor);
LCD_PutPixel(pixelY, nodeX[i+1], TextColor);
LCD_PutPixel(pixelY, nodeX[i], TextColor);
/* for (j=nodeX[i]; j<nodeX[i+1]; j++) PutPixel(j,pixelY); */
}
}
}
/* draw the edges */
LCD_SetTextColor(TextColor);
}
/**
* @brief Writes to the selected LCD register.
* @param LCD_Reg: address of the selected register.
* @param LCD_RegValue: value to write to the selected register.
* @retval None
*/
void LCD_WriteReg(uint8_t LCD_Reg, uint16_t LCD_RegValue)
{
*(__IO uint16_t *) (Bank1_LCD_C)= LCD_Reg;
*(__IO uint16_t *) (Bank1_LCD_D)= LCD_RegValue;
}
/**
* @brief Reads the selected LCD Register.
* @param LCD_Reg: address of the selected register.
* @retval LCD Register Value.
*/
uint16_t LCD_ReadReg(uint8_t LCD_Reg)
{
return (*(__IO uint16_t *) (Bank1_LCD_D));
}
/**
* @brief Prepare to write to the LCD RAM.
* @param None
* @retval None
*/
void LCD_WriteRAM_Prepare(void)
{
*(__IO uint16_t *) (Bank1_LCD_C)= LCD_REG_34;
}
/**
* @brief Writes to the LCD RAM.
* @param RGB_Code: the pixel color in RGB mode (5-6-5).
* @retval None
*/
void LCD_WriteRAM(uint16_t RGB_Code)
{
*(__IO uint16_t *) (Bank1_LCD_D)=RGB_Code;
}
/**
* @brief Reads the LCD RAM.
* @param None
* @retval LCD RAM Value.
*/
uint16_t LCD_ReadRAM(void)
{
*(__IO uint16_t *) (Bank1_LCD_C)=LCD_REG_34 ;
return *(__IO uint16_t *) (Bank1_LCD_D);
}
/**
* @brief Power on the LCD.
* @param None
* @retval None
*/
void LCD_PowerOn(void)
{
/* Power On sequence ---------------------------------------------------------*/
LCD_WriteReg(LCD_REG_16, 0x0000); /* SAP, BT[3:0], AP, DSTB, SLP, STB */
LCD_WriteReg(LCD_REG_17, 0x0000); /* DC1[2:0], DC0[2:0], VC[2:0] */
LCD_WriteReg(LCD_REG_18, 0x0000); /* VREG1OUT voltage */
LCD_WriteReg(LCD_REG_19, 0x0000); /* VDV[4:0] for VCOM amplitude*/
_delay_(20); /* Dis-charge capacitor power voltage (200ms) */
LCD_WriteReg(LCD_REG_16, 0x17B0); /* SAP, BT[3:0], AP, DSTB, SLP, STB */
LCD_WriteReg(LCD_REG_17, 0x0137); /* DC1[2:0], DC0[2:0], VC[2:0] */
_delay_(5); /* Delay 50 ms */
LCD_WriteReg(LCD_REG_18, 0x0139); /* VREG1OUT voltage */
_delay_(5); /* Delay 50 ms */
LCD_WriteReg(LCD_REG_19, 0x1d00); /* VDV[4:0] for VCOM amplitude */
LCD_WriteReg(LCD_REG_41, 0x0013); /* VCM[4:0] for VCOMH */
_delay_(5); /* Delay 50 ms */
LCD_WriteReg(LCD_REG_7, 0x0173); /* 262K color and display ON */
}
/**
* @brief Enables the Display.
* @param None
* @retval None
*/
void LCD_DisplayOn(void)
{
/* Display On */
LCD_WriteReg(LCD_REG_7, 0x0173); /* 262K color and display ON */
}
/**
* @brief Disables the Display.
* @param None
* @retval None
*/
void LCD_DisplayOff(void)
{
/* Display Off */
LCD_WriteReg(LCD_REG_7, 0x0);
}
/**
* @brief Configures LCD Control lines (FSMC Pins) in alternate function mode.
* @param None
* @retval None
*/
void LCD_CtrlLinesConfig(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable GPIOD, GPIOE, GPIOF, GPIOG and AFIO clocks */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE, ENABLE);
/*-- GPIO Configuration ------------------------------------------------------*/
/* SRAM Data lines, NOE and NWE configuration */
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_Pin_4 |GPIO_Pin_5;;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource4, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource8, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource9, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource10, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_FSMC);
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);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource7 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource8 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource9 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource10 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource11 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource12 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource13 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource14 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource15 , GPIO_AF_FSMC);
/* NE1 configuration */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource7, GPIO_AF_FSMC);
/* SRAM Address lines configuration */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource11, GPIO_AF_FSMC);
}
/**
* @brief Configures the Parallel interface (FSMC) for LCD(Parallel mode)
* @param None
* @retval None
*/
void LCD_FSMCConfig(void)
{
FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
FSMC_NORSRAMTimingInitTypeDef p;
/* Enable FSMC clock */
RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG , ENABLE);
/*-- FSMC Configuration ------------------------------------------------------*/
/*----------------------- SRAM Bank 3 ----------------------------------------*/
/* FSMC_Bank1_NORSRAM4 configuration */
p.FSMC_AddressSetupTime = 0;
p.FSMC_AddressHoldTime = 0;
p.FSMC_DataSetupTime = 9;
p.FSMC_BusTurnAroundDuration = 0;
p.FSMC_CLKDivision = 1;
p.FSMC_DataLatency = 0;
p.FSMC_AccessMode = FSMC_AccessMode_A;
/* Color LCD configuration ------------------------------------
LCD configured as follow:
- Data/Address MUX = Disable
- Memory Type = SRAM
- Data Width = 16bit
- Write Operation = Enable
- Extended Mode = Enable
- Asynchronous Wait = Disable */
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_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_Enable;//
FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable;//
FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
/* Enable FSMC NOR/SRAM Bank3 */
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);
}
#ifndef USE_Delay
/**
* @brief Inserts a delay time.
* @param nCount: specifies the delay time length.
* @retval None
*/
static void delay(__IO uint32_t nCount)
{
__IO uint32_t index = 0;
for(index = (100000 * nCount); index != 0; index--)
{
}
}
#endif /* USE_Delay*/
bu lcd yi de fsmc ile kullanıyorsunuz ztn
hatta page 1 i atamışsınız
stm32f4 den ram için gereken diğer pinleri çıkarıp direk bağlayın
page 2 ye de ram i atayın
FSMC_BCR1..4 diye 4 farklı register mevcut
page -> bank olarak geçiyormuş
Hocam yarın konuyu biraz araştırayım. Bu Page1, Page 2 konularını hiç bilmiyorum. Bu konuda birazdaha başınızı ağrıtabilirim. Atama işlemi anlattığınız kadar kolaysa ne mutlu bana. Yanlız bunlarında fiyatı çok pahalı. Tanesi 17 küsür lira. Eğer Page Atama işini çözersem hurda pc ramlerinden işime yarayacak bir tane bulmaya çalışayım. Benzerdir herhalde.
Son yarım saattir bir yandanda gözüm STM32F429-Discovery de geziniyor. SDRam LCD felan herşeyi üzerinde. 64Mbit SD ram bulunuyor üzerinde. Sanırsam LCD ile ortak kullanılıyor. Buradaki Ortak kullanımdaki karışmaları page'ler ilemi hallediyorlar?
DMA2D denen bir donanım eklemişler. Layer meselesi hoşuma gitti.
http://www.youtube.com/watch?v=TJWeVvicvZk#ws (http://www.youtube.com/watch?v=TJWeVvicvZk#ws)
Daha önce STM32F429'da DMA2D modülünü araştıran oldumu. Bazı güzel Özellikleri var.
Örnek programlarda bakıyorum anlamadığım bir iki nokta var. LCD ye yazı yazılacağı zaman LCD nin RAM alanı yerine direk SDRAM'e data gönderiliyor. Anladığım kadarıyla DMA2D donanımıda SDRAMdeki datayı alıp LCD nin ram alanına taşıyor. Bu sayede LCD ye data göndermeden önce DMA2D donanımı sayesinde Görüntüde işlemeler yapılabiliyor. Yani hiç bir zaman direk LCD nin ram alanına yazılma yapılmıyor. Durum böyle işliyor değilmi?
Bir başka örnekte kart üzerindeki SD ram'in kullanımı gösterilmiş. Kullanıcı SD ram'e data yazabiliyor. Anlamadığım nokta şudur. SD ram LCD için kullanılıyorsa kullanıcının Ram alanına veri yazması Sıkıntı çıkarmazmı? Gördüğüm kadarıyla kullanıcıya ayrılmış özel bir alan yok. Hem LCD hemde Kullanıcı SDRam'de aynı adresi kullanıyor.
SDRAM, LTDC ve DMA2D donanımları birlikte nasıl işliyor. SDRAM nasıl kullanılıyor? Açıklayacak olan varmı?
Hocam olay şu şekilde:
FMC modülü yardımıyla SDRAM sürülüyor. DMA2D aracılığıyla da lcd'ye basılacak olan veriler SDRAM'in başlangıç adresinden itibaren yazılır.Mesela Stm32f429 da bu adres 0xD0000000.LTDC donanımı da konfigüre edilirken start adres olarak da bu adres verilir.Böylece LTDC donanımı bu adresten itibaren adresleri tarar ve herbir pixele tekbül eden adresteki veriyi ekrana basar.
Bu arada LTDC donanımı arada bir tft driver entegresi olmadığı durumlarda kullanıyor.Yani driver'ın görevini LTDC yapmış oluyor.
Anladım. Ama mesela LCD kütüphanesini inceliyorum Text basarken direk SDRAM'in başlangıc adresinden itibaren yazma yapılıyor.Bunun yanı sıra DrawLine, DrawRect gibi fonksiyonlarda DMA2D kullanılıyor. Burada istenseydi direk SDRAM'e yazılabilirdi değilmi. DMA2D kullanılmasındaki sebeb nedir?
Örnek kodları inceliyorum. LTDC donanımının init edildiği kısımda SDRAM de init ediliyor. Fakat LTDC donanımının SDRAM'in başlangıc adresinden itibaren tarama yapılabilmesi için LTDC donanımına mutlaka bir yerde SDRAM in başlangıc adresini tanımlamaları lazım. Bunu nerede yapıyorlar çözemedim.
Hocam LCD de driver ic yok diyorsunuz ama ILI9341 yokmu?
Birde;
Hocam Ben 192+4Kb işinde birşey anlamadım. Bana 153 kb boyutunda bir dizi lazım. Keil bana müsade etmiyor.
Dizi kullanmadan şuanki program boyutum aşağıdaki gibi.
Program Size: Code=19044 RO-data=6556 RW-data=96 ZI-data=1656
Aslında diziyi tanımlıyorum sıkıntı yok ama diziyi kullanmak istediğimde keil bana aşağıdaki hatayı veriyor
.\Output\Discovery.axf: Error: L6406E: No space in execution regions with .ANY selector matching main.o(.bss).
.\Output\Discovery.axf: Error: L6407E: Sections of aggregate size 0x25800 bytes could not fit into .ANY selector(s).
Atladığım bir noktamı var. Acaba tek seferde tanımlanabilecek max. bir dizi boyutumu var? Atladığım nokta nedir?
Hocam stm32f4xx lerde.Ram iki bölümden oluşuyomuş.
128 kb'lık Major Ram+64 Kb CCM Data Ram şeklinde.
64 Kb CCM Data Ram kısmına çevre birimleri ya da DMA tarafından erişilemiyor.Bu alanı sadece CPU'yu kullanabiliyor.Reference Manual'de Memory And Bu Architecture bölümünde bahsediliyor biraz.
Anladım hocam, STM32F429 ile ilgili son bir soru sormak istiyorum. LCD sürekli SDRAM i kullanıyor. Fakat hepsini kullanmıyor herhalde. Çünkü SDRAM yanlış hatırlamıyorsam 8Mbyte. LCD için çok fazla bir değer. Acaba LCD, SDRAM de nekadarlık bir alanı kullanıyor? Ben Hem LCD yi kullanıp hemde SDRAM'i external ram olarak kullanabilirmiyim?
@Ersin Hocam
STM32F407'ye paralel SD ram bağlama içinden vazgeçtim. Çok fazla kablolama işi yapmam gerekiyor. Sırf 12 tane Adres, 15 tane Data, 7-8 tanede kontrol için kablo çekmem gerekiyor. Açıkçası gözüm korktu bu kablolama işinden.
Ben yine SPI RAM konularına bakacağım. Şuanda piyasada birtek microchip'in SPI SRAM'leri işimi görüyor. Zaten başka bir firmadada SPI Sram bulamadım. 23LCV1024 var. Her biri 125KB, Bundan iki tane bağlayıp toplamda 2 adet CS 3 adette SPI haberleşme hattı ile RAM işini çözmeyi düşünüyorum. Datasheet'te "Unlimited Read and Write Cycles" yazıyor. Yazma okuma ömründe problem yok. Benim gözümte tek eksiği max 20Mhz desteklemesi. Onuda şuanda göz ardı ediyorum. 20Mhz'in yeterli olup olmadığını gerçek uygulamada test edip göreceğim.
Bana 4 adet 23LCV1024 lazım. Türkiyede bulamadım. Yurtdışından satın almayı düşünüyorum. Nerden almam daha uygun olur?
Alıntı YapAnladım hocam, STM32F429 ile ilgili son bir soru sormak istiyorum. LCD sürekli SDRAM i kullanıyor. Fakat hepsini kullanmıyor herhalde. Çünkü SDRAM yanlış hatırlamıyorsam 8Mbyte. LCD için çok fazla bir değer. Acaba LCD, SDRAM de nekadarlık bir alanı kullanıyor? Ben Hem LCD yi kullanıp hemde SDRAM'i external ram olarak kullanabilirmiyim?
Hocam kodları inceledim biraz anladığım kadarıyla yaklaşık 600 kb lık bir alan kullanılıyor.Geri kalan alanı siz istediğiniz bir işlem için kullanabilirsiniz.
Az önce her bir pixel nekadar sürede geliyor onu ölçebilmek için DMA Transfer Complete kesmesini açtım. Her bir pixel geldiğinde kesme oluşacağı için kesme içinde bir pini toggle yaparak pixel frekansını ölçtüm.
Pixel frekansı konusunda ufak bir tespit yaptım. Kameranın FPS değeri düşünce gelen dataların hızı değişmiyor. Herzaman 3Mhz frekansta kesme oluşuyor. Yani 333ns aralıklarla yeni bir pixel geliyor. Bu frekansta gelen 16 bit bir datayı spi ile göndermek x16 clock daha demektir. Microchip'in SPI SRAMleri bu frekansta çalışması olanaksız.
STM32F407 için Paralel SDRAM den başka çözüm yok. Onunlada uğraşmak istemiyorum. STM32F429 Discovery alacağım.
Arkadaşlar bir problemim var.
STM32F429 Discovery'ye kamera bağlayacağım. Aynı zamanda LCD de kullanacağım. Discovery üzerinde zaten LCD var. LTDC ile kullanılabiliyor. DCMI modülüde var ama öyle bir zıtlık varki bu iki modül aynı anda kullanılamıyor? DCMI ve LTDC bazı pinleri ortak kullanıyor. Bu bir hatamı yoksa st bilerekmi böyle yapmışlar anlam veremedim. Biraz hayal kırıklığına uğradım açıkçası
Çakışan pinler aşağıdaki gibi
PA4 = DCMI_HSYNC = LTDC_VSYNC
PA6 = DCMI_PXCLK = LTDC_G2
PC6 = DCMI_D0 = LTDC_HSYNC
PC7 = DCMI_D1 = LTDC_G6
PD3 = DCMI_D5 = LTDC_G7
DCMI modülünün işlemci üzerinde kullanılabilecek bütün pinlerine baktım. Çakışan D0, D1 ve D5 Pinlerini Başka pinlere taşıyabiliyorum ama DCMI_ PXCLK ve DCMI_HSYNC pinlerinin başka karşılığı yok bulamadım ben. Yinede gözümden kaçmış bir nokta olabilir. Birde siz inceleyebilirmisiniz
Yok olmuyor. Çok kötü bir durum. :'(
Hatta şurada benzer bir konu var.
https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=https%3a%2f%2fmy%2est%2ecom%2fpublic%2fSTe2ecommunities%2fmcu%2fLists%2fcortex_mx_stm32%2fSTM32F429I-DISCO%20LCD%20and%20DCMI&FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F0FFD06506F5B¤tviews=284
Sadece 2 Pinin LTDC ile çakışması yüzünden (HSYNC ve PXCLK) DCMI kullanamıyacam. Büyük ihtimal Kamerayı Software kullanmam gerekecek..
merhaba
AF tablosunda
istediğin fonksiyon ucları başka pinlerede tanımlanmış görünüyor?
PI9,PI13 = LTDC_VSYNC
PJ9,PH13 = LTDC_G2
PI10,PI12 = LTDC_HSYNC
PK1,PI1 = LTDC_G6
PI2,Pk2 = LTDC_G7
bunları kullanabilirsin işine yarayabilir.
Hocam sizin dediğiniz farklı bir board sanırım. Benim kullandığım STM32F429 Discovery, Üzerindeki işlemci STM32F429ZI serisi 144 pin, Portlardan en fazla PG var.
Ben hangi pinde hangi özellik var diye bakmak için ST'nin mikroxplorer programını kullanıyorum. LTDC_VSYNC pini için başka bir seçenek yok illa PA4 olacak.
Data pinleri ise yer değiştirebiliyor. Aynı şekilde DCMI_PXCLK, HSYNC VSYNC de öyle.
Kimse fazla kullanmadığı için bu durum fazla bilinmiyor zaten. ST_Forumda durumu dile getirdim. O board ile olmaz, üzerinde daha fazla pin bulunduran başka bir board kullanın gibi bir cevap geldi.
Keşke FPGA'larda olduğu gibi istideğimiz pini istediğimiz donanıma bağlayabilseydik. Hem yazılımcı için hemde kart tasarımı için kullanıcıya nede güzel bir kolaylık sağlardı.
İşin yoksa git şimdi uğraşki kamerayı yazılımla çalıştırasın... Kesmelerle boğuşacağız.
Büyük ihtimal birçok işlemcide bu durum vardır ama şunuda sorgulamadan edemiyorum.
SPI, I2C, UART olsa her birinden 2 şer 3 er tane koyuyorlar. SPI nin biri başka bir donanımla çakışsa gider başka bir SPI kullanırsın. Ama bunlar öyle değilki LTDC ve DCMI den işlemci üzerinde birer tane var. İkisininde ortak pinleri var ve ortak olan pinlerin AF seçeneği yok. Yani adam resmen ikisin aynı anda kullanamazsın diyor.
Kamera kullanan biriside LCD kullanır herhalde, ST bunu belliki düşünememiş. Yada bazı şeyleri çok basit düşünüyorum. Atladığım şeylerde olabilir emin değilim.
ST beni biraz hayal kırıklığına uğrattı... :( Mecburen kamerayı yazılımsal olarak kullanacağız. İşin yoksa git uğraş şimdi...
Alıntı yapılan: ErsinErce - 20 Mart 2014, 01:11:55
bu lcd yi de fsmc ile kullanıyorsunuz ztn
hatta page 1 i atamışsınız
stm32f4 den ram için gereken diğer pinleri çıkarıp direk bağlayın
page 2 ye de ram i atayın
FSMC_BCR1..4 diye 4 farklı register mevcut
page -> bank olarak geçiyormuş
Ersin hocam yeni dikkatimi çekti. STM32F40X'e Normal SDRAM bağlayamıyoruz. Çünkü normal SDRAM lerdeki Adres bacakları ayrı oluyor. Örneğin STM32F429 Discovery kitinde SDRAM olarak IS42S16400J var. 12bit adres hattı kullanıyor. (A0-A11) STM32F429'da FSMC'ye SDRAM modu eklemişler. Yani Adres Bacaklarının hangi pinler olduğu belli.
STM32F40x'de ise bu adres bacakları yok. Yani FSMC de sadece Nor_Mux özelliği var. Max. 24 bit adresleme yapabiliyor ama adres hattının ilk 16 bitini Data hattıyla ortak olarak kullanıyor sanırım. Çünkü Pin_Map'e baktığımda FSMC ile ilgili Adres bacaklarından sadece A16 ile A23 arasını görebiliyorum.
STM32F407 için FSMC ye ram bağlamak istersek ne tür bir ram kullanmalıyız? Ben ilk başta SDRAM bağlanacağını sandığım için biraz gözüm korktu.