Уважаемые форумчане, помогите понять одну вещь. Подключил к STM32F4Discovery дисплей от Nokia 6300 как показано здесь
http://phreakerclub.com/464 Только вот не понимаю почему скорость заполнения экрана одним цветом не больше 2-х кадров/ сек. Мне кажется что это не нормально при 168 МГц. Или в чем я не прав? Можно ли как то оптимизировать код? Привожу код в среде Coocox:
#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#define DC GPIO_Pin_8
#define WR GPIO_Pin_9
#define RES GPIO_Pin_10
#define black 0,0,0 // черный
#define red 255,0,0 // красный
#define green 0,255,0 // зеленый
static uint32_t TimingDelay;
void delay_ms(uint32_t nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
void SysTick_Handler(void)
{
if (TimingDelay != 0x00)
{
TimingDelay--;
}
}
void spi_init()
{
GPIO_InitTypeDef GPIO_InitStructure;
// Тактирование модуля SPI1 и порта А
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
GPIO_DeInit(GPIOA);
GPIO_DeInit(GPIOD);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_Pin = DC | WR | RES;
GPIO_Init(GPIOD, &GPIO_InitStructure);
}
void sendCom(unsigned int com) // отправкакоманд
{
GPIOD->BSRRH = DC;
GPIOD->BSRRH = WR;
GPIOA->ODR = com;
GPIOD->BSRRL = WR;
GPIOD->BSRRL = DC;
}
void sendData(char dat) // отправкакоманд
{
GPIOD->BSRRH = WR;
GPIOA->ODR = dat;
GPIOD->BSRRL = WR;
}
void LCDinit()// инициализация дисплея
{
GPIOD->BSRRL = WR;
GPIOD->BSRRH = RES;
delay_ms(1);
GPIOD->BSRRL = RES;
delay_ms(5);
sendCom(0x11); // Выход дисплея из спячки
sendCom(0x29); // Включение дисплея
delay_ms(1);
sendCom(0x36);
sendData(0xC0);// Книжная ориентация дисплея
sendCom(0x3A);
sendData(0b00000111); // 24 битныйрежим
}
void LCDclear(char color_r, char color_g, char color_b)// Заливка дисплея
{
unsigned long int i;
sendCom(0x2A); // КомандаориетациипоХкоординате
sendData(0); sendData(0); // ДанныеначалаХкоординат (0)
sendData(0); sendData(240); // Данные конца Х координат (240)
sendCom(0x2B); //Команда ориентации по Y координате
sendData(0); sendData(0); // Данные начала Y координат (0)
sendData(1); sendData(320); // Данные конца Y координат (320)
sendCom(0x2C); //Команда записи в память дисплея
for (i=0;i<(320*240);i++)
{
sendData(color_r);
sendData(color_g);
sendData(color_b);
}
}
int main(void)
{
spi_init();
SysTick_Config( SystemCoreClock / 10000 );
LCDinit();
while(1)
{
LCDclear(black);
//delay_ms(1000);
LCDclear(red);
//delay_ms(1000);
LCDclear(green);
//delay_ms(1000);
}
}