Ярлыки

_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)

воскресенье, 28 сентября 2014 г.

arctg

Разложение в ряд Маклорена:

y = arctg(x) = x - x^3/3 + x^5/5 - ...               |x| < 1

arctg(1/x) = 1/x - (1/2)x+ (1/5)x5 - .

tan(x) = x/(1-x^2/(3-x^2/(5-x^2/(7-x^2/...))))

Пусть max - больший катет, а min - меньший. Тогда длина гипотенузы приблизительно равна
max + min*min/(2*max)
Её максимальная относительная ошибка равна: 1 - sqrt(2)/1.5 ~ 0.057
А если взять формулу:
max + 0.43*min*min/max, то максимальная относительная ошибка будет ~ 0.01
Если же хочется сделать вычисления проще, то можно взять формулу:
max + 0.41*min, но ошибка будет 0.075
Коэффициенты  подобраны экспериментально с точность 0.01. Можно подобрать точнее.

Еще один пример ряда для x < 1;



Еще одна эмпирически подобранная формула:


//formula  y = -0.30097 + 0.61955*x - 0.001659*x*x
//x :number from 0..100%
//y : angle from 0..45° as approximation of the atan function.
int32_t arctang(int32_t Re, int32_t Im)
{
int32_t a,b,proc,arctg;
proc=a*100.0/b;
//proc_int=a*100/b;
arctg=(-300970 + 619550*proc - 1659*proc*proc)/1000000;
return arctg;

}

Для вычисления арктангенса можно использовать следующий алгоритм:
Вначале проверить знак x, изменить знак, сделав аргумент неотрицательным. Затем если x>1, обратить его: x1=1/x. Затем сокращаем область определения, используя формулу:

atan(x)=pi/6+atan((x*sqrt(3)-1)/(x+sqrt(3))).

Здесь sqrt(3) квадратный корень из 3. При этом необходимо запомнить число шагов (возможно, ноль). После этого, арктангенс на интервале [0,pi/12] аппроксимируется формулой (для single precision, в случае double формула должна быть улучшена!):

atan(x) = x*(0.55913709/(1.4087812+x2) +0.60310579-0.05160454*x2)

Затем к полученному результату добавляется столько pi/6, сколько было шагов сокращения области определения. Затем, в случае обращения, аргумента, результат вычитается из pi/2. Затем, если была смена знака, у результата меняем знак. Для повышенной точности, формулу на участке [0,pi/12] следует брать в виде:

atan(x) = x*(m0+n0*(x*x)+k0/(m1+n1*(x*x)+k1/(m2+n2*(x*x)+k2/(...)))),

то есть в том же виде цепной дроби, как и для single precision, только с некоторыми другими значениями m0,n0,k0;m1,n1,k1;... 

#define M_PI ((float)3.141592653589793)
#define M_PI12 (M_PI/12.F)
#define M_PI6 (M_PI/6.F)
#define M_PI2 (M_PI/2.F)
/* square root of 3 */
#define SQRT3 ((float)1.732050807569)

float Arctan(float x) {
  int sta=0,sp=0;
  float x2,a;
  /* check up the sign change */
  if(x<0.F) {x=-x;sta|=1;}
  /* check up the invertation */
  if(x>1.F) {x=1.F/x;sta|=2;}
  /* process shrinking the domain until x<PI/12 */
  while(x>M_PI12) {
    sp++; a=x+SQRT3; a=1.F/a; x*=SQRT3; x-=1.F; x*=a;
  }
  /* calculation core */
  x2=x*x; a=x2+1.4087812F; a=0.55913709F/a; a+=0.60310579F;
  a-=0.05160454F*x2; a*=x;
  /* process until sp=0 */
  while(sp>0) {a+=M_PI6;sp--;}
  /* invertation took place */
  if(sta&2) a=M_PI2-a;
  /* sign change took place */
  if(sta&1) a=-a;
  return(a);
}

воскресенье, 21 сентября 2014 г.

суббота, 13 сентября 2014 г.

MINI_STM32 Revision 01


для записи в шину контроллера дисплея дергаются порты:
Set_nWr;
Set_Rs; 
GPIOC->ODR = (GPIOC->ODR&0xff00)|(data&0x00ff);
GPIOB->ODR = (GPIOB->ODR&0x00ff)|(data&0xff00);
Clr_nWr;
Set_nWr;
Set_Cs;

