Перейти к содержанию
    

MementoMori

Свой
  • Постов

    1 340
  • Зарегистрирован

  • Посещение

Весь контент MementoMori


  1. Виноват) Исправлюсь)
  2. Вчерашний вопрос снимается, нет нужды смотреть выложенный мной проект. Светодиод заморгал после того, как я отключил функцию настройки тактирования от hse Не понятно, чем она могла помешать...
  3. До этого дошел уже вчера днем, сделал, не работает, выложил проект попросил кого-нибудь посмотреть, в чем дело. Но вы мой пост не читали. Сделано еще до вчерашнего вашего совета. Как вы не понимаете, у меня код записи, чтения не не работает, а не вызывается, что толку его отлаживать в другом железе? Я для чистоты эксперимента диодиком решил моргнуть - и этого не происходит.
  4. Спасибо, капитан очевидность. Видели фрагмент кода, зажигающий диодик? Он, можно сказать, не нуждается в отладке. Но не работает. Не работает не потому что кривой, а потому что попросту не вызывается в конкретном проекте. Что и породило вопрос об отладке самого проекта, а не фрагментов кода. В связи с чем ваш совет и сопряженный с ним юмор не совсем в тему.
  5. Господа, а как этот проект, генерирующий FLM отлаживать? У меня при прошивке с добавлением сформированного FLM в качестве алгоритма пишет что истек таймаут флеша. Я для начала решил попробовать хотя бы диодом поморгать, чтобы убедиться что у меня хоть что-то из моей программы вызывается int Init (unsigned long adr, unsigned long clk, unsigned long fnc) { SystemInit(); HAL_Init(); SystemClock_Config(); GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOB_CLK_ENABLE(); /*Configure GPIO pin : LCD_PWM_Pin */ GPIO_InitStruct.Pin = GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET); /* Add your Code */ return (0); // Finished without Errors } В этом случае мне немедленно выдается сообщение о невозможности загрузки алгоритма. Диод естественно не загорается. Господа, в аттаче проект. Генерирует FLM. При добавлении этого FLM в качестве алгоритма, он пока даже не касается программирования флеша. Он должен хотя бы зажечь диод. Не делает и этого. Гляньте, что я делаю не так? W25Q128.rar
  6. Нет.. рановато еще браться за алгоритм... тут какая-то фундаментальная проблема. Смотрите, я сделал проект в кубе, TouchGFX. Вроде работает, фоновая картинка грузится, кнопочки нажимаются. Картинки размещены в ExtFlashSection. Однако я обратил внимание, что при записи прошивки она идет только по адресам 0x8xxx, по адресу 0х9хххх ничего не пишется. Особенно я посмеялся, когда закомментировал строку MX_QUADSPI_Init();, но программа не потеряла работоспособность. Залез я в проект. В SCT файле, сгенерированном системой, вот что LR_IROM1 0x08000000 0x00200000 { ; load region size_region intflash.bin 0x08000000 0x00200000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x20000000 0x00030000 { ; RW data .ANY (+RW +ZI) } } Я добавил необходимое для работы с QSPI LR_EROM1 0x90000000 0x01000000 { ; load region size_region extflash.bin 0x90000000 0x01000000 { ; load address = execution address *.o (ExtFlashSection) } } Добавил в настройках отладчика алгоритм STM32F746G-DISCO_N25Q128A. Ура! в процессе прошивки в левом нижнем углу стали отображаться адреса 0х9хххххх Но при запуске картинки не выводятся. Программа виснет в функции static portTASK_FUNCTION( prvIdleTask, pvParameters ) на строках if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > ( UBaseType_t ) 1 ) { taskYIELD(); } Что не так?
  7. Разбираюсь. Делаю строго по инструкции. Объясните мне вот этот момент. Файл FlashDev.c. struct FlashDevice const FlashDevice = { FLASH_DRV_VERS, // Driver Version, do not modify! "W25Q128", // Device Name EXTSPI, // Device Type 0x90000000, // Device Start Address 0x01000000, // Device Size in Bytes (16MB) 0x100, // Programming Page Size 0, // Reserved, must be 0 0xFF, // Initial Content of Erased Memory 100, // Program Page Timeout 100 mSec 3000, // Erase Sector Timeout 3000 mSec // Specify Size and Address of Sectors 0x002000, 0x000000, // Sector Size 8kB (8 Sectors) 0x010000, 0x010000, // Sector Size 64kB (2 Sectors) 0x002000, 0x030000, // Sector Size 8kB (8 Sectors) SECTOR_END }; Как понять, что устанавливать в качестве размеров и адресов секторов. Почему в шаблоне их три? Это перечисляются варианты или как? Почему параметры первого и третьего секторов , указанные в комментарии, одинаковы, а подставленные данные различны. В даташите сказано Flexible Architecture with 4KB sectors – Uniform Sector/Block Erase (4K/32K/64K-Byte Pages can be erased in groups of 16 (4KB sector erase), groups of 128 (32KB block erase), groups of 256 (64KB block erase) or the entire chip (chip erase). The Я не понимаю, как, исходя из даташита, заполнить этот блок.
  8. Ну зачмырили) пошел включать мозг)
  9. Или вот... https://drive.google.com/file/d/1fS4yxfyPWTnLyneSjSkqFREj64l5_BtX/view?usp=sharing камень 7 серии, библиотека HAL (проще будет перенести код инициализаии контроллера), генерирует FLM. Копирую в папку keil - и могу добавлять в качестве алгоритма. Это оно? Его допиливать?
  10. Из папки C:\Program Files (x86)\STMicroelectronics\STM32 ST-LINK Utility\ST-LINK Utility\ExternalLoader\N25Q256A_STM32L476G-EVAL_Cube\Projects\STM32L476G_EVAL\Examples\QSPI\N25Q256A_STM32L476G-EVAL Скачал вот такой проект https://cloud.mail.ru/public/4xAK/3p6Wyj79b С виду - то что мне надо - описание микросхемы - и инициализация периферии. Только отредактировать инициализацию и подстроить под память. Это оно или нет? Смущает то, что при компиляции генерируется не то, что обычно, а некий файл .stldr, а в списке алгоритмов эта микросхема не появляется.
  11. А что, так можно, да?))))) Хорошо, пороюсь. Просто нахожусь в некотором испуге от того, что не подумал об этом на этапе проектирования платы.... Крамольный вопрос.... может у кого есть алгоритм под W25Q128 ?
  12. Схему, разъясненную на пальцах, понял. Как взять шаблон, как отредактировать. Не вдаваясь в специфику своих микросхем просто попробовал довести эту схему до того, чтобы у меня в списке алгоритмов появилось что-то новое. Получилось. Но нигде не увидел про настройки самого контроллера. За это отвечает функция Init? Туда можно записывать любой код? Мне ведь нужно настроить периферию, GPIO, включать mapping mode. Все это делается тут? int Init (unsigned long adr, unsigned long clk, unsigned long fnc) { /* Add your Code */ return (0); // Finished without Errors }
  13. Насколько я понял, контроллер STM умеет сам шить внешнюю SPI-память посредством KEIL. То есть он как-то с ним общается, не имея внутри прошивки. Нужно лишь раскидать данные по адресам. И если нужно писать во внутреннюю flash, то он будет писать по адресу 0x8000000, если во внешнюю - то он запустит у в себе модуль QSPI и запишет по адресу 0x9..... Но ведь ножки qspi ремаппятся. У меня они переназначены. Как контроллер будет программировать flash, не зная моей схемы? /* ----------------------------------------------------------------------------- * Copyright (c) 2014 ARM Ltd. * * This software is provided 'as-is', without any express or implied warranty. * In no event will the authors be held liable for any damages arising from * the use of this software. Permission is granted to anyone to use this * software for any purpose, including commercial applications, and to alter * it and redistribute it freely, subject to the following restrictions: * * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software in * a product, an acknowledgment in the product documentation would be * appreciated but is not required. * * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * * 3. This notice may not be removed or altered from any source distribution. * * * $Date: 15. April 2014 * $Revision: V1.00 * * Project: Flash Programming Functions for Micron M29W640Fx * --------------------------------------------------------------------------- */ /* History: * Version 1.00 * Initial release */ #include "..\FlashOS.H" // FlashOS Structures #define M8(adr) (*((volatile unsigned char *) (adr))) #define M16(adr) (*((volatile unsigned short *) (adr))) #define M32(adr) (*((volatile unsigned long *) (adr))) #define STACK_SIZE 64 // Stack Size union fsreg { // Flash Status Register struct b { unsigned int q0:1; unsigned int q1:1; unsigned int q2:1; // alternative toggle bit unsigned int q3:1; // erase timer bit unsigned int q4:1; unsigned int q5:1; // error bit unsigned int q6:1; // toggle bit unsigned int q7:1; // data polling bit } b; unsigned int v; } fsr; unsigned long base_adr; /* * Check if Program/Erase completed using the toggle bit * Parameter: adr: Block Start Address * Return Value: 0 - OK, 1 - Failed */ int Polling (unsigned long adr) { unsigned int q6; fsr.v = M16(adr); q6 = fsr.b.q6; do { fsr.v = M16(adr); if (fsr.b.q6 == q6) return (0); // Done q6 = fsr.b.q6; // if (fsr.b.q3 == 1) break; // VPP not high enough } while (fsr.b.q5 == 0); // Check for Timeout fsr.v = M16(adr); q6 = fsr.b.q6; fsr.v = M16(adr); if (fsr.b.q6 == q6) return (0); // Done M16(adr) = 0xF0; // Reset Device return (1); // Failed } /* * Initialize Flash Programming Functions * Parameter: adr: Device Base Address * clk: Clock Frequency (Hz) * fnc: Function Code (1 - Erase, 2 - Program, 3 - Verify) * Return Value: 0 - OK, 1 - Failed */ int Init (unsigned long adr, unsigned long clk, unsigned long fnc) { base_adr = adr; return (0); } /* * De-Initialize Flash Programming Functions * Parameter: fnc: Function Code (1 - Erase, 2 - Program, 3 - Verify) * Return Value: 0 - OK, 1 - Failed */ int UnInit (unsigned long fnc) { return (0); } /* * Erase complete Flash Memory * Return Value: 0 - OK, 1 - Failed */ int EraseChip (void) { // Start Chip Erase Command M16(base_adr + (0x0555 << 1)) = 0xAA; M16(base_adr + (0x0AAA << 1)) = 0x55; M16(base_adr + (0x0555 << 1)) = 0x80; M16(base_adr + (0x0555 << 1)) = 0xAA; M16(base_adr + (0x0AAA << 1)) = 0x55; M16(base_adr + (0x0555 << 1)) = 0x10; return (Polling(base_adr)); // Wait until Erase completed } /* * Erase Sector in Flash Memory * Parameter: adr: Sector Address * Return Value: 0 - OK, 1 - Failed */ int EraseSector (unsigned long adr) { // Start Erase Sector Command M16(base_adr + (0x0555 << 1)) = 0xAA; M16(base_adr + (0x0AAA << 1)) = 0x55; M16(base_adr + (0x0555 << 1)) = 0x80; M16(base_adr + (0x0555 << 1)) = 0xAA; M16(base_adr + (0x0AAA << 1)) = 0x55; M16(adr) = 0x30; return (Polling(adr)); // Wait until Erase completed } /* * Program Page in Flash Memory * Parameter: adr: Page Start Address * sz: Page Size * buf: Page Data * Return Value: 0 - OK, 1 - Failed */ int ProgramPage (unsigned long adr, unsigned long sz, unsigned char *buf) { int i; for (i = 0; i < ((sz+1)/2); i++) { // Start Program Command M16(base_adr + (0x0555 << 1)) = 0xAA; M16(base_adr + (0x0AAA << 1)) = 0x55; M16(base_adr + (0x0555 << 1)) = 0xA0; M16(adr) = *((unsigned short *) buf); if (Polling(adr) != 0) return (1); buf += 2; adr += 2; } return (0); } Открыл первое попавшееся. Это алгоритм? Здесь же ничего кроме операций присваивания. Нужно писать полноценную программу инициализации периферии, GPIO?
  14. Спасибо. А что насчет ремаппинга?
  15. Спасибо, но нельзя ли как-то более адресно? В том доке, что в меню кейла, где-то на сайте? Что там, что там так сразу и не найдешь.
  16. Прошивка QSPI из Keil.

    Добрый вечер. Осваиваю ToucghGFX. На самодельной плате на основе STM32F746BG Добрался я до заливки картинок во внешнюю память. SCT файл у меня такой LR_IROM1 0x08000000 0x00200000 { ; load region size_region intflash.bin 0x08000000 0x00200000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x20000000 0x00030000 { ; RW data .ANY (+RW +ZI) } } LR_EROM1 0x90000000 0x01000000 { ; load region size_region extflash.bin 0x90000000 0x01000000 { ; load address = execution address *.o (ExtFlashSection) } } Добавлены следующие алгоритмы Поначалу ругалось на недостаток памяти для алгоритма, заткнулось когда установил 0x4000. При попытке записи вначале происходит стирание, при этом видно, что обращение идет по правильному адресу, то есть по 0x90000000. Однако спустя секунду выдается сообщение об истечении Flash Timeout Я догадываюсь, что я просто не все настроил. В частности, у меня не такая qspi память, как в дисковери, а пара W25Q128JVSIQ с общим CS. Более того - у меня ремаппинг памяти, контроллер этого может не знать. А посему вопросы. 1. Не обрубил ли я на корню возможность программирования внешней QSP flash, назначив нестандартные ноги, то есть задействовав ремаппинг? 2. Что делать дальше, как-то редактировать алгоритм или как?
  17. Мда..... ковыряние с платой выявило, что простое втыкание шлейфа сенсорного экрана в разъем приводит к появлению на общей для ряда микросхем в плате линии RESET логического нуля. Причем на STM32 линией управляет отдельный пин и он включен на выход и возведен в единицу. То есть контроллер сенсора имеет какую-то патологию на своем RST. В даташите про RST вроде ничего необычного...
  18. Нашел в примере кода этот адрес. Он идентичен с первым контроллером. Вообще, что-то мне подсказывает, что если я выясню, почему не инициализируется i2c, то все остальное заработает сразу - чипы ведь практически идентичны в плане интерфейса с контроллером. На дискавери у меня заработал сразу. Тем паче вызывает удивление, что на моей плате, в проекте, сгенерированном в том же калокубе, i2c не завелся, ладно я вчера думал, что проблема в разных тачскринах... впрочем, не такая сложная эта проблема. Хотя... в моей исключительно любительской практике мне 3 раза приходилось рулить чем-то через i2c - всегда какие-то танцы с бубном были - что на atmega, что на stm32f4...
  19. 1. В первую очередь, у меня какая-то проблема с инициализацией i2c как такового. То есть устройство не "не найдено", как сообщает функция, а оно и не ищется. Так то перебором адресов пока не получилось увидеть тачскрин. Буду разбираться. 2. Все же почитав последний из предложенных документов, так и не нашел там адреса микросхемы. Хотя он неоднократно упоминается. На странице 9 документа есть строка: "The access addres to read and write is just logical address which is not enforced by hardware or firmware". Вроде слова понятные, а в суть я не въехал... есть адрес устройства, а сеть адреса кучи регистров, в которых что-то записано. Далее целая таблица, в которой самого адреса устройства нет. А перед таблицей этот вышеприведенный странный текст... Как это понимать?
  20. Спасибо, почитаю. Ну а еще один вопрос, тот что выше по тексту был? Про нехватку памяти для картинок...
  21. мда.... там еще и регистр, из которого читать, надо знать. В коде для другого контроллера он есть. А в даташите нет.... Может я не так даташит читаю....
  22. Да я думал, но там таймаут несколько секунд... ну ничего подожду, 128 адресов - не так уж много.
  23. И еще проблема с touch контроллером. В пакете от ST есть библиотеки под FT5336 http://www.newhavendisplay.com/appnotes/datasheets/touchpanel/FT5336.pdf У меня же контроллер FT5316 https://www.newhavendisplay.com/app_notes/FT5x16.pdf Я существенной разницы не нашел. Единственное, что должно отличаться - это адреса. Ни в одном ни в другом даташите я адресов не нашел. А вот ST на свой контроллер (FT5336) адрес откуда-то знает - 0x70. К моему контроллеру адрес не подходит. ft5336_ts_drv.Init(TS_I2C_ADDRESS); if(ft5336_ts_drv.ReadID(TS_I2C_ADDRESS) == FT5336_ID_VALUE) { /* Initialize the TS driver structure */ tsDriver = &ft5336_ts_drv; I2cAddress = TS_I2C_ADDRESS; tsOrientation = TS_SWAP_XY; /* Initialize the TS driver */ tsDriver->Start(I2cAddress); } else { status = TS_DEVICE_NOT_FOUND; } Вышеприведенный код вываливается с ошибкой TS_DEVICE_NOT_FOUND Есть ли какая-нибудь возможность узнать адрес контроллера?
  24. Все отлично, все работает. Запустил FreeRTOS,запустил TouchGFX. Вот беда - если слишком большая картинка (я загрузил фон 1024х600), то линковщик выдает следующее RUTFT\RUTFT.axf: Error: L6406E: No space in execution regions with .ANY selector matching wall.o(ExtFlashSection). RUTFT\RUTFT.axf: Error: L6406E: No space in execution regions with .ANY selector matching blue_clocks_backgrounds_clock_classic_background.o(ExtFlashSection). RUTFT\RUTFT.axf: Error: L6406E: No space in execution regions with .ANY selector matching blue_progressindicators_bg_medium_circle_indicator_bg_full.o(ExtFlashSection). Видимо TOucgGFX Designer не умеет, перенастраивая проект, адаптировать его под объем необходимой памяти. А самой памяти у меня предостаточно - 2 QSPI Flash. 128 мбит Во внешней флеш картинки и хранятся: LOCATION_PRAGMA("ExtFlashSection") KEEP extern const unsigned char _wall[] LOCATION_ATTRIBUTE("ExtFlashSection") = // 1024x600 RGB888 pixels. { 0x67, 0x35, 0x23, 0x69, 0x37, 0x25, 0x69, 0x37, 0x25, Друзья, где и как нужно изменить настройки проекта в Keil 5, чтобы линковщик это проглотил?
  25. Разберусь потом. НА худой конец поставлю дисплей 800х480. Я тут пытаюсь с DMA2D поработать, он у меня куда-то не туда прямоугольник копирует, не в начало экрана, как хочу, а в середину. Причем непоместившаяся часть выводится с противоположной стороны экрана. Примерно как здесь.
×
×
  • Создать...