MyBB Pro

P30-ART


تبلیغات


ارسال موضوع ارسال پاسخ
آموزش میکرو STM32F10X
مهمان گرامی، خوش آمدید!
نام کاربری
گذرواژه‌
[عضویت در انجمن]


جستجوی انجمن‌ها

(جستجوی پیشرفته)

جستجو در گوگل

Google



در اين سايت


درنا بلاگ

سرویس بلاگدهی درنا بلاگ
http://dornablog.com

تبلیغات

آمار انجمن
» اعضا: 3638
» آخرین عضو: alyssarf18
» موضوع‌های انجمن: 159
» ارسال‌های انجمن: 910

آمار کامل

ارسال: #1
۱۳۹۳/۱۲/۲۸, ۱۱:۰۶ عصر
آموزش میکرو STM32F10X

سری STM32F1X خودش دارای زیر شاخه های 101 ، 103 ، 105 و 107 است و هر کدام از این شاخه ها دارای امکانات خاص خود هستند .

Low-density devices are STM32F101xx, STM32F102xx and STM32F103xx
microcontrollers where the Flash memory density ranges between 16 and 32 Kbytes.

Medium-density devices are STM32F101xx, STM32F102xx and STM32F103xx
microcontrollers where the Flash memory density ranges between 64 and 128 Kbytes.

High-density devices are STM32F101xx and STM32F103xx microcontrollers where the
Flash memory density ranges between 256 and 512 Kbytes.

XL-density devices are STM32F101xx and STM32F103xx microcontrollers where the
Flash memory density ranges between 768 Kbytes and 1 Mbyte.

Connectivity line devices are STM32F105xx and STM32F107xx microcontrollers.
بنابراین این میکرویی که ما استفاده می کنیم (stm32f103rbt6) جزو سری Medium-density این محصول است.حالا این رو برای این گفتم که هم این دیتاشیت و هم کتابخانه های CMSIS برای کل سری STM32F1XX نوشته شدند و ما باید اون قسمت و رجیستر های مربوط به Medium-density رو فقط استفاده کنیم .

Manual هم هر قسمتش اول اومده یسری توضیحات در حالات سخت افزاری و نام رجیسترها داده و در آخر اومده تمام رجیسترها رو با ریزشون بصورت جدول رسم کرده .

حالا با این حساب دو تا بخش معرفی واحد RCC تو Manual می بینید . اولی نوشته برای Low , Medium , High, XL density و اون یکی نوشته برایConnectivity line . خوب مشخصه که ما با اولی ار داریم . سری Connectivity line اینقدر مفصله که چند تا PLL داره !

معمولا هم میکرویی که اسیلاتور داخلی داره و خب می دونید دیگه که اسیلاتور داخلی RC زیاد پایداری نداره و بنابه شرایط دما و ولتاژ ممکنه تغییر کنه و در کار سایر قسمت ها خلل وارد کنه میان و یه رجیستر برای کالیبره کردن این اسیلاتور قرار میدن .حالا این رجیستر HSICAL در واقع همون تنظیم کارخانه هست که فقط خواندنی هست . ولی User هم میتونه با عوض کردن مقدار HSITRIM در زمان از کالیبره خارج شدن اسیلاتور مقادیری رو به مقدار رفرنس اصلی (HSICAL ) اضافه کنه .

در مورد آخری هم بگم که همه این رجیستر ها اگر نوشتنی باشن به صورت GPIOB->ODR=0x0001 و اگه خوندنی باشن بصورت i = GPIOB->ODR نوشته میشند. این ظور نیست که هر کدام به یک صورت خاص باشه !

این علامت <- هم که می بینید از علایم استاندارد زبان C هست . چون این رجیستر ها بصورت Structure نوشته شدن . برای دسترسی به Structure هم از این علامت استفاده میکنند . نظیر این علامت <- یا :: رو می تونید تو هر جا مثل برنامه های ویژوال C کامپیوتر ببینید . در مورد مقداردهی به رجیستر هم که بستگی به این که چند بیتی هست 16 یا 32 ... متفاوته . مثلا 0x0283 برای یک رجیستر 16 بیتی هست و 0x1c2304b3 برای یک رجیستر 32 بیتی .
نقل قول این ارسال در یک پاسخ بازگشت به بالا
 سپاس شده توسط behnam
