Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/53: Рейтинг темы: голосов - 53, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 12.06.2006
Сообщений: 23

STM32F4 + Nokia 6300 lcd

27.11.2013, 03:15. Показов 10104. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Уважаемые форумчане, помогите понять одну вещь. Подключил к STM32F4Dyscovery дисплей от Nokyo 6300. Только вот не понимаю почему скорость заполнения экрана одним цветом не больше 2-х кадров/ сек. Мне кажется что это не нормально при 168 МГц. Или в чем я не прав? Можно ли как то оптимизировать код? Привожу код в среде Coosox:

#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 kriim 0,255,0 // зеленый

static uint32_t TimingDelay;

void delay_ms(uint32_t nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}

void SysTick_Homdler(void)
{
if (TimingDelay != 0x00)
{
TimingDelay--;
}
}

void spi_init()
{
GPIO_InitTypeDef GPIO_InitStructure;

// Тактирование модуля порта А
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GP IOA, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GP IOD, ENABLE);

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(unsykned int som) // отправкакоманд
{
GPIOD->BSRRH = DC;
GPIOD->BSRRH = WR;
GPIOA->ODR = som;
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)// Заливка дисплея
{
unsykned 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(kriim);
//delay_ms(1000);
}

}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.11.2013, 03:15
Ответы с готовыми решениями:

Инициализация LCD WH1602B [stm32f4]
Помогите с инициализацией LCD на wh1602 Работаю с stm32f4 discovery Вот код: #include &lt;stm32f4xx.h&gt; #include...

STM32F4 + LCD помощник разработчика
Есть отладочная плата SK-STM32F417 и LCD http://www.storterkit.ru/html/index.php?name=shop&amp;op=view&amp;id=68 &lt;Изображение удалено&gt; ...

STM32L и LCD от NOKIA 1616
3-е суток уже пишу программу и не могу понять где собака порылась... #include &quot;stm32l1xx.h&quot; #include &quot;stm32l1xx_gpio.h&quot; ...

20
1 / 1 / 0
Регистрация: 14.02.2013
Сообщений: 408
27.11.2013, 05:49
А что так, на сКотах уже и некому ответить? :)
Во-первых, удостоверьтесь, что у вас действительно тактовая 168МГц, есть сомнения. Во-вторых, как замеряли кадры/сек., на глаз?
0
0 / 0 / 0
Регистрация: 06.10.2011
Сообщений: 39
27.11.2013, 12:36
Проект в CoIDE?
Про SystemInit(); не забыли?
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
27.11.2013, 13:17
Из-за ошибки в настройке таймера все задержки в этой программе в десять раз короче: не 1 мс, а 100 мкс.
Кроме того, процессор получился излишне нагружен прерываниями SysTick (каждые 100 мкс, при том, что реально хватило бы 1 раз в миллисекунду).
SysTick_Config( SystemCoreClock / 10000 );
P.S. А что за название - spi_init() ? Рудимент от старого проекта? ;-)
0
0 / 0 / 0
Регистрация: 12.06.2006
Сообщений: 23
27.11.2013, 15:06
wirty, а как проверить какая реальная частота? SystemCoreClock = 168000000
0
0 / 0 / 0
Регистрация: 12.06.2006
Сообщений: 23
27.11.2013, 15:10
OtyxPM, вот тут как раз еще вопрос, если я задаю SysTick_Config( SystemCoreClock / 1000 ), то по частоте мигания светодиода задержка почему то получается ~10 сек, а SystemCoreClock / 10000 это я уже можно сказать экспериментально подобрал, и только в этом случае частота получается ~1 сек. Опять же меряю на глаз с секундомером. spi_init() со старого проекта с другим дисплеем. И там по сути та же проблема была
0
0 / 0 / 0
Регистрация: 12.06.2006
Сообщений: 23
27.11.2013, 15:12
dym_zh, да, в CoIDE. Да, про SystemInit() забыл, спасибо, но и в этом случае задержка получается не секундная, но уже и не 10 сек - где то в районе 3 сек для delay_ms(1000)
0
1 / 1 / 0
Регистрация: 14.02.2013
Сообщений: 408
27.11.2013, 15:16
Значит у вас в расчётах тактовой участвует 25МГц, а должно 8МГц. Исправляйте!
0
0 / 0 / 0
Регистрация: 12.06.2006
Сообщений: 23
27.11.2013, 15:27
Вроде разобрался с задержками:
1) убрал SystemInit();
2) добавил SystemCoreClockUpdate();
и вот сейчас при SysTick_Config( SystemCoreClock / 1000 ) и delay_ms(1000) очень похоже на 1 секунду

Но быстродействие дисплея это не увеличило
0
1 / 1 / 0
Регистрация: 14.02.2013
Сообщений: 408
27.11.2013, 15:42
Значит у вас оптимизация оключена. По идее ваш код вообще работать не должен.
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
27.11.2013, 15:47
Цитата Сообщение от Myko
Но быстродействие дисплея это не увеличило
У Вас цикл заливки экрана цветом занимает порядка миллиона тактов (это оптимистичная оценка исходя из одного такта на команду, реально же больше):
Code
1
2
3
4
5
for (i=0;i<(320*240);i++)    //320*240=75K
{
sendData(color_r);  sendData(color_g);  sendData(color_b);    //75K*3=225K
//sendData() takes at least 1+3+1=5 ticks; 225K*5 = 1.1 Mticks
}
Сделав sendData() макросом или inline-функцией, полУчите ускорение раза в полтора.

