Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
2 / 2 / 3
Регистрация: 20.12.2015
Сообщений: 336
1

Stm32f051 (ADC&DMA)

27.03.2016, 17:37. Показов 2434. Ответов 25
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Ребята помогите с проблемой. В программе он ругает на этот
C
1
.\project.axf: Error: L6218E: Undefined symbol assert_param (referred from stm32f0xx_adc.o).
C
1
.\project.axf: Error: L6218E: Undefined symbol f_adcsample (referred from main.o).
вот полный код программы
Кликните здесь для просмотра всего текста

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
#include "stm32f0xx.h"
#include "stm32f0xx_gpio.h"
#include "stm32f0xx_rcc.h"
#include "stm32f0xx_adc.h"
#include "stm32f0xx_dma.h"
#include "stm32f0xx_tim.h"
#include "stm32f0xx_misc.h"
 
#define TIM_ADC TIM1 
#define SYSCLK 16000000          
#define ptimer_int 10       
#define Prescaler 127         
 
const uint16_t _Period =  ((SYSCLK/(Prescaler + 1))/ptimer_int)/2; 
#define ADC1_DR_Address    ((uint32_t)0x40012440)
 
volatile uint16_t ADCConvertedValue[16];   
uint16_t dmacounter; 
uint16_t dmacounter2;
extern volatile uint8_t f_adcsample; 
 
/*----------------------------------------------------------------------------
                                 ADC-DMA
*---------------------------------------------------------------------------*/
 
void adcdma_init(){
   
   GPIO_InitTypeDef              GPIO_InitStructure; 
   ADC_InitTypeDef                ADC_InitStructure;
   DMA_InitTypeDef                DMA_InitStructure;
   NVIC_InitTypeDef                NVIC_InitStructure;
   TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
   
   RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4 );      
   /* Enable DMA1 clock */
   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
   /* Enable ADC1 and GPIOA B clock */
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 , ENABLE);   
   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);   
   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);   
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
      
   /* Configure PA (ADC Channel) as analog input -------------------------*/
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
   GPIO_Init(GPIOA, &GPIO_InitStructure);   
 
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
   GPIO_Init(GPIOA, &GPIO_InitStructure);
 
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
   GPIO_Init(GPIOA, &GPIO_InitStructure);
 
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
   GPIO_Init(GPIOA, &GPIO_InitStructure);
 
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
   GPIO_Init(GPIOA, &GPIO_InitStructure);
 
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
   GPIO_Init(GPIOB, &GPIO_InitStructure);
 
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
   GPIO_Init(GPIOB, &GPIO_InitStructure);      
      
   /* DMA1 channel1 configuration ----------------------------------------------*/
   DMA_DeInit(DMA1_Channel1);   
   
   DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
   DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADCConvertedValue;
   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
   DMA_InitStructure.DMA_BufferSize = 16;
   DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
   DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
   DMA_InitStructure.DMA_Priority = DMA_Priority_Low;
   DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
   DMA_Init(DMA1_Channel1, &DMA_InitStructure);
 
   DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE);
   DMA_ITConfig(DMA1_Channel1, DMA_IT_HT, ENABLE);
   NVIC_EnableIRQ(DMA1_Channel1_IRQn);
     /* DMA1 Channel1 enable */
     DMA_Cmd(DMA1_Channel1, ENABLE);  
     /* ADC DMA request in circular mode */
   ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);  
   /* Enable ADC_DMA */
   ADC_DMACmd(ADC1, ENABLE); 
   
  NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
 
     /* ADC1 configuration ------------------------------------------------------*/
   ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
   ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; 
   ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Falling;
   ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_TRGO;
   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
   ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;
   ADC_Init(ADC1, &ADC_InitStructure);   
 
/* ADC1 regular channel configuration */ 
  ADC_ChannelConfig(ADC1, ADC_Channel_3 , ADC_SampleTime_55_5Cycles);
  ADC_ChannelConfig(ADC1, ADC_Channel_4 , ADC_SampleTime_55_5Cycles); 
  ADC_ChannelConfig(ADC1, ADC_Channel_5 , ADC_SampleTime_55_5Cycles); 
  ADC_ChannelConfig(ADC1, ADC_Channel_6 , ADC_SampleTime_55_5Cycles); 
  ADC_ChannelConfig(ADC1, ADC_Channel_7 , ADC_SampleTime_55_5Cycles); 
  ADC_ChannelConfig(ADC1, ADC_Channel_8 , ADC_SampleTime_55_5Cycles); 
  ADC_ChannelConfig(ADC1, ADC_Channel_9 , ADC_SampleTime_55_5Cycles); 
   
  ADC_ChannelConfig(ADC1, ADC_Channel_TempSensor , ADC_SampleTime_55_5Cycles);  
  ADC_TempSensorCmd(ENABLE);   
   
    /* ADC Calibration */
  ADC_GetCalibrationFactor(ADC1);   
   
   /* Enable ADC1 */
   ADC_DMACmd(ADC1, ENABLE);   
   /* Enable ADC1 */
   ADC_Cmd(ADC1, ENABLE);
  