تبلیغات
ارسال: #2
۱۳۹۳/۱۲/۲۸, ۱۱:۱۱ عصر
RE: آموزش میکرو STM32F10X

توضیحات حالات نمونه برداری ADC

در Single conversion همون طور که از اسمش پیداست تنها یک نمونه گرفته میشه .

Continuous conversion در واقع همون مورد قبل هست که در زماهای مشخصی یک پالس adc رو تحریک می کنه و نمونه میگیره . یعنی در زمانهای مشخص نمونه میگیره ، پشت سر هم .

در Scan mode یک گروه ار کانالهای انتخاب میشه و سپس با فرمان ما یک اسکن از این کانالها صورت میگیره . یعنی چند کانالی که انتخاب شده با هم نمونه برداری می کنن . مثلا شما می خاین از 4 تا سنسور هر 1 ثانیه مقدار بگیرید . این چهار کانال رو انتخاب می کنید و سپس هر بار با صدور فرمان این چهار کانال رو اسکن می کنید .

Regular group و Injected group در واقع دو نوع سازماندهی کانالهاست . برای هر حالتی از کانالها که بخواهیم استفاده کنیم باید از رجیسترهای متفاوتی استفاده کنیم . 16 کانال با نمونه برداری Regular و 4 کانال با نمونه برداری Injected داریم . کانالهای مورد نظر رو انتخاب می کنیم و به ترتیب مورد نظر ما مثلا 2 تا 2 تا نمونه میگیره . یسری قوانین خاص داره و در حالت injected نیاز به تحریک برای ادامه نمونه برداری داره .

Triggered injection و Auto-injection هم دونوع تحریک کانال adc برای نمونه برداری هست . یکی به تحریک خارجی احتیاج داره ولی اون یکی خودکار هست .

تو کاربرد ، کارایی این حالتها بیشتر مشخص میشه .
نقل قول این ارسال در یک پاسخ بازگشت به بالا
ارسال: #3
۱۳۹۳/۱۲/۲۸, ۱۱:۱۳ عصر
RE: آموزش میکرو STM32F10X

Clock security system یا CSS از امکانات جالب این میکرو هست که برای شرایط بدی که ممکنه برای میکرو بوجود بیاد کمک شایانی می کنه . اگر این سیستم سخت افزاری که Clock Detector نام داره فعال بشه کلاک سیستم رو زیر نظر می گیره و در صورت بروز مشکل مثل مختل شدن ، از کار افتادن و ... برای کلاک خارجی تمام عملیات جاری رو رها کرده و یک اینتراپت از نوع مسک ناپذیر یا NMI بنام Clock interrupt ایجاد می کنه . در روتین این اینتراپت میشه آخرین کارهای ممکنه برای نجات اطلاعات و اعمال فرمان اضطراری رو انجام داد .

**مهم :
1- این سیستم برای نظارت بر اسیلاتور HSE (خارجی) بصورت مستقیم یا غیر مستقیم است . غیر مستقیم یعنی PLL اگر از HSE استفاده کنه .
2- در صورت مختل شدن کلاک خارجی منبع کلاک روی HSI (داخلی) سوییچ می کنه !!!!!

If the HSE oscillator is used directly or indirectly as the system clock (indirectly means: it is
used as PLL input clock, and the PLL clock is used as system clock), a detected failure
causes a switch of the system clock to the HSI oscillator and the disabling of the HSE
oscillator. If the HSE clock (divided or not) is the clock entry of the PLL used as system clock
when the failure occurs, the PLL is disabled too
نقل قول این ارسال در یک پاسخ بازگشت به بالا
ارسال: #4
۱۳۹۳/۱۲/۲۸, ۱۱:۱۴ عصر
RE: آموزش میکرو STM32F10X

باس ها در سری STM32

در سری stm32 دو باس پیشرفته وجود داره . یکی APB1 و دیگری APB2 . اولی نهایت سرعتش 36MHz هست و دومی 72MHz . مثلا GPIO که نیاز به سرعت بالا داره به APB2 وصله .تایمر ها و USART مثلا به APB1 وصله . حالا Pre1 تقسیم کلاک برای APB1 هست و Pre2 برای APB2 . اسم کلاک این باس ها هم به ترتیب PCLK1 وPCLK2 هست .
PLLXTPRE هم یه تقسیم کننده هست بین خروجی اسیلاتور خارجی HSE و ورودی PLL که میتونه کلاک رو تقسیم بر 1 یا 2 کنه . برای تنظیم محاسبات کلاک و همانند سازی با ورودی کلاک HSI . چون تو HSI فقط تقسیم بر 2 داشتیم .