a через FSMC одна команда:
*(__IO uint16_t *) (Bank1_LCD_D)= data;

STemWin для STM32F10x и ILI9320, ILI9325

STemWin поставляется с примерами для различных макетных плат ST, но без драйверов для дисплеев. В её состав входит только шаблон драйвера GUIDRV_Template.c в самом конце которого находится структура API

const GUI_DEVICE_API GUIDRV_Template_API = {
  //
  // Data
  //
  DEVICE_CLASS_DRIVER,
  //
  // Drawing functions
  //
  _DrawBitmap,
  _DrawHLine,
  _DrawVLine,
  _FillRect,
  _GetPixelIndex,
  _SetPixelIndex,
  _XorPixel,
  //
  // Set origin
  //
  _SetOrg,
  //
  // Request information
  //
  _GetDevFunc,
  _GetDevProp,
  _GetDevData,
  _GetRect,
};

Из документации можно выяснить, что из всех функций нам необходимо адаптировать под наш дисплей только  _GetPixelIndex и  _SetPixelIndex. В функцию _SetPixelIndex нам необходимо вставить процедуру установки пиксель для нашего дисплея в месте которое нам предусмотрительно оставлено

    GUI_USE_PARA(pDevice);
    GUI_USE_PARA(x);
    GUI_USE_PARA(y);
    GUI_USE_PARA(PixelIndex);
    {
      //
      // Write into hardware ... Adapt to your system
      //
      // TBD by customer...
      //
    }

  //if ( (x>240)||(y>320) ) return;
  //LCD_WR_CMD(0,0x02,x);
  //LCD_WR_CMD(1,0x03,y);  
  
  LCD_WR_CMD(32, y);
  LCD_WR_CMD(33, 319-x);
  //*(__IO uint16_t *) (Bank1_LCD_C)= 34;
  LCD_WR_REG(34);

  //LCD_WR_CMD(0,0x02,y);
  //LCD_WR_CMD(1,0x03,319-x);  
  //LCD_WR_REG(0x0E); 
  LCD_WR_Data(point);  

Для _GetPixelIndex необходимо вставить

  u16 temp;
  ili9320_SetCursor(x,y);
  LCD_WR_REG(34);
  //temp = ili9320_ReadData(); //dummy
  //temp = ili9320_ReadData();

  //  return (ili9320_BGR2RGB(ili9320_ReadData()));
  return (ili9320_ReadData());

Для того, чтобы emWin использовала этот модифицированный драйвер необходимо в файле  LCDConf.c  в процедуре LCD_X_Config вставить

//
// Physical display size
//
#define XSIZE_PHYS  240
#define YSIZE_PHYS  400
....
void LCD_X_Config(void)
{
    ....
    pDevice = GUI_DEVICE_CreateAndLink(GUIDRV_Template_API, GUICC_565, 0, 0);
    ....
}
....
int LCD_X_DisplayDriver(unsigned LayerIndex, unsigned Cmd, void * pData)
{
    ....
    switch (Cmd)
    {
        case LCD_X_INITCONTROLLER:
        {
            lcdInit();
            return 0;
        }
        ....
    }
    ....
}




четверг, 4 сентября 2014 г.

emWin Display Driver GUIDRV_CompactColor_16


    Данный драйвер поддерживает следующие типы дисплеев

  • Ampire FSA506
  • Epson S1D13742, S1D13743, S1D19122
  • FocalTech FT1509Himax HX8301, HX8312A, HX8325A, HX8340, HX8347, HX8352,HX8352B, HX8353
  • Hitachi HD66766, HD66772, HD66789
  • Ilitek ILI9161, ILI9220, ILI9221, ILI9320, ILI9325, ILI9326, ILI9328, ILI9342
  • LG Electronics LGDP4531, LGDP4551
  • MagnaChip D54E4PA7551
  • Novatek NT39122, NT7573
  • OriseTech SPFD5408, SPFD54124C, SPFD5414D, SPFD5420A
  • Renesas R61505, R61509, R61516, R61526, R61580, R63401
  • Samsung S6D0110A, S6D0117, S6D0128, S6D0129, S6D04H0
  • Sharp LCY-A06003, LR38825
  • Sitronix ST7628, ST7637, ST7687, ST7712, ST7715, ST7735, ST7787, ST7789
  • Solomon SSD1284, SSD1289, SSD1298, SSD1355, SSD1961, SSD1963, SSD2119
  • Toshiba JBT6K71
    Поддерживаемая глубина цвета - 16 бит.
    Драйвер поддерживает 8-ми и 16-ти битный параллельный интерфейс, а также SPI для 3-х линий управления. По умолчанию настроен на параллельный 8-ми битовый интерфейс.