/* Timer configuration ------------------------------------------------------*/   
   
   TIM_DeInit(TIM_ADC);
   TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);  
   
   /* Time Base configuration */
   TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); 
   TIM_TimeBaseStructure.TIM_Period = _Period;          
   TIM_TimeBaseStructure.TIM_Prescaler = Prescaler;       
   TIM_TimeBaseStructure.TIM_ClockDivision = 0;    
   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 
   TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;   
   TIM_TimeBaseInit(TIM_ADC, &TIM_TimeBaseStructure);
   TIM_SelectOutputTrigger(TIM_ADC, TIM_TRGOSource_Update);
   
   /* TIM1 counter enable */
   TIM_Cmd(TIM_ADC, ENABLE);   
   ADC_StartOfConversion(ADC1);    
}   
 
/*----------------------------------------------------------------------------
                                         DMA 
*---------------------------------------------------------------------------*/
 
void DMA1_Channel1_IRQHandler(){   
   if (DMA_GetITStatus(DMA1_IT_HT1))   {
      dmacounter++;
      f_adcsample = 1;
      DMA_ClearITPendingBit(DMA1_IT_HT1);   
   }
   if (DMA_GetITStatus(DMA1_IT_TC1))   {
      dmacounter2++;
      f_adcsample = 2;
      DMA_ClearITPendingBit(DMA1_IT_TC1);   
     }      
}
 
/*-------------------------------------------------------------------------*/
 
int main(void)
    {
        adcdma_init();
        DMA1_Channel1_IRQHandler();
        while(1)
            {
        }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.03.2016, 17:37
Ответы с готовыми решениями:

stm32f051 (ADC&DMA)
Ребята помогите в программе ругает так .\project.axf: Error: L6218E: Undefined symbol ossirt_param...

STM32F4Discovery - ADC DMA и FSMC DMA
Привет всем. Вынужден опять обратиться за Вашей помощью :) Ситуация такая. 1. Дисплей...

stm32f407+ADC+DMA. Проблема с DMA
Доброго дня! Новичок в stm, первый проект, начальные наброски, не понимаю,почему не работает эта...

STM32F051 Проблема с запуском ADC от Timer1 по TRGO
Не могу завести АЦП. Все работает, если ацп запускать в автозапуске, но по таймеру1 запустить не...

25
techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
27.03.2016, 19:46 2
Ну, assert_param... Можете просто макрос

C++
1
#define assert_param(x)
определить, хотя она, по идее, должна предупреждения на uart выводить...

А вот, что такое f_adcsample я не знаю...
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,520
27.03.2016, 22:56 3
Цитата Сообщение от Mirmik Посмотреть сообщение
вот, что такое f_adcsample я не знаю...
Цитата Сообщение от Umar Egamberdie Посмотреть сообщение
extern volatile uint8_t f_adcsample;
а вот он объявлена внешняя переменная которая нигде не описана
разумеется линкер с ума сошел

Добавлено через 9 минут
Цитата Сообщение от Umar Egamberdie Посмотреть сообщение
.\project.axf: Error: L6218E: Undefined symbol assert_param (referred from stm32f0xx_adc.o).
видать не включен макрос USE_FULL_ASSERT

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#ifdef  USE_FULL_ASSERT
 
/**
  * @brief  The assert_param macro is used for function's parameters check.
  * @param  expr: If expr is false, it calls assert_failed function which reports 
  *         the name of the source file and the source line number of the call 
  *         that failed. If expr is true, it returns no value.
  * @retval None
  */
  #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))
/* Exported functions ------------------------------------------------------- */
  void assert_failed(uint8_t* file, uint32_t line);
#else
  #define assert_param(expr) ((void)0)
