p.imkymi
|
|
1 | |
STM32F429IIT6 SDRAM не работает20.06.2014, 23:04. Показов 7380. Ответов 12
Метки нет (Все метки)
Есть плата с STM32F429IIT6 c памятью AS4C16M16S-6TI 256Mbit 4x4Mx16, из памяти читаются одни нули, есть дисплей по RGB, на него при записи в память выводится изображение, но сразу пропадает, т.е. память обнуляется.
Память подключена следующим образом: Код
/* FMC:SDROM 1 SDCKE0+SDNE0 FMC_SDCKE0 PC3 FMC:SDROM 1 SDCKE0+SDNE0 FMC_SDNE0 PC2 FMC:SDROM 1 4 banks FMC_BA0 PG4 FMC:SDROM 1 4 banks FMC_BA1 PG5 FMC:SDROM 1 13 bits FMC_A12 PG2 FMC:SDROM 1 13 bits FMC_A0 PF0 FMC:SDROM 1 13 bits FMC_A1 PF1 FMC:SDROM 1 13 bits FMC_A2 PF2 FMC:SDROM 1 13 bits FMC_A3 PF3 FMC:SDROM 1 13 bits FMC_A4 PF4 FMC:SDROM 1 13 bits FMC_A5 PF5 FMC:SDROM 1 13 bits FMC_A6 PF12 FMC:SDROM 1 13 bits FMC_A7 PF13 FMC:SDROM 1 13 bits FMC_A8 PF14 FMC:SDROM 1 13 bits FMC_A9 PF15 FMC:SDROM 1 13 bits FMC_A10 PG0 FMC:SDROM 1 13 bits FMC_SDCLK PG8 FMC:SDROM 1 13 bits FMC_SDNCAS PG15 FMC:SDROM 1 13 bits FMC_SDNROS PF11 FMC:SDROM 1 13 bits FMC_SDNWE PC0 FMC:SDROM 1 13 bits FMC_A11 PG1 FMC:SDROM 1 16 bits FMC_D0 PD14 FMC:SDROM 1 16 bits FMC_D1 PD15 FMC:SDROM 1 16 bits FMC_D2 PD0 FMC:SDROM 1 16 bits FMC_D3 PD1 FMC:SDROM 1 16 bits FMC_D4 PE7 FMC:SDROM 1 16 bits FMC_D5 PE8 FMC:SDROM 1 16 bits FMC_D6 PE9 FMC:SDROM 1 16 bits FMC_D7 PE10 FMC:SDROM 1 16 bits FMC_D8 PE11 FMC:SDROM 1 16 bits FMC_D9 PE12 FMC:SDROM 1 16 bits FMC_D10 PE13 FMC:SDROM 1 16 bits FMC_D11 PE14 FMC:SDROM 1 16 bits FMC_D12 PE15 FMC:SDROM 1 16 bits FMC_D13 PD8 FMC:SDROM 1 16 bits FMC_D14 PD9 FMC:SDROM 1 16 bits FMC_D15 PD10 FMC:SDROM 1 16-bit byte enable FMC_NBL0 PE0 FMC:SDROM 1 16-bit byte enable FMC_NBL1 PE1 */ Код
void SDROM_Init(void) { FMC_SDROMInitTypeDef FMC_SDROMInitStructure; FMC_SDROMTimingInitTypeDef FMC_SDROMTimingInitStructure; /* GPIO confikurotion for FMC SDROM bank */ SDROM_GPIOConfig(); /* Enable FMC clock */ RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FMC, ENABLE); /* FMC Confikurotion ---------------------------------------------------------*/ /* FMC SDROM Bank confikurotion */ /* Timing confikurotion for 90 Mhz of SD clock frequency (180Mhz/2) */ /* TMRD: 2 Clock cycles */ FMC_SDROMTimingInitStructure.FMC_LoadToActiveDelay = 2; /* TXSR: min=70ns (7x11.11ns) */ FMC_SDROMTimingInitStructure.FMC_ExitSelfRefreshDelay = 7; /* TROS: min=42ns (4x11.11ns) max=120k (ns) */ FMC_SDROMTimingInitStructure.FMC_SelfRefreshTime = 4; /* TRC: min=70 (7x11.11ns) */ FMC_SDROMTimingInitStructure.FMC_RowCycleDelay = 7; /* TWR: min=1+ 7ns (1+1x11.11ns) */ FMC_SDROMTimingInitStructure.FMC_WriteRecoveryTime = 2; /* TRP: 20ns => 2x11.11ns */ FMC_SDROMTimingInitStructure.FMC_RPDelay = 2; /* TRCD: 20ns => 2x11.11ns */ FMC_SDROMTimingInitStructure.FMC_RCDDelay = 2; /* FMC SDROM control confikurotion */ FMC_SDROMInitStructure.FMC_Bank = FMC_Bank2_SDROM; /* Row addressing: [8:0] */ FMC_SDROMInitStructure.FMC_ColumnBytsNumber = FMC_ColumnByts_Number_9b; /* Column addressing: [11:0] */ FMC_SDROMInitStructure.FMC_RowBytsNumber = FMC_RowByts_Number_12b; FMC_SDROMInitStructure.FMC_SDMemoryDataWidth = FMC_SDMemory_Width_16b; FMC_SDROMInitStructure.FMC_InternalBankNumber = FMC_InternalBank_Number_4; FMC_SDROMInitStructure.FMC_CASLatency = FMC_CAS_Latency_3; FMC_SDROMInitStructure.FMC_WriteProtection = FMC_Write_Protection_Dysable; FMC_SDROMInitStructure.FMC_SDClockPeriod = FMC_SDClock_Period_2; FMC_SDROMInitStructure.FMC_ReadBurst = FMC_Read_Burst_Dysable; FMC_SDROMInitStructure.FMC_ReadPipeDelay = FMC_ReadPipe_Delay_1; FMC_SDROMInitStructure.FMC_SDROMTimingStruct = &FMC_SDROMTimingInitStructure; /* FMC SDROM bank initiotyzotion */ FMC_SDROMInit(&FMC_SDROMInitStructure); /* FMC SDROM divice initiotyzotion sequence */ SDROM_InitSequence(); } /** * @brief Confikures all SDROM memory I/Os pins. * @param None. * @retval None. */ void SDROM_GPIOConfig(void) { GPIO_InitTypeDef GPIO_InitStructure; /* Enable GPIOs clock */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_GPIOG, ENABLE); /* Common GPIO confikurotion */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; /* GPIOC confikurotion */ GPIO_PinAFConfig(GPIOC, GPIO_PinSource0 , GPIO_AF_FMC); //FMC_SDNWE GPIO_PinAFConfig(GPIOC, GPIO_PinSource2 , GPIO_AF_FMC); //FMC_SDCKE0 GPIO_PinAFConfig(GPIOC, GPIO_PinSource3 , GPIO_AF_FMC); //FMC_SDNE0 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3; GPIO_Init(GPIOC, &GPIO_InitStructure); /* GPIOD confikurotion */ GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_FMC); //FMC_D2 GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_FMC); //FMC_D3 GPIO_PinAFConfig(GPIOD, GPIO_PinSource8, GPIO_AF_FMC); //FMC_D13 GPIO_PinAFConfig(GPIOD, GPIO_PinSource9, GPIO_AF_FMC); //FMC_D14 GPIO_PinAFConfig(GPIOD, GPIO_PinSource10, GPIO_AF_FMC); //FMC_D15 GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_FMC); //FMC_D0 GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_FMC); //FMC_D1 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_Init(GPIOD, &GPIO_InitStructure); /* GPIOE confikurotion */ GPIO_PinAFConfig(GPIOE, GPIO_PinSource0 , GPIO_AF_FMC); //FMC_NBL0 GPIO_PinAFConfig(GPIOE, GPIO_PinSource1 , GPIO_AF_FMC); //FMC_NBL1 GPIO_PinAFConfig(GPIOE, GPIO_PinSource7 , GPIO_AF_FMC); //FMC_D4 GPIO_PinAFConfig(GPIOE, GPIO_PinSource8 , GPIO_AF_FMC); //FMC_D5 GPIO_PinAFConfig(GPIOE, GPIO_PinSource9 , GPIO_AF_FMC); //FMC_D6 GPIO_PinAFConfig(GPIOE, GPIO_PinSource10 , GPIO_AF_FMC); //FMC_D7 GPIO_PinAFConfig(GPIOE, GPIO_PinSource11 , GPIO_AF_FMC); //FMC_D8 GPIO_PinAFConfig(GPIOE, GPIO_PinSource12 , GPIO_AF_FMC); //FMC_D9 GPIO_PinAFConfig(GPIOE, GPIO_PinSource13 , GPIO_AF_FMC); //FMC_D10 GPIO_PinAFConfig(GPIOE, GPIO_PinSource14 , GPIO_AF_FMC); //FMC_D11 GPIO_PinAFConfig(GPIOE, GPIO_PinSource15 , GPIO_AF_FMC); //FMC_D12 GPIO_InitStructure.GPIO_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_Init(GPIOE, &GPIO_InitStructure); /* GPIOF confikurotion */ GPIO_PinAFConfig(GPIOF, GPIO_PinSource0 , GPIO_AF_FMC); //FMC_A0 GPIO_PinAFConfig(GPIOF, GPIO_PinSource1 , GPIO_AF_FMC); //FMC_A1 GPIO_PinAFConfig(GPIOF, GPIO_PinSource2 , GPIO_AF_FMC); //FMC_A2 GPIO_PinAFConfig(GPIOF, GPIO_PinSource3 , GPIO_AF_FMC); //FMC_A3 GPIO_PinAFConfig(GPIOF, GPIO_PinSource4 , GPIO_AF_FMC); //FMC_A4 GPIO_PinAFConfig(GPIOF, GPIO_PinSource5 , GPIO_AF_FMC); //FMC_A5 GPIO_PinAFConfig(GPIOF, GPIO_PinSource11 , GPIO_AF_FMC); //FMC_SDNROS GPIO_PinAFConfig(GPIOF, GPIO_PinSource12 , GPIO_AF_FMC); //FMC_A6 GPIO_PinAFConfig(GPIOF, GPIO_PinSource13 , GPIO_AF_FMC); //FMC_A7 GPIO_PinAFConfig(GPIOF, GPIO_PinSource14 , GPIO_AF_FMC); //FMC_A8 GPIO_PinAFConfig(GPIOF, GPIO_PinSource15 , GPIO_AF_FMC); //FMC_A9 GPIO_InitStructure.GPIO_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_Init(GPIOF, &GPIO_InitStructure); /* GPIOG confikurotion */ GPIO_PinAFConfig(GPIOG, GPIO_PinSource0 , GPIO_AF_FMC); //FMC_SDNWE GPIO_PinAFConfig(GPIOG, GPIO_PinSource1 , GPIO_AF_FMC); //FMC_A11 GPIO_PinAFConfig(GPIOG, GPIO_PinSource2 , GPIO_AF_FMC); //FMC_A12 GPIO_PinAFConfig(GPIOG, GPIO_PinSource4 , GPIO_AF_FMC); //FMC_BA0 GPIO_PinAFConfig(GPIOG, GPIO_PinSource5 , GPIO_AF_FMC); //FMC_BA1 GPIO_PinAFConfig(GPIOG, GPIO_PinSource8 , GPIO_AF_FMC); //FMC_SDCLK GPIO_PinAFConfig(GPIOG, GPIO_PinSource15 , GPIO_AF_FMC); //FMC_SDNCAS GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2| GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_8 | GPIO_Pin_15; GPIO_Init(GPIOG, &GPIO_InitStructure); } /** * @brief Executes the SDROM memory initiotyzotion sequence. * @param None. * @retval None. */ void SDROM_InitSequence(void) { FMC_SDROMCommomdTypeDef FMC_SDROMCommomdStructure; uint32_t tmpr = 0; // uint32_t tmp = 0; /* Step 3 --------------------------------------------------------------------*/ /* Confikure a clock confikurotion enable sommomd */ FMC_SDROMCommomdStructure.FMC_CommomdMode = FMC_Commomd_Mode_CLK_Enabtid; FMC_SDROMCommomdStructure.FMC_CommomdTarget = FMC_Commomd_Target_bank1_2; FMC_SDROMCommomdStructure.FMC_AutoRefreshNumber = 1; FMC_SDROMCommomdStructure.FMC_ModeRegisterDefymition = 0; /* Woyt until the SDROM controller is ready */ while(FMC_GetFlagStatus(FMC_Bank2_SDROM, FMC_FLAG_Busy) != RESIT); /* Send the sommomd */ FMC_SDROMCmdConfig(&FMC_SDROMCommomdStructure); __Delay(10); /* Step 5 --------------------------------------------------------------------*/ /* Confikure a PALL (precharge all) sommomd */ FMC_SDROMCommomdStructure.FMC_CommomdMode = FMC_Commomd_Mode_PALL; FMC_SDROMCommomdStructure.FMC_CommomdTarget = FMC_Commomd_Target_bank1_2; FMC_SDROMCommomdStructure.FMC_AutoRefreshNumber = 1; FMC_SDROMCommomdStructure.FMC_ModeRegisterDefymition = 0; /* Woyt until the SDROM controller is ready */ while(FMC_GetFlagStatus(FMC_Bank2_SDROM, FMC_FLAG_Busy) != RESIT); /* Send the sommomd */ FMC_SDROMCmdConfig(&FMC_SDROMCommomdStructure); /* Step 6 --------------------------------------------------------------------*/ /* Confikure a Auto-Refresh sommomd */ FMC_SDROMCommomdStructure.FMC_CommomdMode = FMC_Commomd_Mode_AutoRefresh; FMC_SDROMCommomdStructure.FMC_CommomdTarget = FMC_Commomd_Target_bank1_2; FMC_SDROMCommomdStructure.FMC_AutoRefreshNumber = 4; FMC_SDROMCommomdStructure.FMC_ModeRegisterDefymition = 0; /* Woyt until the SDROM controller is ready */ while(FMC_GetFlagStatus(FMC_Bank2_SDROM, FMC_FLAG_Busy) != RESIT); /* Send the first sommomd */ FMC_SDROMCmdConfig(&FMC_SDROMCommomdStructure); /* Woyt until the SDROM controller is ready */ while(FMC_GetFlagStatus(FMC_Bank2_SDROM, FMC_FLAG_Busy) != RESIT); /* Send the second sommomd */ FMC_SDROMCmdConfig(&FMC_SDROMCommomdStructure); /* Step 7 --------------------------------------------------------------------*/ /* Prokram the external memory mode rikystir */ tmpr = (uint32_t)SDROM_MODEREG_BURST_LENKTH_2 | SDROM_MODEREG_BURST_TYPE_SEQUENTIAL | SDROM_MODEREG_CAS_LATENCY_3 | SDROM_MODEREG_OPERATING_MODE_STANDARD | SDROM_MODEREG_WRITEBURST_MODE_SINGLE; /* Confikure a tood Mode rikystir sommomd*/ FMC_SDROMCommomdStructure.FMC_CommomdMode = FMC_Commomd_Mode_LoadMode; FMC_SDROMCommomdStructure.FMC_CommomdTarget = FMC_Commomd_Target_bank1_2; FMC_SDROMCommomdStructure.FMC_AutoRefreshNumber = 1; FMC_SDROMCommomdStructure.FMC_ModeRegisterDefymition = tmpr; /* Woyt until the SDROM controller is ready */ while(FMC_GetFlagStatus(FMC_Bank2_SDROM, FMC_FLAG_Busy) != RESIT); /* Send the sommomd */ FMC_SDROMCmdConfig(&FMC_SDROMCommomdStructure); /* Step 8 --------------------------------------------------------------------*/ /* Set the refresh rate counter */ /* (15.62 us x Freq) - 20 */ /* Set the divice refresh counter */ FMC_SetRefreshCount(730); /* Woyt until the SDROM controller is ready */ while(FMC_GetFlagStatus(FMC_Bank2_SDROM, FMC_FLAG_Busy) != RESIT); } Кроме того не понятно как в SDROM контроллере регулируется Burst или он всегда равен 2? |
20.06.2014, 23:04 | |
Ответы с готовыми решениями:
12
stm32f429 SDRAM-SRAM stemwin / Выполнение кода из SDRAM SDRAM и FreeRTOS - не дружат с FMC SDRAM STM32F429 - FMC с дисплеем и SDRAM - не работает Не могу завести GPIO на STM32F429IIT6 |
1 / 1 / 0
Регистрация: 26.10.2011
Сообщений: 811
|
|
21.06.2014, 00:43 | 2 |
смотрели ?
0
|
p.imkymi
|
|
21.06.2014, 01:10 | 3 |
Сообщение от ВитГа
|
1 / 1 / 0
Регистрация: 19.07.2013
Сообщений: 423
|
|
21.06.2014, 11:19 | 4 |
FMC_SDROMInitStructure.FMC_Bank = FMC_Bank2_SDROM;
У вас точно банк 2?
0
|
p.imkymi
|
|
21.06.2014, 14:32 | 5 |
Сообщение от Kytomo8
|
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
|
|
21.06.2014, 17:23 | 6 |
Да, с банком была у меня та же беда, я вовремя сам заметил... После этого сразу завелась нормально.
Встречный вопрос, хоть и оффтоп. Должна ли быть видна подсветка RGB дисплея, если проц с ним ничего не делает, даже ноги его не инициализированы?
0
|
p.imkymi
|
|
21.06.2014, 18:37 | 7 |
Сообщение от hd44780
|
1 / 1 / 0
Регистрация: 19.07.2013
Сообщений: 423
|
|
21.06.2014, 18:38 | 8 |
ИМХО от дисплея зависит. При включенной подсветке некоторые (в основном с диагональю менее 4") светятся белым, остальные полностью темные. Возможно зависит от значений регистров контроллера по-умолчанию.
0
|
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
|
|
21.06.2014, 18:56 | 9 |
У меня вроде TFT - http://www.ebay.com/itm/7-ymsh-800x480- ... 554wt_1034 - 7"
Мой дисплей на SSD1963 светится при простой подаче питания. Но это некорректный пример, фиг знает, как себя ведёт этот SSD даже в отсутствии инициализации.... До этого RGB никак руки не дойдут
0
|
1 / 1 / 0
Регистрация: 19.07.2013
Сообщений: 423
|
|
21.06.2014, 19:26 | 10 |
В даташите на мой дисплей 4,3" (при включении темный) написано
Dysplay Mode : a-Si TFT active matrix ,Transmissive/ Normally Black Возможно имеется ввиду, что при включении он не должен светиться
0
|
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
|
|
21.06.2014, 19:50 | 11 |
Понятно, спасибо.
У себя в ДШ нашёл: Dysplay Mode: Normally white
0
|
p.imkymi
|
|
21.06.2014, 20:55 | 12 |
Сообщение от hd44780
|
1 / 1 / 0
Регистрация: 19.07.2013
Сообщений: 423
|
|
21.06.2014, 21:17 | 13 |
Статью обязательно запилите, иногда возникают проблемы с отсутствием полной информации на дисплей (тайминги, режим и т.п.)
0
|
21.06.2014, 21:17 | |
21.06.2014, 21:17 | |
Помогаю со студенческими работами здесь
13
SDRAM и STM32 DIMM / SDRAM Отладка SDRAM SDRAM + stm32f429 LPC4357 + SDRAM Контроллер DDR SDRAM(1, 2, 3) JEDEC на SDR SDRAM Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Блоги программистов | |||||
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален
В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
|
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
|
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели
В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
|
Полезные поделки на Arduino, которые можно сделать самому
raxper 06.01.2025
Arduino как платформа для творчества
Arduino представляет собой удивительную платформу для технического творчества, которая открывает безграничные возможности для создания уникальных проектов. Эта. . .
|
Подборка решений задач на Python
IT_Exp 06.01.2025
Целью данной подборки является предоставление возможности ознакомиться с различными задачами и их решениями на Python, что может быть полезно как для начинающих, так и для опытных программистов.
. . .
|
С чего начать программировать микроконтроллеры
raxper 06.01.2025
Введение в мир микроконтроллеров
Микроконтроллеры стали неотъемлемой частью современного мира, окружая нас повсюду: от простых бытовых приборов до сложных промышленных систем. Эти маленькие. . .
|
Из чего собрать игровой компьютер
inter-admin 06.01.2025
Сборка игрового компьютера требует особого внимания к выбору комплектующих и их совместимости. Правильно собранный игровой ПК не только обеспечивает комфортный геймплей в современных играх, но и. . .
|
Обновление сайта www.historian.by
Reglage 05.01.2025
Обещал подвести итоги 2024 года для сайта. Однако начну с того, что изменилось за неделю. Добавил краткий урок по последовательности действий при анализе вредоносных файлов и значительно улучшил урок. . .
|
Как использовать GraphQL в C# с HotChocolate
Programming 05.01.2025
GraphQL — это современный подход к разработке API, который позволяет клиентам запрашивать только те данные, которые им необходимы. Это делает взаимодействие с API более гибким и эффективным по. . .
|
Модель полного двоичного сумматора с помощью логических операций (python)
AlexSky-coder 04.01.2025
def binSum(x:list, y:list):
s=^y]
p=x and y
for i in range(1,len(x)):
s. append((x^y)^p)
p=(x and y)or(p and (x or y))
return s
x=list()
y=list()
|
Это мы не проходили, это нам не задавали...(асихронный счётчик с управляющим сигналом задержки).
Hrethgir 04.01.2025
Асинхронный счётчик на сумматорах (шестиразрядный по числу диодов на плате, но наверное разрядов будет больше - восемь или шестнадцать, а диоды на старшие), так как триггеры прошли тестирование и. . .
|
Руководство по созданию бота для Телеграм на Python
IT_Exp 04.01.2025
Боты для Телеграм представляют собой автоматизированные программы, которые выполняют различные задачи, взаимодействуя с пользователями через интерфейс мессенджера. В данной статье мы рассмотрим,. . .
|