به APB1 باس سرعت پایین و به APB2 باس سرعت بالا میگن .
نقل قول این ارسال در یک پاسخ بازگشت به بالا
ارسال: #5
۱۳۹۳/۱۲/۲۸, ۱۱:۱۷ عصر
RE: آموزش میکرو STM32F10X

تشریح چند بیت مربوط به Clock Security

این رجیستر ، همون رجیستری هست که در صورت تغییر کردن وضع کلاک های مورد نظر سیستم فعال میشه . مربوط به همون قسمت Clock Security هست . در واقع شما وضعیت OK بودن هر کدام از این اسیلاتور ها رو می تونید از بیت 0 تا 4 این رجیستر که فقط خواندنی هم هست ببینید . در صورت تغییر وضعیت هر کدام از اینها باید فلگ رو پاک کنیم تا برای دفعه بعد آماده به کار بشه و این امر با مقدار دهی به بیت 16 تا 20 محقق میشه . بیت 8 تا 12 هم مربوط به فعال یا غیر فعال کردن اینتراپت هایی هست که در صورت تغییر وضعیت اسیلاتورها به روتین مورد نظر پرش کنه . تنظیمات این اینتراپت در بخش Interrupts and Events صورت می گیره که جزو بالاترین اولویت (2-) و از نوع Non Maskable است . و خود CSSF و CSSC مخصوص حالت مختل شدن اسیلاتور خارجی سرعت بالا HSE هست .
نقل قول این ارسال در یک پاسخ بازگشت به بالا
تبلیغات
ارسال: #6
۱۳۹۳/۱۲/۲۸, ۱۱:۲۶ عصر
RE: آموزش میکرو STM32F10X

چگونگی ارتباط توابع رجیستری و CMSIS با CPU