#endif /* USE_FULL_ASSERT */
или включи макрос или сам опиши
C
1
#define assert_param(expr) ((void)0)
1
2 / 2 / 3
Регистрация: 20.12.2015
Сообщений: 336
27.03.2016, 23:14  [ТС] 4
не понял куда
C
1
USE_FULL_ASSERT
этот подключить.
C
1
#define assert_param(expr) ((void)0)
этого я вставил на все библиотеки которые подключены и исчез первый код ошибки а остался только один
C
1
.\project.axf: Error: L6218E: Undefined symbol f_adcsample (referred from main.o).
этот ошибка
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,520
27.03.2016, 23:25 5
Umar Egamberdie,
ты знаешь что такое extern?
зачем вот эта запись
Цитата Сообщение от Umar Egamberdie Посмотреть сообщение
extern volatile uint8_t f_adcsample;
20 строчка
откуда ты её списал?
0
2 / 2 / 3
Регистрация: 20.12.2015
Сообщений: 336
27.03.2016, 23:32  [ТС] 6
(ссылки на другие форумы запрещены. ValeryS) вот от сюда, можно сказать что я чайник ахахз, только месяц прошло изучаю keil uvision профессионально пока не знаю
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,520
27.03.2016, 23:47 7
Цитата Сообщение от Umar Egamberdie Посмотреть сообщение
вот от сюда
там это кусок кода, просто инициализация, все действие происходит в другом файле
и поэтому перемененная внешняя(extern)
даже если выбросишь слово extern, программа скомпилируется но ничего делать не будет
поищи нормальные описание работы АЦП с ДМА, у того же кеила куча примеров
Цитата Сообщение от Umar Egamberdie Посмотреть сообщение
только месяц прошло изучаю keil uvision
на форумах нужно искать когда есть хоть какой то багаж знаний, иначе такого понапишешь
для начала рекомендую изучить Си, твои ошибки никакого отношения к микроконтроллерам не имеют, это не знание языка
1
2 / 2 / 3
Регистрация: 20.12.2015
Сообщений: 336
27.03.2016, 23:53  [ТС] 8
это в универе по ГПО занимаемся с этим дают на самостоятельную изучению, а так я знаю delphi, pascal abc, arduino ide. и.т.п и немножко с++,
Цитата Сообщение от ValeryS Посмотреть сообщение
поищи нормальные описание работы АЦП с ДМА, у того же кеила куча примеров
да есть куча примеров но они на stm32f4 а на stm32f051 мало информации
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,520
28.03.2016, 00:01 9
Цитата Сообщение от Umar Egamberdie Посмотреть сообщение
да есть куча примеров но они на stm32f4 а на stm32f051 мало информации
для работы с библиотеками это в принципе без разницы, библиотеки скрывают низкий уровень( регистры. наименования битов)
Цитата Сообщение от Umar Egamberdie Посмотреть сообщение
а так я знаю delphi, pascal abc, arduino ide. и.т.п и немножко с++,
ну значит легче будет изучить, Си все таки родственник плюсам
кстати в Келе можешь писать и на плюсах
достаточно в свойствах проекта на вкладке C/C++ в окошке Misk Controls написать --cpp
0
2 / 2 / 3
Регистрация: 20.12.2015
Сообщений: 336
28.03.2016, 00:08  [ТС] 10
Цитата Сообщение от ValeryS Посмотреть сообщение
для работы с библиотеками это в принципе без разницы, библиотеки скрывают низкий уровень( регистры. наименования битов)
библиотеки у них разные же и мне сложно переделать их в стм32ф051 если не сложно можешь л/с скинуть свой вк если не против.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,520
28.03.2016, 07:09 11
Цитата Сообщение от Umar Egamberdie Посмотреть сообщение
сли не сложно можешь л/с скинуть свой вк если не против.
напоминаю правила форума п 4.6
Обсуждение вопросов - только в теме на форуме. Приглашения к обсуждению еще где-либо (в том числе и с помощью системы личных сообщений) запрещены, за исключением коммерческих разделов.
От себя добавлю, это в твоих интересах, придет другой пользователь, более грамотный, который лучше знает 051 серию, и что то скажет, а так ты лишаешься этой возможности.

