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

hd44780

Свой
  • Постов

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

  • Посещение

Сообщения, опубликованные hd44780


  1. Вобщем вроде понял происходящее.

    На обоих выходах ЦАПА буферы выключены

    	// MCR.MODE1 = 010 - DAC channel1 is connected to external pin with Buffer disabled
    	DAC -> MCR = DAC_MCR_MODE1_1;
    
    	// OUT2 - connect to internal logic and to pin PA5, buffer is OFF
    	// MCR.MODE2 = 001 - DAC channel1 is connected to pin PA5 and internal logic with Buffer disabled
    	DAC -> MCR &= ~DAC_MCR_MODE2;
    	DAC -> MCR |= DAC_MCR_MODE2_0;

    Буферы выключены сознательно, т.к. при этом на выходах почти чистый 0 (где-то 2-3 мВ). Если буферы включить - там порядка 0.4-0.5 в - мне это мешает. Видимо какой-то операционник подключается, который не ахтец. 

    В качестве лирического отступления - год-полтора назад пробовал вместо ЦАПА цифровой потенциометр (условия схемы это позволяют, высокая ёмкость выхода и прочее - не проблема) - тот вообще на выходе идеальный 0 даёт. Перешёл на ЦАПы только ради разрешения - потенциометр 8 бит, ЦАП (любой) - 12.

    Питание схемы полностью импульсное - первичный БП 24в, потом импульсный преобразователь до 5в, на его выходе я добавил LowESR электролит 500 мкФ. Платa Nucleo с процом питается от этих 5в. На плате стоит штатный AMS1117-3.3 с какими-то мелкими конденсаторами типа 0.1 мкф. Схемы плат дельцы из ST уже давно не предоставляют.

    На выходах цапа наблюдаются пачки импульсных помех до 0.5 в (если верить моему осциллу UT-81B).

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

    На выходе компаратора честный прямоугольник, но с многократными беспорядочными импульсами 0-1-0. При росте напряжения IN+ их кол-во и частота сильно растут, это и приводит к свечению светодиода.

    Так что название темы оказалось некорректным, надо было раньше осциллом потыкать, потом уже писать 😀

     

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

  2. Был 00, задал 11 - разницы не заметил.

    Попробовал ради прикола включить инверсию выхода

        COMP1 -> CSR = COMP_CSR_HYST | COMP_CSR_INMSEL_2 | COMP_CSR_INMSEL_0 | COMP_CSR_POLARITY;
     

    оно работает - теперь диодик не плавно разгорается, а плавно затухает 😀

    У них там и инверторы аналоговые стоят явно 😂

     

    ШИМ - не знаю, как-то не догнал до такого, завтра ткну осциллом туда, отпишусь.

  3. Привет всем.

    Решил использовать COMP1 на процессоре STM32G0B1RET6. Для тестирования (типа пощупать) подключил так:

    COMP1 IN+ - DAC OUT1  -- проверяемый сигнал, управляется кнопками (увеличить - уменьшить)

    COMP1 IN- - DAC OUT2  -- порог срабатывания. Пока неуправляемый

    COMP1 OUT - PA0 (или PA11) -- внешний выход компаратора

     

    К внешнему выходу компаратора подключен простой светодиодик. Просто чтоб видно было.  Также выход компаратора опрашивается кодом (он есть в регистрах) и выводится на дисплей.

    Результат сего действа - битик в регистре ведёт себя довольно адекватно, а на пине я наблюдаю не цифровой уровень (как должно быть), а буквально аналоговый сигнал 0 - 3.3в (я туда кроме светодиода ещё и вольтметр подключил).

    Когда напряжение DAC OUT1 приближается к DAC OUT2 выход компаратора в регистре сброшен (т.е. IN+ < IN-), а светодиодик на выходе уже начинает светиться.

    При дальнейшем увеличении DAC OUT1 (IN+) компаратор срабатывает, яркость светодиода растёт.

     

    Вопрос - что это за дичь и как получить нормальный цифровой выход? Или я где-то ошибся?

    Я планировал подключить туда что-то типа К155ТМ2, чтобы аппаратно отключать реле. Я, конечно, понимаю, что в конечном итоге всё будет зависеть от порога срабатывания конкретной микросхемы, подключенной к выходу, но ведь у компаратора по определению должен быть цифровой выход.

    Пробовал использовать PA11 вместо PA0 - то же самое.

     

    Проц вроде настоящий, не пиленый. Это плата NUCLEO-G0B1RE, купленная на Украине в 2019 году, т.е. до всей этой политическо-санкционной хрени.

    Прилагаю мои исходники либы DAC+COMP

    dac_comp_lib.c

  4. Вот эта штука https://github.com/Postlast/USB-Blaster_STM32f1 у меня в вин 10 (не виртуалка) нормально взлетела.

    Quartus 22.1 SE программатор увидел без проблем, Altera MaX2 EPM570 программируется и работает.

     

    Там и исходники для кейла есть, можно улучшать 😀

  5. Привет, народ. Имею схожую проблему. В моём случае квартус просто зависает при запуске окна программатора при подключенном программаторе и отвисает обратно при его отключении.

    Вскрыл свой бластер - пика там нет, там STM32F103C8T6 + буфер-повторитель 74HC244D. Судя по всему тоже ничего не сделать кроме замены программатора?

     

    Виртуалка с вин7 ведёт себя также.

    Пробовал программатор без плисины - квартус тоже повис.

     

    PS.

    Пару-тройку лет назад, когда на компе была вин7 этот же комплект нормально работал, я вообще обо всём вышеописанном и не думал.

    Тогда же сделал на 100 пиновой EPM570 какую-то мигалку светодиодом, так она до сих пор им исправно мигает 😀

    Заметил ещё, что бластер выдает из себя питание 2.6в вместо 3.3, хотя в нём стоит AMS1117-3.3. Дал плисине внешнее питание 3.3в - ничего не изменилось. Правда я не проверил вариант с внешним питанием на win7 виртуалке.

    Какое было питание 2-3 года назад, я не помню, но работал тогда с питанием от этого бластера.

  6. Про кэши я в курсе, даже не включал их. Попробовал выключить принудительно - получил HardFault.

     

    ST-шники в своих примерах делают 

    	#if (ENABLE_SD_DMA_CACHE_MAINTENANCE == 1)
    	            /*
    	               the SCB_InvalidateDCache_by_Addr() requires a 32-Byte aligned address,
    	               adjust the address and the D-Cache size to invalidate accordingly.
    	             */
    	            alignedAddr = (uint32_t)buff & ~0x1F;
    	            SCB_InvalidateDCache_by_Addr((uint32_t*)alignedAddr, count*BLOCKSIZE + ((uint32_t)buff - alignedAddr));
    	#endif

    Это оно по-моему и есть, у меня макроса нет и код этот игнорится

  7. 1 hour ago, Jury093 said:

    может есть смысл поменять msb<>lsb?

    "Последние два байта MBR должны содержать число 0xAA55"

    ну в смысле число 0xAA55, а байты 0x55 и 0xAA - здесь всё нормально, сравнивал даже с секторным дампом этой же карты на компе

  8. Привет всем

    Пытаюсь запустить SD карту на проце STM32F723.

    За основу взял кубовые примеры (мутный он, этот SDIO :D). Там ещё есть SDRAM, SSD1963, QSPI, USB HS - всё пашет без хала. Т.е. на хале сейчас только SDIO.

    Инит карты проходит с полпинка без проблем - тип карты, размер сектора, кол-во секторов, всё проходит идеально с полпинка.

    Пытаюсь читать сектор, ошибок не даёт, но читается какой-то мусор (всегда вроде одинаковый), fatFS естественно падает на взлёте (чего тут ещё ожидать-то). Если надо, могу выложить содержимое  0 сектора настоящего (с компа) и то, что сие SDIO прочитало.

    Но сигнатура 0x55AAв конце нормальная. Такое ощущение, что оно как-то не так или не туда читает.

    Читаю через DMA. Пытался читать polling-функциями - столкнулся с ошибками каких-то переполнений, то там, то сям. На ST-шных форумах нашёл, что, мол, поллинг часто не успевает, используйте DMA. Конкретно у меня Transcend 10 класса, 32 гига.

    Ещё советовали понижать частоту SD карты. Поставил 6 MHz, как там сказали - какие-то сектора начали читаться, но какие-то дают мусор.

    Кто-то подобрал к нему ключик?

     

    Спасибо.

    STM32F723-SDIO.zip

  9. Прикольный баг. Я такого не замечал, но виндозным терминалом никогда не пользовался, работал в этом - https://digitalchip.ru/terminal-1-9b-rabotaem-s-com-portom/ и команды всегда вводил ТОЛЬКО большими буквами.

     

    Зато могу поделиться другим багом - у меня 2 модуля, оба работают в режиме FU2. В этом режиме у модуля пониженное энергопотребление с прослушкой эфира. При этом куча ограничений - скорость только 4800 и какие-то задержки при передаче. Плюс ещё и длинные последовательности байт (по моим наблюдениям больше 10) не передаёт. Но мне этого оказалось достаточно.

    Так вот, один из модулей при входе в командный режим (SET:=0) всегда включает скорость уарта 9600, другой то включит 9600, то так и остаётся на 4800. Пришлось сделать в прошивке проца хак - сперва он стучится в модуль по 4800, если тот не ответил - врубает 9600. Только после этого система стабильно заработала.

     

    Процы у меня - один STM32F030, другой - STM32L152.

    И ещё раздражает то, что невозможно переключить радиоканал без запоминания его в EEPROM управляющего STM8. Где-то попадалась статья, чуваки пытались поменять STM8 на какой-то STM32, но там, по-моему, дело ничем внятным не закончилось.

  10. Привет всем.

    Столкнулся с таким моментом - если проц, подключенный к программатору не отвечает (в моём случае был выставлен режим внешнего кварца, которого на плате вообще нет), то не читается даже версия прошивки самого программатора.

    Когда я воктнул его в другую плату, где есть кварц и target отвечает - всё нормально заработало.

    Подскажите - это баг прошивки или супер-мега-фича для вызова у людей холодного пота и мыслей про сдохший программатор? Тыкался в CvAVR.

     

    Спасибо.

  11. Спасибо, гляну.

    Я от SDRAM немного отвлёкся, запустил QSPI память w25n01gv, вроде пашет, но частоту выше 16.5 МГц поднять не могу - обмен виснет на опросе какого-то флага. Вожусь пока.

    Что касается SDRAM, то нашёл, что нога PC2 (сигнал NE0 - nCS) у этого проца двойным дном, по дефолту там сидит АЦП. Добавил в инит пинов SYSCFG->PMCR |= SYSCFG_PMCR_PC2SO;  перед манипуляциями с GPIO регистрами.

    Улучшений пока не заметил.

    MPU пока выключил, на простую запись/чтение не влияет, а обо всём остальном говорить пока рано.

  12. 9 hours ago, __inline__ said:

    SDRAM на фабричной девборде или самодельная? Что там с трассировкой? Сколько слоёв платы?

     

    Очень странно. Запускал SDRAM на C6545 и BF532/533 запускалась с первого раза.  Настройки брал готовые для нужной SDRAM.

    Разводили сами в альтиуме (под Ф439+такой же SDRAM, который с полпинка взлетел тоже также разводили), заказывали в Китае. Дорожки рисовали руками с контролем длины. В принципе могу выложить альтиумные файлы, секретного там ничего нет, по сути макетка для разборок с этим процом.

    Плата 6-слойная (Ф439 - 4 слойная была). Настройки чипа взял из того же 439.

    18 hours ago, sadat said:

    Где-то читал в теме, что кому-то помогло включить "умощнение" внутреннего генератора частоты для работы.
    Но я бы начал с перетягивания кода с рабочего примера, в папке репозитории Куба есть пример для STM32H743I_EVAL.
    Там в main.c еще многое чего включается, что Куб не включил...

    Что такое "умощнение" внутреннего генератора частоты для работы? Приложил схему синхронизации из куба. FMC там виден.

    STM32H743I_EVAL вроде смотрел, пересмотрю ещё раз, может прогавил чего.

    sync.png

  13. Повключал и настроил всё:

    	// Enable I-Cache
    	SCB_EnableICache ( );
    
    	// Enable D-Cache
    	SCB_EnableDCache();
    
        MPU_Region_InitTypeDef MPU_InitStruct;
    	HAL_MPU_Disable();
    
    	/* Configure the MPU attributes as WT for SDRAM */
    //	MPU_Region_InitTypeDef MPU_InitStruct;
    	MPU_InitStruct.Enable = MPU_REGION_ENABLE;
    	MPU_InitStruct.BaseAddress = SDRAM_BASE;
    	MPU_InitStruct.Size = MPU_REGION_SIZE_64MB;
    	MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    	MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
    	MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
    	MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
    	MPU_InitStruct.Number = MPU_REGION_NUMBER1;
    	MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
    	MPU_InitStruct.SubRegionDisable = 0x00;
    	MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;
    
    	HAL_MPU_ConfigRegion ( &MPU_InitStruct );
    
    	// Enable the MPU
    	HAL_MPU_Enable ( MPU_PRIVILEGED_DEFAULT );

    Никакой разницы не заметил. Может я FMC/SDRAM неправильно сконфигурил?

  14. Вот пытаюсь запустить указанную связку (STM32H743 + SDRAM MT48LC32M16A2-75).

    Результат пока хреновый - читается какой-то бред. Не пашет вобщем :(

    Если точнее - весь объём памяти (64 MB) доступен, ни в накие xxxHandler проц не вылетает, но с чтением/записью памяти трудности.

    После заполнения памяти нулями оттуда читаются слова 0x2004. Казалось бы D13 и D2 где-то коротят на Vcc, но не так-то всё просто - простая запись байтов по адресу 0xC0000000 (у меня банк 0) показывает, что 2-й бит всё же сбрасывается. При этом в MemoryBrowser атоллика видно, что при этом меняются какие-то другие байты по другим адресам - хз почему. Ну и подобные баги.

    Все кэши проца выключены, На FMC подаётся 180 МГц, на память - 90. Инициализация FMC+чип:

    Spoiler
    
    /**
      * @brief  FMC SDRAM Mode definition register defines
      */
    #define SDRAM_MODEREG_BURST_LENGTH_1             ((uint16_t)0x0000)
    #define SDRAM_MODEREG_BURST_LENGTH_2             ((uint16_t)0x0001)
    #define SDRAM_MODEREG_BURST_LENGTH_4             ((uint16_t)0x0002)
    #define SDRAM_MODEREG_BURST_LENGTH_8             ((uint16_t)0x0004)
    #define SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL      ((uint16_t)0x0000)
    #define SDRAM_MODEREG_BURST_TYPE_INTERLEAVED     ((uint16_t)0x0008)
    #define SDRAM_MODEREG_CAS_LATENCY_2              ((uint16_t)0x0020)
    #define SDRAM_MODEREG_CAS_LATENCY_3              ((uint16_t)0x0030)
    #define SDRAM_MODEREG_OPERATING_MODE_STANDARD    ((uint16_t)0x0000)
    #define SDRAM_MODEREG_WRITEBURST_MODE_PROGRAMMED ((uint16_t)0x0000)
    #define SDRAM_MODEREG_WRITEBURST_MODE_SINGLE     ((uint16_t)0x0200)
    
    /**
      * @brief  Programs the SDRAM device.
      * @retval None
      */
    static void BSP_SDRAM_Initialization_sequence( void )
    {
      FMC_SDRAM_CommandTypeDef Command;
    
      Command.CommandTarget          = FMC_SDRAM_CMD_TARGET_BANK1;
      Command.AutoRefreshNumber      = 0;
      Command.ModeRegisterDefinition = 0;
    
      // Запись в регистр FMC_SDCMR
    
      /* Step 1: Configure a clock configuration enable command */
      Command.CommandMode            = FMC_SDRAM_CMD_CLK_ENABLE;			// 1
    //  HAL_SDRAM_SendCommand ( &hsdram1, &Command, SDRAM_TIMEOUT );
      // Send SDRAM command (timeout unused)
      FMC_SDRAM_SendCommand ( FMC_SDRAM_DEVICE, &Command, 0 );
      // Inserted delay is equal to 1 ms due to systick time base unit (ms)
      HAL_Delay(1);
    
      /* Step 2: Configure a PALL (precharge all) command */
      Command.CommandMode            = FMC_SDRAM_CMD_PALL;					// 2
    //  HAL_SDRAM_SendCommand ( &hsdram1, &Command, SDRAM_TIMEOUT );
      // Send SDRAM command (timeout unused)
      FMC_SDRAM_SendCommand ( FMC_SDRAM_DEVICE, &Command, 0 );
      // Inserted delay is equal to 1 ms due to systick time base unit (ms)
      HAL_Delay(1);
    
      /* Step 3: Configure an Auto Refresh command */
      Command.CommandMode            = FMC_SDRAM_CMD_AUTOREFRESH_MODE;		// 3
    //  HAL_SDRAM_SendCommand ( &hsdram1, &Command, SDRAM_TIMEOUT );
    // Send SDRAM command (timeout unused)
      FMC_SDRAM_SendCommand ( FMC_SDRAM_DEVICE, &Command, 0 );
      // Inserted delay is equal to 1 ms due to systick time base unit (ms)
      HAL_Delay(1);
    
      /* Step 4: Program the external memory mode register */
      // // 0x04 - LOAD_MODE --> SDCMR.MRD (bits 22..9)
      Command.CommandMode            = FMC_SDRAM_CMD_LOAD_MODE;				// 4
    //  Command.ModeRegisterDefinition = 0x0230;		// From F439
      // 0x0200 | 0x0030
      Command.ModeRegisterDefinition = SDRAM_MODEREG_WRITEBURST_MODE_SINGLE | SDRAM_MODEREG_CAS_LATENCY_3;
    //  HAL_SDRAM_SendCommand ( &hsdram1, &Command, SDRAM_TIMEOUT );
      // Send SDRAM command (timeout unused)
      FMC_SDRAM_SendCommand ( FMC_SDRAM_DEVICE, &Command, 0 );
      // Inserted delay is equal to 1 ms due to systick time base unit (ms)
      HAL_Delay(1);
    
      // Step 5: Set the refresh rate counter
    /*
       * Refresh rate = (COUNT+1) * SDRAM clock frequency
       * COUNT = (SDRAM refresh period / Number of rows ) * SDCLK -20  --> FMC_RTR
       * SDRAM refresh period = 64 mc (from SDRAM chip period)
       *  Rows = 8192
       *  COUNT = (64 ms / 8192) - 20 = 0,0078125 ms - 20 = 7.8125mks * 90E6 - 20 = 703,125 - 20 = 683
     */
    //  HAL_SDRAM_ProgramRefreshRate ( &hsdram1, 683 );
      FMC_SDRAM_ProgramRefreshRate ( FMC_SDRAM_DEVICE, 683 );  // -> SDRTR = 683 = 0x2AB << 1 = 0x0556
    
      // Inserted delay is equal to 1 ms due to systick time base unit (ms)
      HAL_Delay(1);
    } // BSP_SDRAM_Initialization_sequence
    
    // FMC initialization function
    static void MX_FMC_Init(void)
    {
      GPIO_InitTypeDef GPIO_InitStruct = {0};
    //  SDRAM_HandleTypeDef hsdram1;
    //  FMC_SDRAM_TimingTypeDef SdramTiming = {0};
    
      // init FMC pins
      /** FMC GPIO Configuration
      PC2_C  ------> FMC_SDNE0  +
      PD0    ------> FMC_D2     +
      PD1    ------> FMC_D3     +
      PD8    ------> FMC_D13    +
      PD9    ------> FMC_D14    +
      PD10   ------> FMC_D15    +
      PD14   ------> FMC_D0     +
      PD15   ------> FMC_D1     +
    
      PE0    ------> FMC_NBL0   +
      PE1    ------> FMC_NBL1   +
      PE7    ------> FMC_D4     +
      PE8    ------> FMC_D5     +
      PE9    ------> FMC_D6     +
      PE10   ------> FMC_D7     +
      PE11   ------> FMC_D8     +
      PE12   ------> FMC_D9     +
      PE13   ------> FMC_D10    +
      PE14   ------> FMC_D11    +
      PE15   ------> FMC_D12    +
    
      PF0    ------> FMC_A0     +
      PF1    ------> FMC_A1     +
      PF2    ------> FMC_A2     +
      PF3    ------> FMC_A3     +
      PF4    ------> FMC_A4     +
      PF5    ------> FMC_A5     +
      PF11   ------> FMC_SDNRAS +
      PF12   ------> FMC_A6     +
      PF13   ------> FMC_A7     +
      PF14   ------> FMC_A8     +
      PF15   ------> FMC_A9     +
    
      PG0    ------> FMC_A10    +
      PG1    ------> FMC_A11    +
      PG2    ------> FMC_A12    +
      PG4    ------> FMC_BA0    +
      PG5    ------> FMC_BA1    +
      PG8    ------> FMC_SDCLK  +
      PG15   ------> FMC_SDNCAS +
    
      PH2    ------> FMC_SDCKE0 +
      PH5    ------> FMC_SDNWE  +
      */
    
      // PC2
      GPIO_InitStruct.Pin = GPIO_PIN_2;
      GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
      GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
      HAL_GPIO_Init ( GPIOC, &GPIO_InitStruct );
    
      // PD0, PD1, PD8..PD10, PD14, PD15
      GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_14 | GPIO_PIN_15;
      GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
      GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
      HAL_GPIO_Init ( GPIOD, &GPIO_InitStruct );
    
      // PE0, PE1, PE7..PE15
      GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 |
    		  GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
      GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
      GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
      HAL_GPIO_Init ( GPIOE, &GPIO_InitStruct );
    
      // PF0..PF5, PF11..PF15
      GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_11 | GPIO_PIN_12 |
    		  GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
      GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
      GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
      HAL_GPIO_Init ( GPIOF, &GPIO_InitStruct );
    
      // PG0..5, PG8, PG15
      GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_8 | GPIO_PIN_15;
      GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
      GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
      HAL_GPIO_Init ( GPIOG, &GPIO_InitStruct );
    
      // PH2, PH5
      GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_5;
      GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
      GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
      HAL_GPIO_Init ( GPIOH, &GPIO_InitStruct );
    
      // Enable the FMC/FSMC interface clock
      RCC->AHB3ENR |= RCC_AHB3ENR_FMCEN;
    
    /*
                         15  12 11  8 7  4 3  0
    FMC_SDCR1 = 0x29DA = 0010   1001 1101 1010:
    RPIPE  - bits 14..13 = 01 - 1 cycle delay (+)
    RBURST - bit  12     = 0  - disable (+)
    SDCLK  - bits 11..10 = 10 - 2xCLK (+)
    WP     - bit  9      = 0  - write allowed (+)
    CAS    - bits 8..7   = 11 - 3 cycles (+)
    NB     - bit  6      = 1  - 4 banks (+)
    MWID   - bits 5..4   = 01 - Memory data width (+)
    NR     - bits 3..2   = 10 - Row address 13 bits (+)
    NC     - bits 1..0   = 10 - Column address 10 bits (+)
     */
      FMC_SDRAM_DEVICE -> SDCR[FMC_SDRAM_BANK1] = 0x29DA;
    
      // SDRAM timing
    /*
                                   TRCD  TRP  TWR  TRC TRAS TXSR TMRD
    FMC_SDTR1 = 0x02246472 =  0000 0010 0010 0100 0110 0100 0111 0010
    
    TRCD = 2
    TRP  = 2
    TWR  = 4
    TRC  = 6
    TRAS = 4
    TXSR = 7
    TMRD = 2
    */
      FMC_SDRAM_DEVICE -> SDTR[FMC_SDRAM_BANK1] = 0x02246472;
    
      // Enable FMC Peripheral
      __FMC_ENABLE ( );			// FMC_Bank1_R->BTCR[0] |= FMC_BCR1_FMCEN;
    
      // init SDRAM chip
      BSP_SDRAM_Initialization_sequence ( );
    
      // Очищаем SDRAM
      uint32_t tmp;
      uint32_t size_div4 = SDRAM_SIZE / 4;
      for ( tmp = SDRAM_BASE; tmp < (SDRAM_BASE + size_div4); tmp += 4 )
        *((uint32_t *)tmp) = 0x00000000;
    } // MX_FMC_Init

     

     

    Тактирование (тут чистый кубовый хал):

      // PLL2R - FMC (180 MHz)
      PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC | RCC_PERIPHCLK_USB | RCC_PERIPHCLK_QSPI | RCC_PERIPHCLK_FMC;
      PeriphClkInitStruct.PLL2.PLL2M = 8;
      PeriphClkInitStruct.PLL2.PLL2N = 180;
      PeriphClkInitStruct.PLL2.PLL2P = 2;
      PeriphClkInitStruct.PLL2.PLL2Q = 1;
      PeriphClkInitStruct.PLL2.PLL2R = 1;
      PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_0;
      PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOMEDIUM;
      PeriphClkInitStruct.PLL2.PLL2FRACN = 0;
      // PLL3Q - LTDC (50 MHz)
      PeriphClkInitStruct.PLL3.PLL3M = 8;
      PeriphClkInitStruct.PLL3.PLL3N = 50;
      PeriphClkInitStruct.PLL3.PLL3P = 2;
      PeriphClkInitStruct.PLL3.PLL3Q = 4;
      PeriphClkInitStruct.PLL3.PLL3R = 1;
      PeriphClkInitStruct.PLL3.PLL3RGE = RCC_PLL3VCIRANGE_0;
      PeriphClkInitStruct.PLL3.PLL3VCOSEL = RCC_PLL3VCOWIDE;
      PeriphClkInitStruct.PLL3.PLL3FRACN = 0;
      PeriphClkInitStruct.FmcClockSelection = RCC_FMCCLKSOURCE_PLL2;	// PLL2R
      PeriphClkInitStruct.QspiClockSelection = RCC_QSPICLKSOURCE_PLL;
      PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_PLL;
      if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
      {
        Error_Handler();
      }
    

    Кварц 8МГц. (8/8)*180/1=180MHz.

    LTDC нету, просто сконфигурено тактирование. Думать о нём без памяти бессмысленно.

    Такой же чип памяти прекрасно работает на Ф439. Здесь нашёл тему

    , но ТС так и не отписался, заработало у него что-то или нет, а сама тема укатилась хз куда...

     

    Может я чего не понял, как конфигурить это FMC. От Ф4 оно кое-где отличается.

    Спасибо.

  15. 9 hours ago, Donker said:

    То есть ситуация что в alternate functions могут встречаться более одного варианта разводки периферии по ногам микросхемы - нормальна?

     

    Конечно. Такая фича облегчает разводку платы в частности. Когда один и тот же уарт Вы можете взять с двух разных сторон чипа и не тянуть дорожки за три-девять земель в обход кучи компонентов на плате ...

    Или если вам надо включить уарт и ещё что-то, висящее на тех же ногах, например, таймер какой-то. Получается конфликт. Переключением уарта на другие ноги этот конфликт легко устраняется. Ну и тд.

    Для этого оно и придумано наверное.

    А если соединять проводками, то пофиг.

  16. On ‎1‎/‎6‎/‎2019 at 9:01 AM, nanorobot said:

    Не пробовали по FMC подключать LCD с контроллером SSD1963? Интересует как оно будет по сравнению с LTDC.  SDRAM не ставить, корпус процессора в два раза меньше. Заманчиво.  Уже бы сам начал пробовать, ПромЭлектроника до 09.01.19 пьянствует.

     

    PS индикатор: https://www.ecom.cz/open_sheet/sheet_name=D59283

     

    Нет, не делал пока :( . Подключал только SPI-малявку ILI9163 128x128. Работает.

    Да и то SPI этого проца недели 2 раскуривал с помощью коллег с этого форума :biggrin:

  17. Harbinger , повезло вам. Я крышку содрал, припоя там не было вообще, чистая латунь или из чего там они её сделали. Припаял также аккумулятор на 3в.

    Модуль молчит, как и молчал. Греется сам чип, который там стоит. Явно сам этот NEO-6M бракованный.

    Уже 3-й раз нарываюсь на брак. В первый раз модуль с ENC28J60 оказался полным трупом, второй - VS1053 на платке проигрывал половину из того, что должен.

    Ну и хрен с ним.

  18. Заранее извиняюсь, если написал не в тот раздел. Не нашёл более подходящего..

    По сути. Попал в руки GPS модуль GY-NEO6MV2 - https://ru.aliexpress.com/item/GY-NEO6MV2-NEO-6M-GPS-Module-NEO6MV2-With-Flight-Control-EEPROM-MWC-APM2-APM2-5-Large/32785629516.html?spm=a2g0s.9042311.0.0.274233edJaKoCc

    Пытаюсь подключить пока к компу через USB-UART переходник без каких-либо контроллеров и прочего.

    Включил - и ничего. В терминале пусто, ни одного байта, ничего. Запускал под монитором ком-порта - там тоже ничего. Даже светодиод молчит, хотя должен то ли светиться, то ли мигать, неважно. Пробовал частоты 9600 и 38400. Ждал долго (около часа).

    Вычитал, что можно включать и от 3.3в и от 5в, типа там есть стабилизатор. Тоже глухо как в танке.

    Единственное, что он делает - греет атмосферу - на ощупь довольно горячий. На 3.3в чуть менее горячий, на 5в чуть более горячий. На сайтах типа алиэкспресса вычитал в отзывах, что это для них нормально. 

    Ещё сия хреновина любит жрать электроэнергию - мультиметр показал ток типа 195 мА, хотя всякие там ДШ обещают 65-70 мА.

    Обнаружил, что на модуле сдохшая батарейка - вместо 3в там около 40 мВ. Выдрал её оттуда вообще. Без батарейки тоже просто греет атмосферу и жрёт миллиамперы.

     

    Вопрос - ставить ему другую батарейку (типа CR2032) и париться дальше или ему хана, выкинуть его в помойку и идти купить новый? Или что?

     

    Спасибо.

  19. Долго молчал, тестировал.

    Ещё недели полторы назад вынес радиомодуль на отдельную платку проводами (Vcc, GND, Rx, TX, SET) см по 10, на этой платке на питание поставил керамику 10nF, 100nF, 1uF + электролит 100 uF.

    Сигнальные провода идут как есть, без кондёров. На SET можно было тоже 10 нан поставить, а на UART боязно как-то - завалит фронты, хз. Платку с процом не экранировал ничем.

    Второй модуль (который подключен к компу) отнёс подальше от первого - вычитал в статьях про ардуину+HC-12, что модули надо разносить минимум на метр. Про электролит тоже там вычитал (советуют 22uF-1000uF).

    В этих условиях сбоев пока не видел. Прикрутил к процу и датчику спячку - ногу Tx модуля завёл на RX+PA0 будится импульсами уарта модуля. Один байт, конечно, теряет, ну то ладно, так и задумывалось в общем.

    С ногой SET ничего не делал, но она заработала, ответы на AT-команды ловлю исправно.

    Пустое ненужное прерывание собаки выкинул.

    Больше пока ничего не делал, проверяю.

×
×
  • Создать...