Мой драйвер для ILI9325 на stm32f103 работает в Atollic TrueStudio, но не работает в Arduino IDE - PullRequest
2 голосов
/ 09 апреля 2019

Я пытаюсь соединить плату stm32f103c8t6 с ЖК-дисплеем ILI9325 Дисплей .Я создал драйвер для него в Atollic TrueStudio и успешно запустил его.Сейчас я пытаюсь перенести драйвер в IDE Arduino, потому что здесь будет проще интегрировать мой код с другим кодом для этого проекта.Тем не менее, драйвер не работает в Arduino IDE.ЖК-дисплей просто пустой.

Я протестировал базовую работу GPIO в Arduino IDE для stm32f1, она работает нормально.Я проверил контакты на ЖК-дисплее.Кажется, они получают команду от доски.Вся проводка правильная, потому что экран работает с кодом из Atollic без каких-либо изменений проводки.

Это код драйвера, который я использую в Arduino IDE.Это в основном так же, как в Atollic.Я изменил только функции инициализации и настройки GPIO.

#define LCD_RESET_Pin     9
#define LCD_CS_Pin        8
#define LCD_RS_Pin        7                  
#define LCD_WR_Pin        6              
#define LCD_RD_Pin        5 

#define TFT_W    320                    
#define TFT_H    240                    

#define WHITE           0xFFFF
#define BLACK           0x0000
#define BLUE            0x001F
#define RED             0xF800
#define MAGENTA         0xF81F
#define GREEN           0x07E0
#define CYAN            0x7FFF
#define YELLOW          0xFFE0
#define BROWN           0xBC40
#define BRRED           0xFC07                  // brownish red
#define GRAY            0x8430                  // gray
#define DARKBLUE        0x01CF                  // dark blue
#define LIGHTBLUE       0x7D7C                  // blue
#define GRAYBLUE        0x5458                  // gray-blue
#define LIGHTGREEN      0x841F                  // light green
#define LIGHTGRAY       0xC618                  // light gray

void write_cmd_tft(uint16_t command)
{
  gpio_write_bit(GPIOA, LCD_RS_Pin, LOW);           
  gpio_write_bit(GPIOA, LCD_CS_Pin, LOW);
  GPIOB->regs->ODR = command;               
  gpio_write_bit(GPIOA, LCD_WR_Pin, LOW);           
  delayMicroseconds(10);
  gpio_write_bit(GPIOA, LCD_WR_Pin, HIGH);
  gpio_write_bit(GPIOA, LCD_CS_Pin, HIGH);
}

void write_data16_tft(uint16_t data)
{
  gpio_write_bit(GPIOA, LCD_RS_Pin, HIGH);        
  gpio_write_bit(GPIOA, LCD_CS_Pin, LOW);
  GPIOB->regs->ODR = data;                        
  gpio_write_bit(GPIOA, LCD_WR_Pin, LOW);         
  delayMicroseconds(10);
  gpio_write_bit(GPIOA, LCD_WR_Pin, HIGH);
  gpio_write_bit(GPIOA, LCD_CS_Pin, HIGH);
}


#define cmd_write_ROM()     write_cmd_tft(0x22)       
#define cmd_write_pixel(color)  write_data16_tft(color)     

void write_reg_tft(uint16_t registerTFT, uint16_t dataTFT)
{
  write_cmd_tft(registerTFT);               
  write_data16_tft(dataTFT);                
}



void set_frame( uint16_t w1, uint16_t h1,                           
        uint16_t w2, uint16_t h2)                                   
{
  if ((w1 >= TFT_W)||(h1 >= TFT_H)||(w2 >= TFT_W)||(h2 >= TFT_H));  
  write_reg_tft(0x50,h1);                                           
  write_reg_tft(0x51,h2);                                           
  write_reg_tft(0x52,w1);                                           
  write_reg_tft(0x53,w2);                                           
  write_reg_tft(0x20,h1);                                           
  write_reg_tft(0x21,w1);
}


void draw_pixel(uint16_t w, uint16_t h, uint16_t color)
{
  write_reg_tft(0x20,h);                    
  write_reg_tft(0x21,w);                    
  write_reg_tft(0x22,color);                
}

void draw_point(uint16_t w, uint16_t h,           
        uint8_t size,                             
        uint16_t color)                           
{
  uint16_t i = (uint16_t)size*size;
  set_frame(w, h, w+size-1, h+size-1);          
  write_cmd_tft(0x22);                          
  while(i--)  write_data16_tft(color);          
}


void fill_color (uint16_t color)
{
  uint32_t i = (uint32_t)(TFT_W)*(TFT_H);         
  Serial2.print("Число пикселей: ");
  Serial2.println(i);
  set_frame(0, 0, TFT_W-1, TFT_H-1);              
  write_cmd_tft(0x22);                            
  while(i--) write_data16_tft(color);             
}

