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

Кто любит RISC в жизни, заходим, не стесняемся.
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

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

Сообщение jcxz »

[uquote="bevice",url="/forum/viewtopic.php?p=3754272#p3754272"]Поместить адрес статичного метода в флешку тоже никаких проблем не вызовет. Память SRAM сама по себе не портится, а если случилось страшное и она поломалась - не важно, что там было вектора прерываний или просто ваши переменные - в подавляющем большинстве случаев дорога в hard_fault.[/uquote]В какой hard_fault??? У вас таблица прерываний порушилась, где прописаны все вектора в том числе и вектор hard_fault-а. А значит дорога лежит не в обработчик HF, а в зависон. Причём глухой зависон - без признаков жизни и причины ошибки.

[uquote="bevice",url="/forum/viewtopic.php?p=3754272#p3754272"]Так что никакой безопасности код во флеше не несет.[/uquote]Т.е. - как? А ничего что попытка записи в вектор во флешь просто физически не может его испортить?

[uquote="bevice",url="/forum/viewtopic.php?p=3754272#p3754272"]Невозможность диагностирования - тоже дудки, стек все равно останется на месте.[/uquote]И какой толк от этого стека если при разрушенной таблице прерываний там будет 100500 входов в обработчик HF и переполнение этого самого стека из-за этих входов?

[uquote="bevice",url="/forum/viewtopic.php?p=3754272#p3754272"]Можно спросить более развернуто: зачем вообще нужно программировать на плюсах?[/uquote]А я разве что-то говорил против плюсов??? :shock: Сам уже последние 20 лет тока на них и программирую....
Аватара пользователя
bevice
Открыл глаза
Сообщения: 54
Зарегистрирован: Сб июн 06, 2009 11:13:56
Контактная информация:

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

Сообщение bevice »

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

Если у вас код свободно пишет туда, куда писать не должен - пора осваивать memory protection unit. Это будет надежнее.
Вы так говорите, будто у вас в контроллере живут демоны, которые только и ждут, чтобы вам программу искалечить.
Нет такого, каждая инструкция попадает по вашей воле и с вашего разрешения. Если стреляют в ногу - то это вы стреляете, а не кто-то другой. Если вы не контролируете стрельбу себе в ногу и поэтому боитесь играть с памятью - вы прикладной программист, что вы делаете в baremetal?
После нас - хоть потоп (с) Лойсо
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

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

Сообщение jcxz »

[uquote="bevice",url="/forum/viewtopic.php?p=3754590#p3754590"]Чтобы похерить таблицу векторов во флеше достаточно 4 строк кода. Если у вас есть бутлодер, эмуляция eeprom или любая другая работа с флешкой - достаточно ошибиться в одной переменной. Так что нет, не несет.[/uquote]Ну да - рассказывать сказки Вы - мастер. Как будто тут никто никогда не отлаживал код в микроконтроллере. 8)
А теперь напрягаем память и вспоминаем: сколько раз за свою практику встречали такие ошибки, которые разрушали содержимое ОЗУ? А сколько раз встречали ошибки, разрушающие флешь МК? :shock:
И перестаём высасывать из пальца небылицы лишь бы только поспорить....

[uquote="bevice",url="/forum/viewtopic.php?p=3754590#p3754590"]Если у вас код свободно пишет туда, куда писать не должен - пора осваивать memory protection unit. Это будет надежнее.[/uquote]Поднимите глаза хоть на пару постов выше в этой теме чтобы понять о чём шла речь и о чём я писал. Прежде чем нести вздор....
Аватара пользователя
TEPEM
Нашел транзистор. Понюхал.
Сообщения: 153
Зарегистрирован: Чт дек 05, 2019 16:28:11
Откуда: Самара

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

Сообщение TEPEM »

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

Код: Выделить всё

 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;


Я к чему это, половина получается регистров забивается по волшебному а половина в лоб?
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

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

Сообщение jcxz »

[uquote="TEPEM",url="/forum/viewtopic.php?p=3754747#p3754747"]Я к чему это, половина получается регистров забивается по волшебному а половина в лоб?[/uquote]
Почему "по волшебному"? Должно забиваться в соответствии с характеристиками памяти. Я FSMC правда вроде не программировал, но FMC - пользовал. Если разобраться - там всё понятно. Правда пользовал по мануалу, без всяких кубов.
Аватара пользователя
TEPEM
Нашел транзистор. Понюхал.
Сообщения: 153
Зарегистрирован: Чт дек 05, 2019 16:28:11
Откуда: Самара

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

Сообщение TEPEM »

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

Добавлено 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:
Я в своем проекте пытаюсь посмотреть регистры, он говорит что таких регистров нет, как так может быть?
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="TEPEM",url="/forum/viewtopic.php?p=3754758#p3754758"]Я в своем проекте пытаюсь посмотреть регистры, он говорит что таких регистров нет, как так может быть?[/uquote]Каких конкретно регистров нет? BCRx и BTRx на картинке видно. BWTRx наверняка чуть ниже должны быть.

Добавлено after 4 minutes 29 seconds:
Раз у тебя через HAL заработала шина, то запусти программу, дай ей поработать и останови. Сними показания трёх регистров: BCR, BTR и BWTR для своего банка. Расшифруй их значения и осмысли что же там наконфигурировано.
Аватара пользователя
TEPEM
Нашел транзистор. Понюхал.
Сообщения: 153
Зарегистрирован: Чт дек 05, 2019 16:28:11
Откуда: Самара

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

Сообщение TEPEM »

Тупанул, разобрался
Последний раз редактировалось TEPEM Пт дек 13, 2019 12:33:02, всего редактировалось 1 раз.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

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

Добавлено after 1 minute 20 seconds:
[uquote="TEPEM",url="/forum/viewtopic.php?p=3754798#p3754798"]Это рабочий пример, мой отдельно проект, ну черт с ним, он вроде почти заработал. Пытаюсь без файла FSMC.h записать это дело, пока он ругается на мою писанину(

FSMC_Bank1->BTCR = 0x0000FFFF;
FSMC_Bank1E->BWTR = 0xFFFFFFFF;
говорит выражение должно быть изменяемым значением[/uquote]
Блин, ну я же уже писать тебе об этом!!! Массив там!!!!

Код: Выделить всё

FSMC_Bank1->BTCR[0] = 0x0000FFFF;
Аватара пользователя
TEPEM
Нашел транзистор. Понюхал.
Сообщения: 153
Зарегистрирован: Чт дек 05, 2019 16:28:11
Откуда: Самара

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

Сообщение TEPEM »

Как я понял, так мы полностью забиваем регистры 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 - ошибки эти про память
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

Во-первых, значения "все 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].
Аватара пользователя
TEPEM
Нашел транзистор. Понюхал.
Сообщения: 153
Зарегистрирован: Чт дек 05, 2019 16:28:11
Откуда: Самара

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

Сообщение TEPEM »

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

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

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

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

Добавлено after 5 minutes 9 seconds:
Да спасибо! Так понял, уже проясняется картинка
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="TEPEM",url="/forum/viewtopic.php?p=3754834#p3754834"]Есть какой то способ гарантировано правильно глянуть что они туда записывают?[/uquote]Под отладчиком переходим на окно дизассемблера, открываем регистры процессора и FSMC параллельно, шагаем и смотрим.
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

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

Сообщение jcxz »

[uquote="TEPEM",url="/forum/viewtopic.php?p=3754834#p3754834"]Есть какой то способ гарантировано правильно глянуть что они туда записывают?[/uquote]Не знаю как у Вас описываются эти регистры, но у меня они описаны как структура. И я просто вписываю эту структуру в окно "Watch" отладчика и вижу там содержимое регистров.
Аватара пользователя
TEPEM
Нашел транзистор. Понюхал.
Сообщения: 153
Зарегистрирован: Чт дек 05, 2019 16:28:11
Откуда: Самара

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

Сообщение TEPEM »

Я туда что не пропишу - ошибка
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

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

Сообщение jcxz »

[uquote="TEPEM",url="/forum/viewtopic.php?p=3755350#p3755350"]Я туда что не пропишу - ошибка[/uquote]Куда? В окно "Watch"?
Аватара пользователя
TEPEM
Нашел транзистор. Понюхал.
Сообщения: 153
Зарегистрирован: Чт дек 05, 2019 16:28:11
Откуда: Самара

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

Сообщение TEPEM »

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

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

Изображение


Код: Выделить всё

 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 моя структура и в примере ни где более не используется
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="TEPEM",url="/forum/viewtopic.php?p=3755392#p3755392"]Выручайте братцы почти получилось[/uquote]Вот то, чем ты сейчас занимаешься :)
СпойлерИзображение
СпойлерИзображение
[uquote="TEPEM",url="/forum/viewtopic.php?p=3755392#p3755392"]И отрисовка медленная, весь экранчик 240х240 за пару секунд[/uquote]Я кажется повторяюсь, но это важно. Берём в руки логический анализатор, подключаемся на шину FSMC и настраиваем её параметры так чтобы они соответствовали времянке обмена с индикатором. Естественно, перед этим проверив частоты работы микроконтроллера и его шин. Настраиваем примитивные операции чтения/записи, а затем уже рисуем. Идём от простого к сложному. А так у тебя столько неизвестных переменных, что можно до второго пришествия тыркаться.
[uquote="TEPEM",url="/forum/viewtopic.php?p=3755392#p3755392"]Кто то может расшифровать эту строку?
((LCTDef *)(uint32_t)(0x60000000 | 0x00000000))->RAM =[/uquote]Для начала уберём из неё всё лишнее

Код: Выделить всё

(LCTDef *)0x60000000->RAM
Так понятнее? Это примерно то же самое, что GPIOA->ODR, только структура с регистрами другая. На ночь глядя K&R всё же почитываем :)
Аватара пользователя
TEPEM
Нашел транзистор. Понюхал.
Сообщения: 153
Зарегистрирован: Чт дек 05, 2019 16:28:11
Откуда: Самара

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

Сообщение TEPEM »

Почитываю! По чуток чтобы каши не было. вот тебя все утро жду спать не ложусь) Анализатора у меня не ма к сожалению, я занимаюсь ремонтом пром оборудования, а контроллерами занимаюсь первую неделю к сожалению. Вот это сокращение мне очень нравиться! Его кажется даже понять стало легче, спасибо большое!
Я тут от безысходности попробовал весь путь переменной сложить в один мой документ шутки ради, кажется тоже самое но оно заработало, появились цвета. И это очень странно.

Код: Выделить всё

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); //выбираем цвет

И вот это же одно и тоже только в кругаля нет?
Аватара пользователя
bevice
Открыл глаза
Сообщения: 54
Зарегистрирован: Сб июн 06, 2009 11:13:56
Контактная информация:

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

Сообщение bevice »

[uquote="TEPEM",url="/forum/viewtopic.php?p=3755350#p3755350"]Я туда что не пропишу - ошибка[/uquote]
У вас макросы не развернуты в бинарнике. У gcc нужно собирать с -g3, у вашего компилятора посмотрите документацию на предмет «debug level»
После нас - хоть потоп (с) Лойсо
Ответить

Вернуться в «ARM»