To be able to use this driver the following macro definition needs to be added to the configuration file 

Для использования данного драйвера необходимо добавить макроопределение в файл LCDConf.h:



#define LCD_USE_COMPACT_COLOR_16

    После этого макроопределения в конфигурационном файле LCDConf_CompactColor_16.h добавляется строка:

GUI_DEVICE_CreateAndLink(GUIDRV_COMPACT_COLOR_16, GUICC_565, 0, 0);


    Драйвер может использоваться с дисплейным кешем в RAM или без него. Общее количество памяти для кэша

LCD_XSIZE * LCD_YSIZE * 2 bytes    (для дисплеев 320Х240Х2=153600)

        Конфигурационные макроопределения

    To select the desired controller the macro LCD_CONTROLLER should be used in the configuration file LCDConf_CompactColor_16.h. The following table shows the values to be used to select the appropriate controller:
    В файле  LCDConf_CompactColor_16.h задается макроопределение LCD_CONTROLLER определяющее тип контроллера


    Конфигурация дисплея задается макроопределениями

LCD_MIRROR_X Activate to mirror X-axis.
LCD_MIRROR_Y Activate to mirror Y-axis.
LCD_SWAP_XY Activate to swap X- and Y-axis.

    Конфигурация оборудования

LCD_NUM_DUMMY_READSNumber of required dummy reads if a read operation should be executed. The default value is 2. If using a serial interface the display controllers HD66766 and HD66772 need 5 dummy reads. Sharp LR38825 needs 3 dummy reads with a 8-bit bus.
LCD_REG01This macro is only required if a Himax HX8312A is used. Unfortunately the register 0x01 (Control register 1) contains orientation specific settings as well as common settings. So this macro should contain the contents of this register.
LCD_SERIAL_IDWith a serial 3 wire interface this macro defines the ID signal of the device ID code. It should be 0 (default) or 1. Please note: This macro is only used with the 3 wire protocol for Hitachi HD66772, Samsung S6D0117, Himax HX8301 and Ilitek ILI9220.
LCD_USE_SERIAL_3PINThis configuration macro has been implemented to support the 3 wire serial interface of the following controllers: Hitachi HD66772, Samsung S6D0117, Himax HX8301, Ilitek ILI9220. Should be set to 1 if the 3 wire serial interface is used. Default is 0.
Please note: Do not use this macro with other display controllers!
LCD_USE_PARALLEL_16Should be set to 1 if the 16 bit parallel interface is used. Default is 0.
LCD_WRITE_BUFFER_SIZEDefines the size of the write buffer. Using a write buffer increases the performance of the driver. If multiple pixels should be written with the same color, the driver first fills the buffer and then writes the contents of the buffer with one execution of the macro LCD_WRITEM_A1, instead of multiple macro executions. The default buffer size is 500 bytes.
LCD_WRITE_A0Write a byte to display controller with RS-line low.
LCD_WRITE_A1Write a byte to display controller with RS-line high.
LCD_READM_A1Read multiple bytes (8 bit parallel interface) or multiple words (16 bit parallel interface) from display controller with RS-line high.
LCD_WRITEM_A1Write multiple bytes (8 bit parallel interface) or multiple words (16 bit parallel interface) to display controller with RS-line high.
LCD_WRITEM_A0Write multiple bytes (8 bit parallel interface) or multiple words (16 bit parallel interface) to display controller with RS-line low.

    Пример кофигурации

LCDConf.h - добавить строку

#define LCD_USE_COMPACT_COLOR_16


LCDConf_CompactColor_16.h - добавить

//
// General configuration of LCD
//
#define LCD_CONTROLLER      66709 // Renesas R61516
#define LCD_BITSPERPIXEL       16
#define LCD_SWAP_RB             1
#define LCD_USE_PARALLEL_16     1
#define LCD_MIRROR_Y            1
//
// Indirect interface configuration
//
void LCD_X_Write01_16 (unsigned short c);
void LCD_X_Write00_16 (unsigned short c);
void LCD_X_WriteM01_16(unsigned short * pData, int NumWords);
void LCD_X_WriteM00_16(unsigned short * pData, int NumWords);
void LCD_X_ReadM01_16 (unsigned short * pData, int NumWords);

#define LCD_WRITE_A1 (Word) LCD_X_Write01_16(Word)
#define LCD_WRITE_A0 (Word) LCD_X_Write00_16(Word)
#define LCD_WRITEM_A1(Word, NumWords) LCD_X_WriteM01_16(Word, NumWords)
#define LCD_WRITEM_A0(Word, NumWords) LCD_X_WriteM00_16(Word, NumWords)
#define LCD_READM_A1 (Word, NumWords) LCD_X_ReadM01_16 (Word, NumWords)

LCDConf.c

void LCD_X_Config(void) {
  //
  // Set display driver and color conversion
  //
  GUI_DEVICE_CreateAndLink(GUIDRV_COMPACT_COLOR_16, // Display driver
                           GUICC_M565,              // Color conversion
                           0, 0);
  //
  // Display driver configuration
  //
  LCD_SetSizeEx(0, 240, 320);                       // Physical display size in pixels
}






понедельник, 1 сентября 2014 г.

emWin Display Drivers

    Драйвер дисплея поддерживает определенные типы контроллеров дисплея. Этот драйвер можно сконфигурировать изменив конфигурационные файлы не изменяя сам драйвер. Эти конфигурационные файлы включают всю необходимую информацию для драйвера, включая алгоритм обращения к контроллеру дисплея и способ его подключения.
    Начиная с версии emWin V5 интерфейс драйвера изменен. Старые драйвера, разработанные для версии ewWin V4 и более ранних больше не поддерживаются. Изменения в интерфейсе драйвера связаны с необходимостью поддержки RTOS.
    Все файлы относящиеся к определенному драйверу именуются однотипно. Например файлы


GUIDRV_IST3088.c

GUIDRV_IST3088.h

GUIDRV_IST3088_4.c

GUIDRV_IST3088_Private.h
GUIDRV_IST3088_X_4.c
относятся к группе файлов для драйвера GUIDRV_IST3088.
    Ниже приводится фрагмент таблицы драйверов для работы без RTOS.
    Полную таблицу можно найти на сайте Segger .

    Сущестуют два основных типа интерфейсов подключения CPU к дисплею

  • прямой интерфейс
  • не прямой интерфейс
    При прямом интерфейсе адресное пространство CPU непосредственно отображается на адресное пространство дисплея.


    При не прямом интерфейсе, который чаще всего применяется для небольших дисплеев возможно несколько вариантов. При использовании параллельной шины данных используется только один разряд шины данных и 8 или 16 разрядов шины данных с 2-мя или 3-мя шинами управления.




    Если контроллер подключен напрямую к адресной шине CPU макрос конфигурации очень простой и состоит из одной строки. При не прямом подключении макрос усложняется до 5-10 строк, эмулирующих шинный интерфейс. Сигнал А0 иногда обозначается как C/D (Command/Data), D/I (Data/Instruction) или RS (Register select). 
    Примеры описания подключения можно найти в папке SampleLCD_X:

LCD_X_6800.c, 6800 parallel interface.
LCD_X_8080.c, 8080 parallel interface.

    Более простой метод подключения 4-х проводной интерфейс SPI


    Пример описания подключения из вышеуказанной папки

LCD_X_SERIAL.c, serial interface

    Еще более простой метод 3-х проводной интерфейс SPI. В этом случае нет специальной шины для выбора режима передачи данные / команда. И для этого используют другие методы, например старший байт используют как признак передачи команды.


    Пример описания подключения

LCD_X_Serial_3Pin.c, 3 pin serial interface
LCD_X_Serial_3Wire.c, 3 pin serial interface

    Ну и напоследок самый простой интерфейс I2C из 2-х шин.


    Пример файла описания подключения

LCD_X_I2CBUS.c, I2C bus interface