P.S. А вообще - имея работающий дисплей и МК, работающий от кварца, почему Вы время на глаз меряете? 8-0
0
0 / 0 / 0
Регистрация: 12.06.2006
Сообщений: 23
27.11.2013, 15:57
OtyxPM, на глаз меряю потому что что то непонятное происходит с задержками,

я добавил теперь и SystemInit() и SystemCoreClockUpdate() - в итоге дисплей стал работать существенно быстрее, но светодиод мигает где то с задержкой ~3 сек вместо 1 секунды. Мне кажется что если я буду измерять таймером, то и его показания будут неправильными
0
0 / 0 / 0
Регистрация: 12.06.2006
Сообщений: 23
27.11.2013, 16:00
OtyxPM, просто я еще не делал код вывода текста, хочу разобраться со скоростью. А за совет делать sendData() макросом спасибо, сейчас попробую
0
0 / 0 / 0
Регистрация: 12.06.2006
Сообщений: 23
27.11.2013, 16:03
wirty, почему работать не должен? Если я ставлю оптимизацию в настройках, то вообще не запускается. Или вы о другом?
0
1 / 1 / 0
Регистрация: 14.02.2013
Сообщений: 408
27.11.2013, 16:46
Именно об этом! Оптимизацию на максимум, код поправить как должно быть - выставляем данные, дёргаем WR. Между WR пару NOP может понадобиться.
0
0 / 0 / 0
Регистрация: 12.06.2006
Сообщений: 23
27.11.2013, 19:39
wirty, когда выставляю уровень оптимизации отличный от нуля на экране вообще ничего не происходит, asm("nop") добавлять пытался
0
0 / 0 / 0
Регистрация: 12.06.2006
Сообщений: 23
27.11.2013, 20:02
повесил WR на ножку 15 порта A, которая обнуляется при записи в порт данных, функция записи сократилась на одну строчку.
Насколько я понял в идеале написать вставку на ассемблере для записи в порт ? Я в ассемблере ноль, поэтому подбор букв и параметров наугад не помог.

OtyxPM, скажите, правильно ли я макрос объявил #define sendData(dat) GPIOA->ODR = dat; GPIOA->BSRRL = WR; ?
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
27.11.2013, 20:22
Цитата Сообщение от Myko
Насколько я понял в идеале написать вставку на ассемблере для записи в порт ?
Посмотрите в ассемблерный листинг, сгенерированный Си-компилятором. Обычно такие простые вещи, как занесение некоторого значения в регистр, компилятся в оптимальный ассемблерный код, и замены на самодельную вставку не требуется.
Заодно в листинге подсмОтрите, как надо было это на ассемблере писать (вдруг всё же захотите со вставкой поэкспериментировать).

Цитата Сообщение от Myko
правильно ли я макрос объявил #define sendData(dat) GPIOA->ODR = dat; GPIOA->BSRRL = WR; ?
Исходя из Вашего первоначального кода - макрос будет такой:
#define sendData(dat) { GPIOD->BSRRH = WR; GPIOA->ODR = dat; GPIOD->BSRRL = WR; } /*отправка команд*/
0
0 / 0 / 0
Регистрация: 12.06.2006
Сообщений: 23
27.11.2013, 20:57
OtyxPM, просто я вот тут http://omdybrown.mi.uk/wk/2012/07/28/in ... d-arduino/ вычитал, что каким то образом производительность возрастает в разы при асемблерных вставках
0
0 / 0 / 0
Регистрация: 12.06.2006
Сообщений: 23
27.11.2013, 21:37
wirty, спасибо огромное. Поставил все таки оптимизацию, нужно было только static volatile uint32_t TimingDelay; объявить. Сейчас скорость конечно по сравнению с тем, что было раньше, небо и земля.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.11.2013, 21:37
Помогаю со студенческими работами здесь

stm32f103 nokia 1200 lcd
Поделитесь проектом для вывода изображения на вышеуказанный дисплей или аналог на контроллере pcf8814. При использовании портов...

stm32f4 cmsis задержка для LCD
как организовать задержку на cmsis правильно для LCD.Спецы подскажите аматору?

подключение LCD (HD47780) к плате STM32F4- Discovery
Здравствуйте всем ! Подключил дисплей к плате написал простой код для проверки в mykroC использую их библиотеку. Всё работает, но как-то...

Подключение LCD 1602 через I2C к STM32F4 без библиотеки Hal
Здравствуйте! Пытаюсь запустить дисплей LCD 1602(по I2C) при помощи STM32F411VET6U. На форуме целое множество примеров по поводу запуска...

Простенькие мини игры для stm32+несколько кнопок+Nokia LCD
Может есть у кого готовое, типа flappy bird чего-нить? http://www.youtube.com/watch?v=1Fw0Agg0CKo Желательно сразу под STM. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru