Страница 5 из 12
Re: Таймер не работает
Добавлено: Чт дек 12, 2019 16:23:43
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]А я разве что-то говорил против плюсов???

Сам уже последние 20 лет тока на них и программирую....
Re: Таймер не работает
Добавлено: Пт дек 13, 2019 01:09:40
bevice
Чтобы похерить таблицу векторов во флеше достаточно 4 строк кода. Если у вас есть бутлодер, эмуляция eeprom или любая другая работа с флешкой - достаточно ошибиться в одной переменной. Так что нет, не несет.
Если у вас код свободно пишет туда, куда писать не должен - пора осваивать memory protection unit. Это будет надежнее.
Вы так говорите, будто у вас в контроллере живут демоны, которые только и ждут, чтобы вам программу искалечить.
Нет такого, каждая инструкция попадает по вашей воле и с вашего разрешения. Если стреляют в ногу - то это вы стреляете, а не кто-то другой. Если вы не контролируете стрельбу себе в ногу и поэтому боитесь играть с памятью - вы прикладной программист, что вы делаете в baremetal?
Re: Таймер не работает
Добавлено: Пт дек 13, 2019 10:48:36
jcxz
[uquote="bevice",url="/forum/viewtopic.php?p=3754590#p3754590"]Чтобы похерить таблицу векторов во флеше достаточно 4 строк кода. Если у вас есть бутлодер, эмуляция eeprom или любая другая работа с флешкой - достаточно ошибиться в одной переменной. Так что нет, не несет.[/uquote]Ну да - рассказывать сказки Вы - мастер. Как будто тут никто никогда не отлаживал код в микроконтроллере.
А теперь напрягаем память и вспоминаем: сколько раз за свою практику встречали такие ошибки, которые разрушали содержимое
ОЗУ? А сколько раз встречали ошибки, разрушающие
флешь МК?
И перестаём высасывать из пальца небылицы лишь бы только поспорить....
[uquote="bevice",url="/forum/viewtopic.php?p=3754590#p3754590"]Если у вас код свободно пишет туда, куда писать не должен - пора осваивать memory protection unit. Это будет надежнее.[/uquote]Поднимите глаза хоть на пару постов выше в этой теме чтобы понять
о чём шла речь и
о чём я писал. Прежде чем нести вздор....
Re: Таймер не работает
Добавлено: Пт дек 13, 2019 10:49:59
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;
Я к чему это, половина получается регистров забивается по волшебному а половина в лоб?
Re: Таймер не работает
Добавлено: Пт дек 13, 2019 10:54:58
jcxz
[uquote="TEPEM",url="/forum/viewtopic.php?p=3754747#p3754747"]Я к чему это, половина получается регистров забивается по волшебному а половина в лоб?[/uquote]
Почему "по волшебному"? Должно забиваться в соответствии с характеристиками памяти. Я FSMC правда вроде не программировал, но FMC - пользовал. Если разобраться - там всё понятно. Правда пользовал по мануалу, без всяких кубов.
Re: Таймер не работает
Добавлено: Пт дек 13, 2019 11:52:16
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:
Я в своем проекте пытаюсь посмотреть регистры, он говорит что таких регистров нет, как так может быть?
Re: Таймер не работает
Добавлено: Пт дек 13, 2019 12:28:18
VladislavS
[uquote="TEPEM",url="/forum/viewtopic.php?p=3754758#p3754758"]Я в своем проекте пытаюсь посмотреть регистры, он говорит что таких регистров нет, как так может быть?[/uquote]Каких конкретно регистров нет? BCRx и BTRx на картинке видно. BWTRx наверняка чуть ниже должны быть.
Добавлено after 4 minutes 29 seconds:
Раз у тебя через HAL заработала шина, то запусти программу, дай ей поработать и останови. Сними показания трёх регистров: BCR, BTR и BWTR для своего банка. Расшифруй их значения и осмысли что же там наконфигурировано.
Re: Таймер не работает
Добавлено: Пт дек 13, 2019 12:30:04
TEPEM
Тупанул, разобрался
Re: Таймер не работает
Добавлено: Пт дек 13, 2019 12:32:53
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]
Блин, ну я же уже писать тебе об этом!!! Массив там!!!!
Re: Таймер не работает
Добавлено: Пт дек 13, 2019 12:58:07
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 - ошибки эти про память
Re: Таймер не работает
Добавлено: Пт дек 13, 2019 13:11:55
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].
Re: Таймер не работает
Добавлено: Пт дек 13, 2019 13:37:37
TEPEM
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
VladislavS
[uquote="TEPEM",url="/forum/viewtopic.php?p=3754834#p3754834"]Есть какой то способ гарантировано правильно глянуть что они туда записывают?[/uquote]Под отладчиком переходим на окно дизассемблера, открываем регистры процессора и FSMC параллельно, шагаем и смотрим.
Re: Таймер не работает
Добавлено: Пт дек 13, 2019 21:10:41
jcxz
[uquote="TEPEM",url="/forum/viewtopic.php?p=3754834#p3754834"]Есть какой то способ гарантировано правильно глянуть что они туда записывают?[/uquote]Не знаю как у Вас описываются эти регистры, но у меня они описаны как структура. И я просто вписываю эту структуру в окно "Watch" отладчика и вижу там содержимое регистров.
Re: Таймер не работает
Добавлено: Пт дек 13, 2019 23:26:42
TEPEM
Я туда что не пропишу - ошибка
Re: Таймер не работает
Добавлено: Пт дек 13, 2019 23:56:14
jcxz
[uquote="TEPEM",url="/forum/viewtopic.php?p=3755350#p3755350"]Я туда что не пропишу - ошибка[/uquote]Куда? В окно "Watch"?
Re: Таймер не работает
Добавлено: Сб дек 14, 2019 09:29:02
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 моя структура и в примере ни где более не используется
Re: Таймер не работает
Добавлено: Сб дек 14, 2019 09:31:40
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]Для начала уберём из неё всё лишнее
Так понятнее? Это примерно то же самое, что GPIOA->ODR, только структура с регистрами другая. На ночь глядя K&R всё же почитываем

Re: Таймер не работает
Добавлено: Сб дек 14, 2019 09:46:59
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); //выбираем цвет
И вот это же одно и тоже только в кругаля нет?
Re: Таймер не работает
Добавлено: Сб дек 14, 2019 09:48:03
bevice
[uquote="TEPEM",url="/forum/viewtopic.php?p=3755350#p3755350"]Я туда что не пропишу - ошибка[/uquote]
У вас макросы не развернуты в бинарнике. У gcc нужно собирать с -g3, у вашего компилятора посмотрите документацию на предмет «debug level»