void init_tft (void)
{
  gpio_write_bit(GPIOA, LCD_RD_Pin, HIGH);        
  gpio_write_bit(GPIOA, LCD_RESET_Pin, LOW);
  delay(100);
  gpio_write_bit(GPIOA, LCD_RESET_Pin, HIGH);
  delay(100);

  write_reg_tft(0x01,0x0000);               
  write_reg_tft(0x02,0x0700);
  write_reg_tft(0x03,0x1038);               
  write_reg_tft(0x04,0x0000);
  write_reg_tft(0x07,0x0000);
  write_reg_tft(0x08,0x0302);
  write_reg_tft(0x09,0x0000);
  write_reg_tft(0x0A,0x0000);
  write_reg_tft(0x0C,0x0000);
  write_reg_tft(0x0D,0x0000);
  write_reg_tft(0x0F,0x0000);
  write_reg_tft(0x10,0x1290);
  write_reg_tft(0x11,0x0007);
  delay(100);
  write_reg_tft(0x12,0x0092);
  delay(100);
  write_reg_tft(0x13,0x0E00);
  delay(100);
  write_reg_tft(0x29,0x0005);
  write_reg_tft(0x2B,0x000E);

  write_reg_tft(0x30,0x0004);
  write_reg_tft(0x31,0x0307);
  write_reg_tft(0x32,0x0002);
  write_reg_tft(0x35,0x0206);
  write_reg_tft(0x36,0x0A00);
  write_reg_tft(0x37,0x0507);
  write_reg_tft(0x38,0x0204);
  write_reg_tft(0x39,0x0707);
  write_reg_tft(0x3C,0x0405);
  write_reg_tft(0x3D,0x0000);

  write_reg_tft(0x50,0x0000);
  write_reg_tft(0x51,0x00EF);
  write_reg_tft(0x52,0x0000);
  write_reg_tft(0x53,0x013F);

  write_reg_tft(0x60,0xA700);               
  write_reg_tft(0x61,0x0001);
  write_reg_tft(0x6A,0x0000);

  write_reg_tft(0x80,0x0000);
  write_reg_tft(0x81,0x0000);
  write_reg_tft(0x82,0x0000);
  write_reg_tft(0x83,0x0000);
  write_reg_tft(0x84,0x0000);
  write_reg_tft(0x85,0x0000);

  write_reg_tft(0x90,0x0029);
  write_reg_tft(0x92,0x0600);
  write_reg_tft(0x93,0x0003);
  write_reg_tft(0x95,0x0110);
  write_reg_tft(0x97,0x0000);
  write_reg_tft(0x98,0x0000);
  write_reg_tft(0x07,0x0133);

  fill_color(BLUE);                   
}

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize GPIO pins  
  pinMode(PA9, OUTPUT);                             //LCD_RESET_Pin
  pinMode(PA8, OUTPUT);                             //LCD_CS_Pin
  pinMode(PA7, OUTPUT);                             //LCD_RS_Pin
  pinMode(PA6, OUTPUT);                             //LCD_WR_Pin
  pinMode(PA5, OUTPUT);                             //LCD_RD_Pin

  gpio_write_bit(GPIOA, LCD_RESET_Pin, HIGH);
  gpio_write_bit(GPIOA, LCD_CS_Pin, HIGH);
  gpio_write_bit(GPIOA, LCD_RS_Pin, HIGH);
  gpio_write_bit(GPIOA, LCD_WR_Pin, HIGH);
  gpio_write_bit(GPIOA, LCD_RD_Pin, HIGH);

  pinMode(PB15, OUTPUT);                             
  pinMode(PB14, OUTPUT);                             
  pinMode(PB13, OUTPUT);                             
  pinMode(PB12, OUTPUT);                             
  pinMode(PB11, OUTPUT);      
  pinMode(PB10, OUTPUT);                             
  pinMode(PB9, OUTPUT);                             
  pinMode(PB8, OUTPUT);
  pinMode(PB7, OUTPUT);                             
  pinMode(PB6, OUTPUT);                             
  pinMode(PB5, OUTPUT);                             
  pinMode(PB4, OUTPUT);                             
  pinMode(PB3, OUTPUT);      
  pinMode(PB2, OUTPUT);                             
  pinMode(PB1, OUTPUT);                             
  pinMode(PB0, OUTPUT);                          

  init_tft();                                  
}

// the loop function runs over and over again forever
void loop() {
}

Что нужно сделать, это инициализировать ЖК-дисплей и залить его синим цветом.Вместо этого это просто пустой экран.

...