Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Re: Таймер не работает

Чт дек 12, 2019 16:23:43

Поместить адрес статичного метода в флешку тоже никаких проблем не вызовет. Память SRAM сама по себе не портится, а если случилось страшное и она поломалась - не важно, что там было вектора прерываний или просто ваши переменные - в подавляющем большинстве случаев дорога в hard_fault.
В какой hard_fault??? У вас таблица прерываний порушилась, где прописаны все вектора в том числе и вектор hard_fault-а. А значит дорога лежит не в обработчик HF, а в зависон. Причём глухой зависон - без признаков жизни и причины ошибки.

Так что никакой безопасности код во флеше не несет.
Т.е. - как? А ничего что попытка записи в вектор во флешь просто физически не может его испортить?

Невозможность диагностирования - тоже дудки, стек все равно останется на месте.
И какой толк от этого стека если при разрушенной таблице прерываний там будет 100500 входов в обработчик HF и переполнение этого самого стека из-за этих входов?

Можно спросить более развернуто: зачем вообще нужно программировать на плюсах?
А я разве что-то говорил против плюсов??? :shock: Сам уже последние 20 лет тока на них и программирую....

Re: Таймер не работает

Пт дек 13, 2019 01:09:40

Чтобы похерить таблицу векторов во флеше достаточно 4 строк кода. Если у вас есть бутлодер, эмуляция eeprom или любая другая работа с флешкой - достаточно ошибиться в одной переменной. Так что нет, не несет.

Если у вас код свободно пишет туда, куда писать не должен - пора осваивать memory protection unit. Это будет надежнее.
Вы так говорите, будто у вас в контроллере живут демоны, которые только и ждут, чтобы вам программу искалечить.
Нет такого, каждая инструкция попадает по вашей воле и с вашего разрешения. Если стреляют в ногу - то это вы стреляете, а не кто-то другой. Если вы не контролируете стрельбу себе в ногу и поэтому боитесь играть с памятью - вы прикладной программист, что вы делаете в baremetal?

Re: Таймер не работает

Пт дек 13, 2019 10:48:36

Чтобы похерить таблицу векторов во флеше достаточно 4 строк кода. Если у вас есть бутлодер, эмуляция eeprom или любая другая работа с флешкой - достаточно ошибиться в одной переменной. Так что нет, не несет.
Ну да - рассказывать сказки Вы - мастер. Как будто тут никто никогда не отлаживал код в микроконтроллере. 8)
А теперь напрягаем память и вспоминаем: сколько раз за свою практику встречали такие ошибки, которые разрушали содержимое ОЗУ? А сколько раз встречали ошибки, разрушающие флешь МК? :shock:
И перестаём высасывать из пальца небылицы лишь бы только поспорить....

Если у вас код свободно пишет туда, куда писать не должен - пора осваивать memory protection unit. Это будет надежнее.
Поднимите глаза хоть на пару постов выше в этой теме чтобы понять о чём шла речь и о чём я писал. Прежде чем нести вздор....

Re: Таймер не работает

Пт дек 13, 2019 10:49:59

Очень много новых умных слов узнал из вашего спора)
Вот какая у меня непонятка с этим рабочим кодом примера.

Код:
 hsram.Instance  = FSMC_NORSRAM_DEVICE;//((0xA0000000U + 0x0000U
hsram.Extended  = FSMC_NORSRAM_EXTENDED_DEVICE;

Волшебные строчки которые по идее должны забивать регистры FSMC/

А вот тут забиваются BWTR & BCTR
Код:
 /* Timing for READING  BWTR*/
  sram_timing.AddressSetupTime      = 15;
  sram_timing.AddressHoldTime       = 0x00;
  sram_timing.DataSetupTime         = 20;
  sram_timing.BusTurnAroundDuration = 0x00;
  sram_timing.CLKDivision           = 0x00;
  sram_timing.DataLatency           = 0x00;
  sram_timing.AccessMode            = FSMC_ACCESS_MODE_A;
 
  /* Timing for WRITTING*/
  sram_timing_write.AddressSetupTime      = 8;
  sram_timing_write.AddressHoldTime       = 0;
  sram_timing_write.DataSetupTime         = 9;
  sram_timing_write.BusTurnAroundDuration = 0;
  sram_timing_write.CLKDivision           = 0;
  sram_timing_write.DataLatency           = 0;
  sram_timing_write.AccessMode            = FSMC_ACCESS_MODE_A;
 
  hsram.Init.NSBank             = FSMC_NORSRAM_BANK1;//BCTR
  hsram.Init.DataAddressMux     = FSMC_DATA_ADDRESS_MUX_DISABLE;
  hsram.Init.MemoryType         = FSMC_MEMORY_TYPE_SRAM;
  hsram.Init.MemoryDataWidth    = FSMC_NORSRAM_MEM_BUS_WIDTH_16;
  hsram.Init.BurstAccessMode    = FSMC_BURST_ACCESS_MODE_DISABLE;
  hsram.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW;
  hsram.Init.WrapMode           = FSMC_WRAP_MODE_DISABLE;
  hsram.Init.WaitSignalActive   = FSMC_WAIT_TIMING_BEFORE_WS;
  hsram.Init.WriteOperation     = FSMC_WRITE_OPERATION_ENABLE;
  hsram.Init.WaitSignal         = FSMC_WAIT_SIGNAL_DISABLE;
  hsram.Init.ExtendedMode       = FSMC_EXTENDED_MODE_ENABLE;
  hsram.Init.AsynchronousWait   = FSMC_ASYNCHRONOUS_WAIT_DISABLE;
  hsram.Init.WriteBurst         = FSMC_WRITE_BURST_DISABLE;
  hsram.Init.WriteFifo          = FSMC_WRITE_FIFO_DISABLE;
  hsram.Init.PageSize           = FSMC_PAGE_SIZE_NONE;
  hsram.Init.ContinuousClock    = FSMC_CONTINUOUS_CLOCK_SYNC_ONLY;


Я к чему это, половина получается регистров забивается по волшебному а половина в лоб?

Re: Таймер не работает

Пт дек 13, 2019 10:54:58

Я к чему это, половина получается регистров забивается по волшебному а половина в лоб?

Почему "по волшебному"? Должно забиваться в соответствии с характеристиками памяти. Я FSMC правда вроде не программировал, но FMC - пользовал. Если разобраться - там всё понятно. Правда пользовал по мануалу, без всяких кубов.

Re: Таймер не работает

Пт дек 13, 2019 11:52:16

Вот и я пытаюсь без библиотек реализовать в этом и запара.
Изображение
Что то странно не?

Добавлено after 1 minute 46 seconds:
По волшебному. потому что эти две строки летают по дефайнам в кругаля библиотек HAL, кажутся абсолютно пустыми но без них не работает ни чего.

Добавлено after 23 minutes 48 seconds:
MWID равен 0х3 в табличке, но по рефенсу нет у него таких значений

Bits 5:4 MWID[1:0]: Memory data bus width.
Defines the external memory device width, valid for all type of memories.
00: 8 bits
01: 16 bits (default after reset)
10: reserved
11: reserved

Добавлено after 20 minutes 29 seconds:
Я в своем проекте пытаюсь посмотреть регистры, он говорит что таких регистров нет, как так может быть?

Re: Таймер не работает

Пт дек 13, 2019 12:28:18

Я в своем проекте пытаюсь посмотреть регистры, он говорит что таких регистров нет, как так может быть?
Каких конкретно регистров нет? BCRx и BTRx на картинке видно. BWTRx наверняка чуть ниже должны быть.

Добавлено after 4 minutes 29 seconds:
Раз у тебя через HAL заработала шина, то запусти программу, дай ей поработать и останови. Сними показания трёх регистров: BCR, BTR и BWTR для своего банка. Расшифруй их значения и осмысли что же там наконфигурировано.

Re: Таймер не работает

Пт дек 13, 2019 12:30:04

Тупанул, разобрался
Последний раз редактировалось TEPEM Пт дек 13, 2019 12:33:02, всего редактировалось 1 раз.

Re: Таймер не работает

Пт дек 13, 2019 12:32:53

Про RCC_AHB3ENR_FSMCEN не забываешь?

Добавлено after 1 minute 20 seconds:
Это рабочий пример, мой отдельно проект, ну черт с ним, он вроде почти заработал. Пытаюсь без файла FSMC.h записать это дело, пока он ругается на мою писанину(

FSMC_Bank1->BTCR = 0x0000FFFF;
FSMC_Bank1E->BWTR = 0xFFFFFFFF;
говорит выражение должно быть изменяемым значением

Блин, ну я же уже писать тебе об этом!!! Массив там!!!!

Код:
FSMC_Bank1->BTCR[0] = 0x0000FFFF;

Re: Таймер не работает

Пт дек 13, 2019 12:58:07

Как я понял, так мы полностью забиваем регистры FSMC
FSMC_Bank1->BTCR[1] = 0x0000FFFF;
FSMC_Bank1E->BWTR[1] = 0xFFFFFFFF;
Но походу чего то не хватает

User error: Memory access error: Trying to write outside linked memory at address 0xa0000004 when PC is 0x37e. Check your memory configuration.
Unable to execute: driver error. After the error occurred, the program counter (PC) was 0x37e.

Добавлено after 12 minutes 28 seconds:
Мне удалось его пнуть и он показывает старую картинку, которая была отрисована рабочим примером. Но мое он не выводит. Что характерно, в моем проекте где подключен FSMC.h -
FSMC_Bank1->BTCR[1] = 0x0000FFFF;
FSMC_Bank1E->BWTR[1] = 0xFFFFFFFF;
это работает, и больше ни чего не надо.
Хотя они обращаются в библиотеку stm32f412zx.h
А если использовать без fsmc.h - ошибки эти про память

Re: Таймер не работает

Пт дек 13, 2019 13:11:55

Во-первых, значения "все FF" очень странные. Я в них не верю.
Во-вторых, почему BTCR[1] и BWTR[1]? Посмотри в RM раздел "11.6 FSMC register map" и найди для нужных BCRx и BTRx правильные индексы массивов. Блин, руки бы им поотрывать за такое определение. Может даже проще переписать определения регистров на соответствующие RM.

И ещё раз напоминаю про RCC_AHB3ENR_FSMCEN. Тебе эти буквы о чём-нибудь говорят?

Добавлено after 11 minutes 11 seconds:
Вот так понятней будет?
Код:
typedef struct
{
  __IO uint32_t BCR1;
  __IO uint32_t BTR1;
  __IO uint32_t BCR2;
  __IO uint32_t BTR2;
  __IO uint32_t BCR3;
  __IO uint32_t BTR3;
  __IO uint32_t BCR4;
  __IO uint32_t BTR4; 
} MY_FSMC_Bank1_TypeDef;

#define MY_FSMC_Bank1 ((MY_FSMC_Bank1_TypeDef *) FSMC_Bank1_R_BASE)

MY_FSMC_Bank1->BCR1 = ...;
MY_FSMC_Bank1->BTR1 = ...;


То есть, BCR1 это в их понимании FSMC_Bank1->BTCR[0]. А BTR1 это у них будет FSMC_Bank1->BTCR[1].

Re: Таймер не работает

Пт дек 13, 2019 13:37:37

RCC->AHB3ENR |= RCC_AHB3ENR_FSMCEN; //Тактирование FSMC Вы про это?

Я нашел эту таблицу и регистры все собрал, но они крайне не однозначные

Мы же используем только BTR1 & BCR1 верно я понимаю?
И BWTR1

Добавлено after 3 minutes 27 seconds:
Есть какой то способ гарантировано правильно глянуть что они туда записывают?

Добавлено after 5 minutes 9 seconds:
Да спасибо! Так понял, уже проясняется картинка

Re: Таймер не работает

Пт дек 13, 2019 14:35:19

Есть какой то способ гарантировано правильно глянуть что они туда записывают?
Под отладчиком переходим на окно дизассемблера, открываем регистры процессора и FSMC параллельно, шагаем и смотрим.

Re: Таймер не работает

Пт дек 13, 2019 21:10:41

Есть какой то способ гарантировано правильно глянуть что они туда записывают?
Не знаю как у Вас описываются эти регистры, но у меня они описаны как структура. И я просто вписываю эту структуру в окно "Watch" отладчика и вижу там содержимое регистров.

Re: Таймер не работает

Пт дек 13, 2019 23:26:42

Я туда что не пропишу - ошибка

Re: Таймер не работает

Пт дек 13, 2019 23:56:14

Я туда что не пропишу - ошибка
Куда? В окно "Watch"?

Re: Таймер не работает

Сб дек 14, 2019 09:29:02

Все заработало, с цветами только не понятки и медленно рисует

У меня из цветов только оттенки синего, где я мог налажать?

Изображение


Код:
 while (1){
  /* CASET: Comumn Addrses Set */
    y=0;
    while( y < 240)
    {
        x=0;
        while( x < 240)
        {
          WritePixel(x, y , x+y);

          x++;
        }
        y++;
    }


Код:
void WritePixel(uint16_t Xpos, uint16_t Ypos, uint16_t RGBCode)
{
  /* Set Cursor */
  uint8_t   parameter1[4];
          parameter1[0] = 0x00;     
          parameter1[1] = 0x00 + Xpos;// +X
          parameter1[2] = 0x00;
          parameter1[3] = 0xEF + Xpos;// +x
          WriteReg(0x2A, parameter1, 4);
          /* RASET: Row Addrses Set */ 
          parameter1[0] = 0x00;
          parameter1[1] = 0x00 + Ypos;// +y
          parameter1[2] = 0x00;
          parameter1[3] = 0xEF + Ypos;// +y
          WriteReg(0x2B, parameter1, 4);

          /* Prepare to write to LCD RAM */
          WriteReg(0x2C, (uint8_t*)NULL, 0);   /* RAM write data command */

          /* Write RAM data */
          WriteData(RGBCode);
}


Код:
void WriteReg(uint8_t Command, uint8_t *Parameters, uint8_t NbParameters)
{
  uint8_t   i;

  /* Send command */
   ((LCTDef *) (uint32_t)(0x60000000 | 0x00000000))->REG = Command;//LCD_IO_WriteReg(Command);
  __DSB();
 
  /* Send command's parameters if any */
  for (i=0; i<NbParameters; i++)
  {
    //FMC_BANK1_WriteData(Parameters[i]);
     ((LCTDef *)(uint32_t)(0x60000000 | 0x00000000))->RAM = Parameters[i];//LCD_IO_WriteData(Parameters[i]);
  __DSB();
  }
}

void WriteData(uint8_t Command)
{
   
   ((LCTDef *)(uint32_t)(0x60000000 | 0x00000000))->RAM = Command;//LCD_IO_WriteData(Parameters[i]);
  __DSB();
}


Выручайте братцы почти получилось

Добавлено after 6 minutes 9 seconds:
И отрисовка медленная, весь экранчик 240х240 за пару секунд

Градиентик

WritePixel(x, y , (x+y)/15);


Изображение

Я думал это переменная LCTDef виновата, но с подменой в примере этой переменной на мою ни чего не меняется, там цвета есть(

Добавлено after 18 minutes 20 seconds:
В примере часто мелькают функции чтения я так понимаю из дисплея что то читают, это же не нужно по определению?

Кто то может расшифровать эту строку?
((LCTDef *)(uint32_t)(0x60000000 | 0x00000000))->RAM =

Добавлено after 3 hours 42 minutes 38 seconds:
Сразу оговорюсь 0хFFFFFFFF Дает голубой ну и 0х0 черный

Добавлено after 4 minutes 47 seconds:
Код:
void ST7789H2_WritePixel(uint16_t Xpos, uint16_t Ypos, uint16_t RGBCode)
{
  /* Set Cursor */
  ST7789H2_SetCursor(Xpos, Ypos);

  /* Prepare to write to LCD RAM */
  ST7789H2_WriteReg(ST7789H2_WRITE_RAM, (uint8_t*)NULL, 0);   /* RAM write data command */

  /* Write RAM data */
  //LCD_IO_WriteData(RGBCode);
  ((LCTDef *)(uint32_t)(0x60000000 | 0x00000000))->RAM = RGBCode;

}

Так все работает в примере, LCTDef моя структура и в примере ни где более не используется

Re: Таймер не работает

Сб дек 14, 2019 09:31:40

Выручайте братцы почти получилось
Вот то, чем ты сейчас занимаешься :)
СпойлерИзображение
СпойлерИзображение
И отрисовка медленная, весь экранчик 240х240 за пару секунд
Я кажется повторяюсь, но это важно. Берём в руки логический анализатор, подключаемся на шину FSMC и настраиваем её параметры так чтобы они соответствовали времянке обмена с индикатором. Естественно, перед этим проверив частоты работы микроконтроллера и его шин. Настраиваем примитивные операции чтения/записи, а затем уже рисуем. Идём от простого к сложному. А так у тебя столько неизвестных переменных, что можно до второго пришествия тыркаться.
Кто то может расшифровать эту строку?
((LCTDef *)(uint32_t)(0x60000000 | 0x00000000))->RAM =
Для начала уберём из неё всё лишнее
Код:
(LCTDef *)0x60000000->RAM
Так понятнее? Это примерно то же самое, что GPIOA->ODR, только структура с регистрами другая. На ночь глядя K&R всё же почитываем :)

Re: Таймер не работает

Сб дек 14, 2019 09:46:59

Почитываю! По чуток чтобы каши не было. вот тебя все утро жду спать не ложусь) Анализатора у меня не ма к сожалению, я занимаюсь ремонтом пром оборудования, а контроллерами занимаюсь первую неделю к сожалению. Вот это сокращение мне очень нравиться! Его кажется даже понять стало легче, спасибо большое!
Я тут от безысходности попробовал весь путь переменной сложить в один мой документ шутки ради, кажется тоже самое но оно заработало, появились цвета. И это очень странно.
Код:
void WriteData(uint8_t Command)
{
   
   ((LCTDef *)(uint32_t)(0x60000000 | 0x00000000))->RAM = Command;//LCD_IO_WriteData(Parameters[i]);
  //__DSB();
}

WriteData(RGBCode); // задаем цвет

Было так ^
А с мусором вот так.
Код:
#define FMC_BANK1       ((LCTDef *)(uint32_t)(0x60000000 | 0x00000000))
static void FMC_BANK1_WriteData(uint16_t Data)
{
  /* Write 16-bit Reg */
  FMC_BANK1->RAM = Data;
  __DSB();
}
void LCD_IO_WriteData(uint16_t RegValue)
{
  /* Write 16-bit Reg */
  FMC_BANK1_WriteData(RegValue);
}

LCD_IO_WriteData(RGBCode); //выбираем цвет

И вот это же одно и тоже только в кругаля нет?

Re: Таймер не работает

Сб дек 14, 2019 09:48:03

Я туда что не пропишу - ошибка

У вас макросы не развернуты в бинарнике. У gcc нужно собирать с -g3, у вашего компилятора посмотрите документацию на предмет «debug level»
Ответить