Цитата Сообщение от Umar Egamberdie Посмотреть сообщение
библиотеки у них разные же и мне сложно переделать их в стм32ф051
я тоже не работал с stm32f051, лежат несколько штук ждут своего часа
давай попробуем вместе, с нуля так сказать
для начала приведи ТЗ
0
2 / 2 / 3
Регистрация: 20.12.2015
Сообщений: 336
28.03.2016, 10:00  [ТС] 12
понятно,
Цитата Сообщение от ValeryS Посмотреть сообщение
даже если выбросишь слово extern, программа скомпилируется но ничего делать не будет
а могу продолжение кода написать, просто на main, если все это тактирование и.т.п
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,520
28.03.2016, 10:56 13
Цитата Сообщение от Umar Egamberdie Посмотреть сообщение
а могу продолжение кода написать, просто на main,
можешь
но сначала определись что ты сделал, и что нужно сделать
у тебя DMA вызывает прерывание после заполнения половины буфера и после заполнения полностью буфера
выставляется флаг
а дальше?
что с этим буфером делать? для чего нужен флаг?
1
2 / 2 / 3
Регистрация: 20.12.2015
Сообщений: 336
28.03.2016, 17:32  [ТС] 14
Ну данной момент у меня осваивание программы keil uvision. Я освоил мигание светодиодом, передача и прием данных по USORT. Вот теперь осваиваю ADC(АЦП), ну как я понимаю уже тактировал порты для АЦП, теперь надо какой-то действию задать что бы посмотреть как работает АЦП. А как это делать немножко я не понимаю что писать в main.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,520
28.03.2016, 19:40 15
Цитата Сообщение от Umar Egamberdie Посмотреть сообщение
у меня осваивание программы keil uvision.
не путай осваивания камня, и среды программирования
Цитата Сообщение от Umar Egamberdie Посмотреть сообщение
Я освоил мигание светодиодом, передача и прием данных по USORT.
это все камень,читай микроконтроллер, к кеилу это имеет опосредованное отношение, с тем же успехом мог писать и на IAR, тот же Витальич зело в нем петрит
а на кеиле мог писать и под 0х51, что я делал с успехом некоторое время назад
Цитата Сообщение от Umar Egamberdie Посмотреть сообщение
немножко я не понимаю что писать в main.
так и я не понимаю ибо не знаю задачу
есть программы где в главном цикле вообще нет ничего, все решается на прерываниях
0
2 / 2 / 3
Регистрация: 20.12.2015
Сообщений: 336
28.03.2016, 20:34  [ТС] 16
Цитата Сообщение от ValeryS Посмотреть сообщение
не путай осваивания камня, и среды программирования
мне надо и камень освоить и среду программирование
Цитата Сообщение от ValeryS Посмотреть сообщение
так и я не понимаю ибо не знаю задачу
задача такая запустить АЦП на среде keil uvision и понять как оно работает.
0
2 / 2 / 3
Регистрация: 20.12.2015
Сообщений: 336
30.03.2016, 12:45  [ТС] 17
C
1
extern volatile uint8_t f_adcsample;
ребята помогите что это за код от куда оно взялась нигде не нашел можно ли его заменить с другим кодом
0
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
30.03.2016, 14:22 18
Цитата Сообщение от Umar Egamberdie Посмотреть сообщение
можно ли его заменить с другим кодом
смотря для чего...
f_adcsample, судя по названию, должен принимать замеры от АЦП. Соответственно, он должен быть объявлен глобальной переменной где-нить в проекте, в любой удобном месте. Если именно это место для вас удобное - уберите extern и будет вам счастье.
0
2 / 2 / 3
Регистрация: 20.12.2015
Сообщений: 336
30.03.2016, 16:28  [ТС] 19
Ребята помогите пожалуйста. На среде Keil Uvision надо записать код для , а камень для него stm32f051. У меня не получается.
0
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
30.03.2016, 16:42 20
Так выкладывайте код и спрашиваете.
0
30.03.2016, 16:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.03.2016, 16:42
Помогаю со студенческими работами здесь

ADC->DMA->SDIO (или NAND через FSMC) без остановки в обработчике прерываний DMA на STM32F407VG, реально или нет?
Добрый день. Столкнулся с необходимостью писать большой объём данных АЦП с высокой скоростью....

ADC +DMA
может кому то понадобится буфер приема данных необходимо выравнивать по 32х битному типу

ADC+DMA+TIMER
Эта тема уже подымалась на форме, но все используют стандартную библиотеку, а я пытаюсь это...

STM32F0 ADC+DMA
Есть кто-то кто программировал АЦП с несколькими каналами STM32F0? Я настроил АЦП с DMA что бы...

STM32f413zh DMA ADC
Добрый день. Пробую осилить DMA+ADC на плате Nucleo-stm32f413zh. Проект сгенерирован Cube32MX, ...

ADC + DMA +TIM
Добрый вечер. Есть таймер которым я генерю ШИМ таймер TIM_TimeBaseStructure.TIM_Pressotir = 0;...

stm32f4 + ADC + DMA
Доброго времени суток. Вопрос такой... Сделал АЦП на плате ф4дискавери, и получается что когда...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru