Ярлыки

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

вторник, 7 июля 2020 г.

External memory programming

Keil FLM file function
Init
EraseSector
UnInit
EraseChip
ProgramPage
Verify
BlankCheck


ARM Linker

Set var address for QSPI

const unsigned char __test[] = {...
const unsigned char __test[] __at(0x90000000) = { ...



LOAD_ROM 0x0000 0x8000       ; Name of load region (LOAD_ROM),
                             ; Start address for load region (0x0000),
                             ; Maximum size of load region (0x8000)
{
    EXEC_ROM 0x0000 0x8000   ; Name of first exec region (EXEC_ROM),
                             ; Start address for exec region (0x0000),
                             ; Maximum size of first exec region (0x8000)
    {
        * (+RO)              ; Place all code and RO data into
                             ; this exec region
    }
    SRAM 0x10000 0x6000      ; Name of second exec region (SRAM),
                             ; Start address of second exec region (0x10000),
                             ; Maximum size of second exec region (0x6000)
    {
        * (+RW, +ZI)         ; Place all RW and ZI data into
                             ; this exec region
    }
}

пятница, 7 февраля 2020 г.

TouchGFX & Keil in CubeMX project

After generation project from CubeMX

Error: L6218E: Undefined symbol MX_FREERTOS_Init() (referred from main.o).
Error: L6218E: Undefined symbol GRAPHICS_MainTask (referred from freertos.o).


Correct

main.cpp
void MX_FREERTOS_Init(void)       ->    extern "C" void MX_FREERTOS_Init(void);

BoardConfiguration.cpp
void GRAPHICS_MainTask(void)       ->     extern "C" void GRAPHICS_MainTask(void)

четверг, 21 июня 2018 г.

Touchscreen function correction

static void BSP_Pointer_Update(void)
{
GUI_PID_STATE TS_State;
static TS_StateTypeDef prev_state;
TS_StateTypeDef ts;
uint16_t xDiff, yDiff;

BSP_TS_GetState(&ts);

TS_State.Pressed = ts.TouchDetected;

xDiff = (prev_state.X > ts.X) ? (prev_state.X - ts.X) : (ts.X - prev_state.X);
yDiff = (prev_state.Y > ts.Y) ? (prev_state.Y - ts.Y) : (ts.Y - prev_state.Y);

//if(ts.TouchDetected)
//{
if((prev_state.TouchDetected != ts.TouchDetected )|| (ts.TouchDetected &&
((xDiff > 3 )||
(yDiff > 3))))
{
prev_state = ts;

TS_State.Layer = 0;
TS_State.x = ts.X;
TS_State.y = ts.Y;

GUI_TOUCH_StoreStateEx(&TS_State);
if(ts.TouchDetected)
osDelay(50);
}
//}
}

вторник, 12 июня 2018 г.

CubeMX 4.25 & 4.26 GRAPHICS configuration MULTIBUF bug

If we create a graphics window for GRAPHICS configuration with GUIBuilder for file GUI_App.c

CreateWindow();



The CubeMX is creates function in file STemwin_wrapper.c



void GRAPHICS_Init(void)
{
/* Initialize the GUI */
GUI_Init();

//WM_MULTIBUF_Enable(1);
/* Enable the multi-buffering functionality */

/* Activate the use of memory device feature */
/* USER CODE BEGIN WM_SetCreateFlags */
//WM_SetCreateFlags(WM_CF_MEMDEV);
/* USER CODE END WM_SetCreateFlags */
}



If you delete comments

WM_MULTIBUF_Enable(1);
/* Enable the multi-buffering functionality */

/* Activate the use of memory device feature */
/* USER CODE BEGIN WM_SetCreateFlags */
WM_SetCreateFlags(WM_CF_MEMDEV);



after this, the graphical interface stops running !!!

(Attention!  After deleting comments and compiling, turn off and turn on the power)

The problem is solved by adding a line



WM_MULTIBUF_Enable(1);
/* Enable the multi-buffering functionality */

/* Activate the use of memory device feature */
/* USER CODE BEGIN WM_SetCreateFlags */
HAL_LTDC_ProgramLineEvent(&hltdc, 0); //!!!!!!!!!!!!!!!!!!!!!!!
WM_SetCreateFlags(WM_CF_MEMDEV);
/* USER CODE END WM_SetCreateFlags */



And everything works fine!



P.S.

If FREERTOS is used, it is necessary to eliminate one more bug


in file  ..........STemWin\Target\STemwin_wrapper.c   comment

line (85):

//extern volatile GUI_TIMER_TIME OS_TimeMS;

line (876) :

//   OS_TimeMS++;

пятница, 11 мая 2018 г.

Heap memory location

#include <stdlib.h>
/**************************************************************************/
// Keil uv4 MICROLIB compatible heap initialization
extern unsigned long __microlib_freelist;
extern unsigned long __microlib_freelist_initialised;
extern unsigned long __heap_base;
extern unsigned long __heap_limit;
/**************************************************************************/
void add_heap(unsigned long addr, unsigned long size)
{
  unsigned long *p = (unsigned long *)addr;
  unsigned long span;
  size >>= 2; // size in 32-bit words
  size -= 2; // two words used for internal structures
  if (__microlib_freelist_initialised == 0) // free list created yet?
  {
    __microlib_freelist_initialised = 1;
    __microlib_freelist = 0;
    span = 0;
  }
  else
  {
    span = __microlib_freelist - addr - (size << 2); // faux allocation across the discontinuity
  }
  p[0] = size << 2;           // size of list entry
  p[1] = __microlib_freelist; // next entry
  p[size] = span;
  p[size+1] = 0;              // terminal value
  __microlib_freelist = addr; // current entry
}
/**************************************************************************/
void alloc_heaps(void) // Called prior to any malloc()
{
  // Enumerate available heap memory regions in DECENDING memory order
//add_heap(0xD0000000, 0x800000); // SDRAM 8MB - Must be initialized
  add_heap((unsigned long)&__heap_base,(unsigned long)&__heap_limit - (unsigned long)&__heap_base); // Classic HEAP section
//  add_heap(0x20004000, 0x14000); // SRAM (PORTION OF)
  add_heap(0x10000000, 0x10000); // CCM 64K
}


===============================================================================

// STM32 Keil SDRAM HEAP STM32F429I-DISCO
// Use MicroLIB checked in options
// Use Scatter file in Linker options (not Memory Layout from Target Dialog)
/* heap.sct
LR_IROM1 0x08000000 0x00200000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00200000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x00030000  {  ; Internal SRAM
   .ANY (+RW +ZI)
  }
  RW_IRAM2 0x10000000 UNINIT 0x00010000  {  ; Internal CCM SRAM
   *(.ccm)
  }
  RW_RAM1 0xD0000000 UNINIT 0x00800000  { ; External SDRAM
   *(HEAP)
  }
}
*/
/* startup_stm32f429_439xx.s
...
Heap_Size       EQU     0x00800000
                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limit
...
*/
#include <stdio.h>
#include <stdlib.h>
#include "stm32f429i_discovery.h"
#include "stm32f429i_discovery_sdram.h"
/**************************************************************************************/
int main(void)
{
  char *p;
  /* Make sure to initialize the external memory, pins and buses before using them */
  /* SDRAM Initialization */
  SDRAM_Init();
  /* Disable write protection */
  FMC_SDRAMWriteProtectionConfig(FMC_Bank2_SDRAM,DISABLE);
  p = malloc(0x1000);
  printf("Allocation at %p\n", p);
  free(p);
  while(1); // Don't want to exit
}
//******************************************************************************
// Hosting of stdio functionality through SWV - Serial Wire Viewer
//******************************************************************************
#include <rt_misc.h>
#pragma import(__use_no_semihosting_swi)
struct __FILE { int handle; /* Add whatever you need here */ };
FILE __stdout;
FILE __stdin;
int fputc(int ch, FILE *f)
{
  ITM_SendChar(ch);
  return(ch);
}
int fgetc(FILE *f)
{
  char ch;
  ch = '?';
  return((int)ch);
}
int ferror(FILE *f)
{
  /* Your implementation of ferror */
  return EOF;
}
void _ttywrch(int ch)
{
  ITM_SendChar(ch);
}
void _sys_exit(int return_code)
{
label:  goto label;  /* endless loop */
}
#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t* file, uint32_t line)
{
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* Infinite loop */
  while (1)
  {
  }
}
#endif




For FREERTOS

__attribute__((section("HEAP"))) static unsigned char ucHeap[ configTOTAL_HEAP_SIZE ];