خب ، یه مثال ساده میزنم که چطور کتابخانه cmsis به پین ها برای set یا reset کردن دسترسی پیدا میکنه ( با تبعیت از Reference Manual .

همه ما می دونیم که رجیستر های میکرو در واقع مکانهایی در حافظه RAM هستند که برای دسترسی به اونها باید طبق جدول ارائه شده توسط کمپانی ، مقادیر یا تنظیمات مورد نظر مون رو در اون آدرس باید بنویسیم یا ازش بخونیم . کنترلر یا cpu هم برای انجام کارش به اون آدرس مراجعه می کنه و مقادیر ما رو پردازش می کنه .

همون طور که قبلا گفتم این میکرو دارای دو باس برای امکانات محیطی یا Peripheral است . که به APB1 باس سرعت پایین و به APB2 باس سرعت بالا می گن . طبیعیه که در بانک رجیستر ها برای ورود به این باس ها آدرسهای جداگانه قرار دادند . حال ما قراره بریم روی باس 2 . چرا ؟ چون واحد GPIO که ما باهاش کار داریم روی باس 2 قرار داره . طبق دیاگرام Manual . پس باید ببینیم آدرس این باس چنده ؟! حالا اگه فایل stm32f10x.h رو باز کنیم مشاهده می کنیم که داخلش آدرس تمامی باس ها و رجیسترها و .. رو نوشته - اینم اول بگم که این فایل هدر برای کل سری stm32f10x نوشته شده . پس اگه داخلش رجیسترهایی مثل can2, ethernet , dac, timer14, .... دیدید تعجب نکنید اونا برای مدل های دیگه هستند -


خب . حالا می خایم از گذرگاه AHB که شروع ورود به امکانات محیطی میکرو هست به سمت مقصد نهایی که GPIO هست حرکت کنیم . عبارت
کد:

کد php:
#define PERIPH_BASE           ((uint32_t)0x40000000) 

رو داخل این هدر پیدا کنید . پس مشخص شد که آدرس باس AHB در بانک رجیستر مقدار فوق هست . خب این باس به دو شاخه APB1,APB2 تقسیم میشه . حالا عبارت
کد:

کد php:
#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000) 

رو پیدا کنید . این میرسونه که اگه از بانک رجیستر AHB به اندازه 0x10000 بریم جلو به محدوده APB2 وارد میشیم . این عدد رو میتونید با آدرسهای جدول بالا مقایسه کنید . عدد قبلی با عدد فعلی جمع شده و عبارت 0x4001xxx بینشون مشترکه . حالا یه مرحله جلوتر میریم . مثلا وارد GPIOA میشیم . عبارت
کد:

کد php:
#define GPIOA_BASE            (APB2PERIPH_BASE + 0x0800) 

v رو پیدا کنید . حالا اگر نتیجه رو با جدول بالا مقایسه کنید معلوم میشه که آدرس شروع واحد GPIOA عدد 0x40010800هست که از جمع مقادیر از ابتدا تا اینجا بدست اومد . عبارت
کد:

کد php:
#define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE) 

رو هم مشاهده کنید . حالا تازه وارد محدوده GPIOA شدیم و می تونیم به رجیسترهای اون دسترسی داشته باشیم .




این جدول و رجیسترهای اون برای پورت های دیگه GPIO تکرار میشه . فقط باید بیس آدرس ما عدد بدست اومده باشه و با افست دادن به اون عدد (اضافه کردن عدد های سمت چپ جدول متناظر با هر رجیستر میتونیم به رجیستر مربوطه دسترسی داشته باشیم . مثلا آدرس مطلق دسترسی به این هفت رجیستر برای GPIOA به ترتیب برابر :

0X40010818 - 0X40010814-0X40010810-0X4001080C-0X40010808-0X40010804-0X40010800

هست . حالا با رفتن به این آدرس میشه 32 بیت داخلش نوشت یا خواند . بعضی جاهاش هم که رزرو هست . تو کتابخانه دنبال عبارت :
کد:

کد php:
typedef struct
{
  
__IO uint32_t CRL;
  
__IO uint32_t CRH;
  
__IO uint32_t IDR;
  
__IO uint32_t ODR;
  
__IO uint32_t BSRR;
  
__IO uint32_t BRR;
  
__IO uint32_t LCKR;
GPIO_TypeDef

بگردید . در اینجا اومدن این جدول رو بصورت یک ساختار یا STRUCTURE تعریف کردن و عناصر این جدول رو هم همانند manual جاگذاری کردند . این ساختار یک جدول رو روی حافظه تشکیل میده به این شکل عمل میکنه که وقتی به نام ساختار که GPIO_TypeDef هست یه آدرس نسبت بدیم ( در اینجا آدرس GPIOA=0x40010800) از این آدرس میاد و 7 رجیستر 32 بیتی رو تو حافظه میچینه . حالا ما خیلی راحت میتونیم با فراخوانی اسم ساختار و یکی از اعضای اون بشکل زیر یه مقدار مثلا تو رجیستر BSRR بنویسیم :
کد php:
GPIOA->BSRR=0x00000001 

از این به بعد دیگه کتابخانه مخصوص stm32f10x_gpio.c و هدرش stm32f10x_gpio.h وارد کار میشه . تعریفهای پین 0 تا 15 فقط در واقع مقدار 1 دادن به بیتهای 0و1و... است و فرقی با نوشتن عدد نمی کنه . حالا اگه یک تابع مثلا
کد:

کد php:
void GPIO_SetBits(GPIO_TypeDefGPIOxuint16_t GPIO_Pin

رو نگاه کنیم میبینیم که اونم از همین راه رفته و راه دیگه ای در واقع نیست .
یه عکس هم براتون میزارم که مقدار پورت رو تو رجیستر ODR در آدرس حافظه مورد نظر بوسیله ابزار Memory در Keil نشون میده .


.jpg  1.jpg (اندازه: 87.21 KB / تعداد دفعات دریافت: 95)

پس معلوم شد چیزی که مهمه آدرس رجیستر هست و همون طوری که می دونیم اسامی فقط نام گذاری ما هستن . حالا تو manual مثلا نوشته GPIOx_ODR و تو کتابخانه به یه طریقی دیگه (structure) و اسمی دیگه .... مهم اینه که آدرس ها با هم میخونه .
نقل قول این ارسال در یک پاسخ بازگشت به بالا
ارسال: #7
۱۳۹۳/۱۲/۲۸, ۱۱:۲۸ عصر
RE: آموزش میکرو STM32F10X

Alternate Function در واقع کارهایی هست که یک پین بجز GPIO میتونه انجام بده . مثل اتصال پین بعنوان پایه TX واحد سریال . در واقع وظیفه فرعی و ثانوی یک پین بجز GPIO . اگر واحد سریال رو پیکربندی کنیم باید پین TX میکرو رو دیگه با GPIO تعریف نکنیم با AFIO از داخل به TX وصلش کنیم .
نقل قول این ارسال در یک پاسخ بازگشت به بالا
ارسال: #8
۱۳۹۳/۱۲/۲۸, ۱۱:۳۱ عصر
RE: آموزش میکرو STM32F10X

رجیستر های فعال و ریست کردن واحد RCC

رجیستر
کد:

کد php:
AHB Peripheral Clock enable register (RCC_AHBENR

و همچنین
کد:

کد php:
APB2 peripheral clock enable register (RCC_APB2ENR

و
کد:

کد php:
APB1 peripheral clock enable register (RCC_APB1ENR

به ترتیب برای فعال کردن کلاک ادوات متصل شده به باس اصلی - باس 2 و باس 1 هست .
همچنین اینا یه رجیستر RCC_APB2RSTR و RCC_APB1RSTR هم دارن که برای ریست تنظیمات کلاک و بازگرداندن به حالت اولیه مورد استفاده قرار می گیره .
نقل قول این ارسال در یک پاسخ بازگشت به بالا
ارسال: #9
۱۳۹۳/۱۲/۲۸, ۱۱:۳۶ عصر
RE: آموزش میکرو STM32F10X

توضیحات اولیه GPIO با کتابخونه CMSIS

اين ميكرو شامل سه پورت A,B و ‍ C هستش. يكي از نكات جالب توجه در مورد بيت هاي اين ميكرو اين هستش كه شما ميتنونيد براي هر پين يه وظيفه خاص تعريف كنيد.
اين وظايف شامل تعريف جداگانه براي هر پين(مثلا پين شماره 9 پورت A كه همون PA.9 ميشه) به عنوان ورودي يا خروجي معمولي.

يا فعال كردن وظيفه ديگر(خاص) اين پين( فعال كردن USART1 و تعريف پين شماره 9 پورت A به عنوان خروجي داده يا همون Tx).

من به طور مثال يه بار اين پين رو به صورت معمولي و يه بار به صورت خاص تعريف ميكنم.
تو فايل هاي كتابخونه، فايلي به اسم stm32f10x_gpio.c وجود داره كه توابع مربوط به تنظيم پورت ها تو اون تعريف شدن.
اسم اين تابع اين هستش.

کد php:
void GPIO_Init(GPIO_TypeDefGPIOxGPIO_InitTypeDefGPIO_InitStruct

براي استفاده از اون ابتدا بايد پورتمون رو براش تعريف كنيد. كه در اينجا چون پورت A رو انتخاب كرديم پس براي پارامتر اول اين تابع، GPIOA رو انتخاب ميكنيم. پس فعلا اينو مينويسيم:

کد php:
GPIO_Init(GPIOA,........); 

چون پارامتر دوم از نوع ساختاري هستش پس دوباره به فايل stm32f10x_gpio.c رجوع ميكنيم. در قسمت توضيحات تابع اومده كه: اين قسمت به ساختار GPIO_InitTypeDef اشاره ميكنه و شامل اطلاعات مربوط به راه اندازي پورت مورد نظر است.
در مورد چگونگي تعريف شدن ساختار GPIO_InitTypeDef ميتونيد ان رو در فايل stm32f10x_gpio.h پيدا كنيد كه من در زير آوردم.

کد php:
typedef struct
{
uint16_t GPIO_Pin/*!< Specifies the GPIO pins to be configured.
This parameter can be any value of @ref GPIO_pins_define */

GPIOSpeed_TypeDef GPIO_Speed/*!< Specifies the speed for the selected pins.
This parameter can be a value of @ref GPIOSpeed_TypeDef */

GPIOMode_TypeDef GPIO_Mode/*!< Specifies the operating mode for the selected pins.
This parameter can be a value of @ref GPIOMode_TypeDef */
}GPIO_InitTypeDef
نقل قول این ارسال در یک پاسخ بازگشت به بالا
تبلیغات
ارسال: #10
۱۳۹۳/۱۲/۲۸, ۱۱:۳۹ عصر
RE: آموزش میکرو STM32F10X

در تعريف ساختار GPIO_InitTypeDef ، ما با سه تا زير ساختار(نميدونم درست عنوان كردم؟ يا نه؟) برخورد ميكنيم.

1- GPIO_Pin:براي تعريف پين مورد نظر هستش. در ادامه گفته شده كه اين پارامتر ميتونه هر كدوم از
مقاديري كه تو قسمت زير تعريف شدن رو بپذيره.

کد php:
/** @defgroup GPIO_pins_define
* @{
*/

#define GPIO_Pin_0 ((uint16_t)0x0001) /*!< Pin 0 selected */
#define GPIO_Pin_1 ((uint16_t)0x0002) /*!< Pin 1 selected */
#define GPIO_Pin_2 ((uint16_t)0x0004) /*!< Pin 2 selected */
#define GPIO_Pin_3 ((uint16_t)0x0008) /*!< Pin 3 selected */
#define GPIO_Pin_4 ((uint16_t)0x0010) /*!< Pin 4 selected */
#define GPIO_Pin_5 ((uint16_t)0x0020) /*!< Pin 5 selected */
#define GPIO_Pin_6 ((uint16_t)0x0040) /*!< Pin 6 selected */
#define GPIO_Pin_7 ((uint16_t)0x0080) /*!< Pin 7 selected */
#define GPIO_Pin_8 ((uint16_t)0x0100) /*!< Pin 8 selected */
#define GPIO_Pin_9 ((uint16_t)0x0200) /*!< Pin 9 selected */
#define GPIO_Pin_10 ((uint16_t)0x0400) /*!< Pin 10 selected */
#define GPIO_Pin_11 ((uint16_t)0x0800) /*!< Pin 11 selected */
#define GPIO_Pin_12 ((uint16_t)0x1000) /*!< Pin 12 selected */
#define GPIO_Pin_13 ((uint16_t)0x2000) /*!< Pin 13 selected */
#define GPIO_Pin_14 ((uint16_t)0x4000) /*!< Pin 14 selected */
#define GPIO_Pin_15 ((uint16_t)0x8000) /*!< Pin 15 selected */
#define GPIO_Pin_All ((uint16_t)0xFFFF) /*!< All pins selected */ 

2- GPIO_Speed : براي تعيين سرعت پين مورد نظر به كار ميره. در ادامه عنوان شده كه اين پارامتر ميتونه هر يك از
مقاديري كه تو قسمت زير آورده شده رو بپذيره.

کد php:
typedef enum
{
GPIO_Speed_10MHz 1,
GPIO_Speed_2MHz,
GPIO_Speed_50MHz
}GPIOSpeed_TypeDef

3- GPIO_Mode: جهت تعيين وضعيت پين مورد نظر به حالت ورودي يا خروجي به كار ميره. در ادامه ذكر شده اين پارامتر
هر كدوم از مقادير زير رو بپذيره.

کد php:
typedef enum
GPIO_Mode_AIN 0x0,
GPIO_Mode_IN_FLOATING 0x04,
GPIO_Mode_IPD 0x28,
GPIO_Mode_IPU 0x48,
GPIO_Mode_Out_OD 0x14,
GPIO_Mode_Out_PP 0x10,
GPIO_Mode_AF_OD 0x1C,
GPIO_Mode_AF_PP 0x18
}GPIOMode_TypeDef
نقل قول این ارسال در یک پاسخ بازگشت به بالا
ارسال موضوع ارسال پاسخ


موضوع‌های مرتبط با این موضوع...
موضوع: نویسنده پاسخ بازدید: آخرین ارسال
  اطلاعات حافظه میکرو siamak 0 2,838 ۱۳۹۴/۲/۱۴ ۱۱:۰۴ صبح
آخرین ارسال: siamak
  آموزش ساخت پروژه با توابع cmsis siamak 0 5,374 ۱۳۹۳/۱۲/۲۸ ۰۸:۲۸ عصر
آخرین ارسال: siamak

پرش به انجمن:


کاربرانِ درحال بازدید از این موضوع: 1 مهمان