Ярлыки

_GetPixelIndex (1) _SetPixelIndex (1) 3-phase (1) 800x480 (1) АЦП (1) генератор (1) синхронный усилитель (2) структура (1) учебный курс (1) шаговый двигатель (1) ШИМ (2) accert (1) AD7608 (1) AD8429 (1) ADC (5) amplifer (1) arccos (1) arcsin (1) arctang (2) arctg (3) ARM (2) arm_sqrt_q15 (2) assembler (6) ASSERT (1) atan (2) bit (1) Bitband (1) boot (3) bootlloader (1) BUTTON (1) C (5) C# (1) CAN (2) CC2530 (5) CMSIS (4) command (1) Cordic (1) Core746I (1) CubeMX (4) DBGMCU (2) debug (2) debug.ini (1) delegate (1) Digital Potentiometers (1) DigitalPOT (1) Discovery (1) DMA (9) DMA2D (1) DSP (1) DSP library (1) DWT (1) EFM32 (5) EmWin (9) EXTI (1) FATFS (1) FMC (2) FreeRTOS (2) gl868-dual cmux (1) GPIO (4) GUI (2) GUIBuilder (1) GUIDRV_CompactColor_16 (1) HAL (3) HappyGecko (1) Hard Fault (2) heap (1) I2C (1) ID (1) ILI9320 (1) ILI9325 (1) Initialisation (1) InitLTDC (1) Instrumentithion (1) Interrupt (4) ITR (1) JTAG (1) Keil (5) LCDConf (2) lock-in (1) LTCD (1) LTDC (3) main (1) memory (1) MINI_STM32 Revision 01 (1) nBoot0 (1) NVIC (1) OnePulse (2) OSAL (4) pack (1) phase (1) printf (3) Pulse (1) PWM (12) RCC (2) RCR (1) Register (1) RESET (2) RS232 (3) RSS (1) RTC (3) RTOS-RTX (1) RTT (1) RTX-RTOS (1) SDCard (1) SDRAM (6) Segger (2) SPI (3) sqrt (3) SSD1298 (1) SSD1963 (1) Standart Peripherial Library (3) STANDBAY (1) startup (1) STemWin (8) stepper motor (1) STlink (2) STM32 (17) STM32429ZI (1) STM32Cube (1) STM32DBG.IN (1) STM32F (28) STM32F0 (4) STM32F1 (13) STM32F4 (10) STM32F4 Discovery (1) STM32F407ZG (1) STM32F429 (2) STM32F746 (1) STOP (1) string (1) struct (1) SWD (1) SWD JTAG (1) Synhronization (1) system_stm32f4xx.c (1) SystemInit (1) SysTick (1) task (4) telit (1) TIM (27) typedef (1) UART (1) USART (9) viewer (2) WM_PAINT (1) Z-stack (5) ZigBee (5)

понедельник, 24 апреля 2017 г.

STM32F746NG Discovery RAM STemWin problem (add external SDRAM)

// Define the available number of bytes available for the GUI
//
#define GUI_NUMBYTES  (1024) *  150

U32 aMemory[GUI_NUMBYTES / 4];

/*********************************************************************
*
*       Public code
*
**********************************************************************
*/
/*********************************************************************
*
*       GUI_X_Config
*
* Purpose:
*   Called during the initialization process in order to set up the
*   available memory for the GUI.
*/
void GUI_X_Config(void) 
{
  //
  // Assign memory to STemWin
  //
  GUI_ALLOC_AssignMemory(aMemory, GUI_NUMBYTES);
}



// Define the available number of bytes available for the GUI
//
#define GUI_NUMBYTES  (1024) *  2048
#define GUI_BLOCKSIZE 0x80
//U32 aMemory[GUI_NUMBYTES / 4] __attribute__ ((section(".GUI_RAM")));

/*********************************************************************
*
*       Public code
*
**********************************************************************
*/
/*********************************************************************
*
*       GUI_X_Config
*
* Purpose:
*   Called during the initialization process in order to set up the
*   available memory for the GUI.
*/
void GUI_X_Config(void)
{
  //
  // Assign memory to STemWin
  //
static U32 *aMemory;
aMemory=(U32*)0xc0000000;//as GUI's RAM buffer
GUI_ALLOC_AssignMemory(aMemory, GUI_NUMBYTES);
GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE);

}





































or add comment to main module
//  CPU_CACHE_Enable();




понедельник, 17 апреля 2017 г.

EmWin JPEG

#include "GUI.h"

/*********************************************************************
*
*       MainTask
*/
void MainTask(void) {
  GUI_JPEG_INFO Info;
  int           XSize;
  int           YSize;
  int           XPos;
  int           YPos;

  GUI_Init();
  GUI_JPEG_GetInfo(_acJimenez_dragan, sizeof(_acJimenez_dragan), &Info);
  XSize = Info.XSize;
  YSize = Info.YSize;
  XPos = (XSize > 320) ?  0 : 160 - (XSize / 2);
  YPos = (YSize > 180) ? 60 : 150 - (YSize / 2);
  GUI_JPEG_Draw(_acJimenez_dragan, sizeof(_acJimenez_dragan), XPos, YPos);
  while (1) {
    GUI_Delay(100);
  }
}

среда, 12 апреля 2017 г.

GUIDRV_CompactColor_16.c & .h

/*********************************************************************
*                SEGGER MICROCONTROLLER GmbH & Co. KG                *
*        Solutions for real time microcontroller applications        *
**********************************************************************
*                                                                    *
*        (c) 2003-2010     SEGGER Microcontroller GmbH & Co KG       *
*                                                                    *
*        Internet: www.segger.com    Support:  support@segger.com    *
*                                                                    *
**********************************************************************

----------------------------------------------------------------------
File        : GUIDRV_CompactColor_16.h
Purpose     : Interface definition for GUIDRV_CompactColor_16 driver
---------------------------END-OF-HEADER------------------------------
*/

#ifndef GUIDRV_COMPACTCOLOR_16_H
#define GUIDRV_COMPACTCOLOR_16_H

/*********************************************************************
*
*       Display drivers
*/
//
// Addresses
//
extern const GUI_DEVICE_API GUIDRV_Win_API;

extern const GUI_DEVICE_API GUIDRV_CompactColor_16_API;

//
// Macros to be used in configuration files
//
#if defined(WIN32) && !defined(LCD_SIMCONTROLLER)

  #define GUIDRV_COMPACT_COLOR_16 &GUIDRV_Win_API

#else

  #define GUIDRV_COMPACT_COLOR_16 &GUIDRV_CompactColor_16_API


#endif

#endif

/*************************** End of file ****************************/


GUIDRV_CompactColor_16.c


среда, 5 апреля 2017 г.

Графика в Delphi - Системное сообщение WM_PAINT

Прежде чем работать с графикой, необходимо понять, как именно в Windows реализован принцип перерисовки изображений. Не инструменты рисования являются предметом этого материала, а общий механизм перерисовки окон.

Данный материал посвящен системному сообщению WM_PAINT.

Основной принцип перерисовки: Save and Paint - сохраняй и прорисовывай.

Windows не хранит в памяти нарисованное изображение в виде растрового рисунка. Система перерисовывает ту часть окна, которая в каждый конкретный момент в этом нуждается.

Когда Windows (или другое приложение) посылает запрос на перерисовку окна или его части, этому окну посылается сообщение WM_PAINT.

Посылка сообщения WM_PAINT окну может быть вызвана как явным обращением к методам Window или RedrawWindow, так и получением запроса на перерисовку от системы, которое поступает при перемещении окна, изменении его размеров и так далее.

Windows посылает это сообщение, когда не имеется никаких других сообщений в очереди сообщений приложения.

Сообщение WM_PAINT относится к сообщениям с низким приоритетом, поэтому оно будет обработано в самую последнюю очередь.

Если будут посланы подряд несколько сообщений WM_PAINT, то обработано будет только одно, так как система не регистрирует следующие сообщения WM_PAINT. Таким образом достигается минимизация затрат на исполнение очень длительной операции - перерисовки окна.

В соответствии с общим подходом, принятым в Windows, перерисовываться будет не все окно, а только та часть, которая в этом нуждается. Так называемая область модификации - Region. К области модификации добавляется только некорректно отображаемая часть - Invalid Area, именно та часть окна, которая нуждается в перерисовке.

Область окна устанавливается как некорректная (Invalid area) методами Invalidate, InvalidateRect, или InvalidateRgn, а так же после того, как окно передвигают, изменяют его размеры или выполняют любою другою операцию, которая воздействует на клиентскую область окна.

Метод Invalidate объявляет некорректной всю клиентскую область окна.

Методы InvalidateRect и InvalidateRgn объявляет некорректной клиентскую область внутри данного прямоугольника, добавляя этот прямоугольник к текущей области модификации (Region).

Удалить некоторую область из Region можно методами ValidateRect или ValidateRgn. Таким образом, некорректные области накапливаются в Region, пока эта область не будет обработана при следующем сообщении WM_PAINT, или пока она не будет объявлена корректной принудительно, методом ValidateRect или ValidateRgn.

Как уже отмечалось выше, установка непустой области модификации Region не заставляет приложению немедленно перерисоваться. Вместо этого, приложение продолжает получать сообщения из очереди, пока все сообщения не будут обработаны. Затем Windows проверяет область модификации, и если область не пустая, посылает сообщение WM_PAINT окну. При проверке области модификации могут быть посланы так же сообщения WM_NCPAINT и WM_ERASEBKGND, если требуется перерисовать рамку (неклиентскую часть) окна или необходимо очистить окно.

Например, при увеличении размера окна будут посланы все три сообщения: WM_NCPAINT, WM_ERASEBKGND и WM_PAINT. При уменьшении размеров, окну придет только два сообщения из этой группы, сообщение WM_NCPAINT и WM_ERASEBKGND. По смыслу ситуации это резонно - при уменьшении окна клиентская часть его только урезается, следовательно стереть ее надо, а рисовать, вообще говоря, нечего.

Метод Window требует немедленной перерисовки клиентской области в обход общей очереди. Предварительно проверяется состояние области модификации: если область модификации не пустая, окну будет послано сообщение WM_PAINT. Если область модификации пуста сообщение WM_PAINT, наоборот, не будет послано.

Если эта область была помечена для стирания, то окну предварительно будет послано сообщение WM_ERASEBKGND.

Для получения более подробной информации смотрите Help WinAPI по темам:

- WM_PAINT
- WM_NCPAINT
- WM_ERASEBKGND
- Window
- InvalidateRect, InvalidateRgn
- GetRect, GetRgn
- BeginPaint & EndPaint

Все вышеперечисленные методы являются методами класса CWnd, доступного через WinAPI. Для перерисовки окон в Delphi применяются два метода: TWinControl.RePaint и TWinControl.ReFresh.

Метод RePaint заключается в объявлении всей области окна как некорректной и немедленного запроса на перерисовывание окна.

Метод Refresh является модификацией метода RePaint. Для класса TWinControl метод Refresh повторяет вызов RePaint.

Таким образом, если Вам необходимо немедленно обновить окно, воспользуйтесь методом RePaint, если в этом нет необходимости и перерисовку нужно запросить, но в порядке общей очереди, лучше использовать метод Invalidate;

Для получения более подробной информации смотрите реализацию методов:

- TWinControl.Invalidate
- TWinControl.
- метод Refresh для разных компонент, наследников от TWinControl.