سیسوگ در قسمت بیستم و یکم آموزش میکروکنترلر STM8 ارتباطات این میکروکنترلر با دنیای بیرون را به صورت اجمالی مورد بررسی قرار داد و قصد دارد در هر قسمت به یکی از رابط های ارتباطی بپردازد. در این از قسمت آموزش میکروکنترلر STM8 رابط سریال ( UART ) را بررسی میکند. با سیسوگ همراه باشید.
رابط سریال ( UART )
شاید ارتباط سریال یکی از روش های ارتباطی کلاسیک برای ارتباط بین کامپیوتر یا سایر دستگاه ها با میکروکنترلر باشد. تنها با استفاده از دو سیم، میتوانیم یک ارتباط نقطه به نقطه دو طرفه را بدست آوریم. به دلیل سادگی و استفاده گسترده از آن، نقش مهمی در زمینه رابط ارتباطی دارد، به طوری که با مودمهای GSM ، ماژول RF ، دستگاههای بلوتوث مانند RN-52 ، دستگاههای Wi-Fi مانند ESP8266 و غیره استفاده میشود. همچنین استفاده گستردهای در صنایع دارد. ارتباطات دیگر مانند RS-485، LIN و غیره به آن متکی هستند.
اکثر STM8 ها حداقل دارای یک ماژول UART هستند و برخی از آنها بیش از یک ماژول UART دارند. UART های مختلف دارای ویژگی های مختلفی هستند که در جدول زیر نشان داده شده است:
برای کسب اطلاعات بیشتر در مورد UART، به لینک آن مراجعه نمایید.
UART های میکروکنترلر STM8 دارای ویژگیهای بسیاری است که در این مقاله امکان توضیح تمام ویژگیها وجود ندارد. در اینجا تنها ارتباط سریالی را بررسی میکنیم. LIN و IRDA را در مقالات بعدی پوشش میدهیم.
اتصالات سخت افزاری:
نمونه کد UART :
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 | #include "STM8S.h" #include "STM8S_lcd.h" unsigned int overflow_count = 0; unsigned long pulse_ticks = 0; unsigned long start_time = 0; unsigned long end_time = 0; void clock_setup(void); void GPIO_setup(void); void UART1_setup(void); void main(void) { unsigned char i = 0; char ch = 0; clock_setup(); GPIO_setup(); UART1_setup(); LCD_init(); LCD_clear_home(); LCD_goto(0, 0); LCD_putstr("TX:"); LCD_goto(0, 1); LCD_putstr("RX:"); while(TRUE) { if(UART1_GetFlagStatus(UART1_FLAG_RXNE) == TRUE) { ch = UART1_ReceiveData8(); LCD_goto(7, 1); LCD_putchar(ch); UART1_ClearFlag(UART1_FLAG_RXNE); UART1_SendData8(i + 0x30); } if(UART1_GetFlagStatus(UART1_FLAG_TXE) == FALSE) { LCD_goto(7, 0); LCD_putchar(i + 0x30); i++; } }; } void clock_setup(void) { CLK_DeInit(); CLK_HSECmd(DISABLE); CLK_LSICmd(DISABLE); CLK_HSICmd(ENABLE); while(CLK_GetFlagStatus(CLK_FLAG_HSIRDY) == FALSE); CLK_ClockSwitchCmd(ENABLE); CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV8); CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1); CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSI, DISABLE, CLK_CURRENTCLOCKSTATE_ENABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C, DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_SPI, DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_ADC, DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_AWU, DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_UART1, ENABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER1, DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER2, DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER4, DISABLE); } void GPIO_setup(void) { GPIO_DeInit(GPIOD); GPIO_Init(GPIOD, GPIO_PIN_5, GPIO_MODE_OUT_PP_HIGH_FAST); GPIO_Init(GPIOD, GPIO_PIN_6, GPIO_MODE_IN_PU_NO_IT); } void UART1_setup(void) { UART1_DeInit(); UART1_Init(9600, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE); UART1_Cmd(ENABLE); } |
توضیحات:
کلاک داخلی و کلاک CPU روی 2 مگاهرتز تنظیم می شوند.
1 2 3 4 5 | CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV8); CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1); …. …. CLK_PeripheralClockConfig(CLK_PERIPHERAL_UART1, ENABLE); |
پین های TX-RX به ترتیب خروجی و ورودی تعریف میشوند:
1 2 3 4 | GPIO_DeInit(GPIOD); GPIO_Init(GPIOD, GPIO_PIN_5, GPIO_MODE_OUT_PP_HIGH_FAST); GPIO_Init(GPIOD, GPIO_PIN_6, GPIO_MODE_IN_PU_NO_IT); |
راه اندازی UART خیلی ساده است. به راحتی میتوانید نرخ باند و بیت ونوع ارتباط (سنکرون و آسنکرون) و … را تنظیم کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 | void UART1_setup(void) { UART1_DeInit(); UART1_Init(9600, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE); UART1_Cmd(ENABLE); } |
در کد اصلی، هر دو پرچم تکمیل ارسال و تکمیل دریافت را بررسی میکنیم. با استفاده از این پرچمها متوجه میشویم داده جدیدی وارد شده است، همچنین امکان ارسال داده جدید را متوجه میشویم.
در قسمت اول، دریافت دادههای جدید بررسی میشود. به همین دلیل وضعیت “IF” بررسی میشود که آیا بافر RX خالی است یا نه. اگر خالی نیست،باید اطلاعات جدید دریافت شود. دادههای جدید (در اینجا کاراکترها) دریافت شده و بر روی LCD نمایش داده میشوند. سپس با استفاده از بافر RX پرچم خالی را روشن میکنیم تا امکان پذیرش دادههای جدید را فعال کنیم. سپس برخی از دادهها را از طریق UART به کامپیوتر میزبان ارسال میکنیم.
1 2 3 4 5 6 7 8 | if(UART1_GetFlagStatus(UART1_FLAG_RXNE) == TRUE) { ch = UART1_ReceiveData8(); LCD_goto(7, 1); LCD_putchar(ch); UART1_ClearFlag(UART1_FLAG_RXNE); UART1_SendData8(i + 0x30); } |
در قسمت دوم کد UART ، بررسی می کنیم آیا آخرین اطلاعات از STM8 به کامپیوتر ارسال شده است. اطلاعات ارسال شده در LCD نمایش داده میشود.
1 2 3 4 5 6 | if(UART1_GetFlagStatus(UART1_FLAG_TXE) == FALSE) { LCD_goto(7, 0); LCD_putchar(i + 0x30); i++; } |
لطفا توجه داشته باشید هر دو پرچم بسیار مهم هستند.
در این قسمت به رابط سریال ( UART ) پرداختیم. در قسمت بیست و سوم آموزش میکروکنترلر STM8 به رابط کاربری سریال (SPI) میپردازیم. با سیسوگ همراه باشید.
لینکهای دانلود
مطالب مرتبط
- قسمت اول − میکروکنترلر STM8 چیست و از کجا آمده است؟
- قسمت دوم − معرفی بردهای Discovery میکروکنترلر STM8
- قسمت سوم − کامپایلر و پروگرامر
- قسمت چهارم − STM8CubeMX
- قسمت پنجم − آماده سازی ابزارهای نرمافزاری برای STM8
- قسمت ششم − چگونه برنامه خود را روی STM8 آپلود کنیم؟
- قسمت هفتم− LED چشمکزن
- قسمت هشتم − کلاک سیستم (CLK)
- قسمت نهم − وقفه خارجی (EXTI)
- قسمت دهم − Beeper
- قسمت یازدهم − LCD کاراکتری
- قسمت دوازدهم − مبدل آنالوگ به دیجیتال (ADC)
- قسمت سیزدهم − تایمر نگهبان آنالوگ (AWD)
- قسمت چهادهم − تایمر نگهبان (IWDG)
- قسمت پانزدهم − تایمر نگهبان محدوده ای (WWDG)
- قسمت شانزدهم− اصول اولیه تایمرها
- قسمت هفدهم− تایمر 2
- قسمت هجدهم −تایمر 4
- قسمت نوزدهم −PWM
- قسمت بیستم − PWM تایمر 1
- قسمت بیست و یکم − بررسی اجمالی ارتباطات
- قسمت بیست و سوم − رابط کاربری سریال (SPI)
- قسمت بیست و چهارم − رابط I2C
- دوره رایگان آموزش میکروکنترلر STM8 – سیسوگ
سلام وقت بخیر
چرا به اطلاعاتی که قرار است ارسال شود 0x30 اضافه میکنید؟
سلام دوست عزیز در واقع 0x30 کد هگز کارکتر ‘0’ است 🙂
برای این که عدد دسیمال بین ۰ تا ۹ رو به کارکتر معادل اون در تیبل اسکی تبدیل کنیم میتونیم از این تریک استفاده کنیم
به جدول اسکی نگاه کنید متوجه منظورم می شوید.
سلام بسیار عالی ایا نیاز به کریستالهای مخصوص مانند 11059200 هرتز در این مدل میکرو نیست?
اگر باشه خوب دقت بالاتر خواهد رفت و اگر نباشه هم مشکلی نخواهید بود
سلام.اول از همه تشکر کنم بخاطر سایت خوبتون که اطلاعاتی که باید ساعت ها با ورق زدن کتاب های دانشگاهی پیدا کرد رو با یک سرچ ساده به صورت رایگان در اختیار مردم قرار میدید.دوم میخواستم ازتون درخواست کنم یک نوع آموزش ارتباط سریال توسط آردینو رو قرار بدید. البته منظورم یکم فراتر از مقدماتی مثلا خوندن پکیج دیتا ها با زبان هگزا دسیمال. معمولا این پکیج هارو با برنامه های زیادی میشه خوند و اطلاعاتشون رو بدست آورد اما مشکل ما توی خوندن این اطلاعات داخل محیط برنامه نویسی آردینو هست
دلیل این درخواستم بخاطر کنار گزاشتن کتابخانه ها توی آردینو و کار با دیتا شیت ماژول هاست که بنظرم بهتر و کاربردی تر و همینطورپردازش سریعتر نسبت به استفاده از کتابخانه است. ممنون
سلام
روی سیستم من stvd نصب نمیه و مجبورم با IAR کار کنم کتابخونه ها همه رو دارم ولی این Error هارو میده
Error[Li005]: no definition for “UART1_SendData8” [referenced from E:\stm tst\stm8s_1\Debug\Obj\main.o]
Error while running Linker
واین
Fatal Error[Pe035]: #error directive: “Please select first the target STM8S/A device used in your application (in stm8s.h file)” E:\stm tst\stm8_1_2\STM8S.h 75
راه حلی دارید؟
خطای دوم رو حل کنید احتمالا اولی حل میشه
داره میگه نوع میکروکنترلر رو انتخاب نکردید داخل فایل stm8s.h
سلام
الان ساعت 11.20 شب هست و من از حدود ربع ساعت پیش شروع به خوندن این مطلب کردم …
خیلی خیلی عالی بود خیلی وقت بود که منتظر ارتباطات بودم …
وقفه ارتباط سریال خیلی مهم هست بنظر من … دیگه CPU الاف دریافت نمیمونه !!! ولی بازم خوبه …
منتظر ادامه آموزش ها هستم
بازم ممنونم از آموزش خوبتون
سلام دوست عزیز
ممنون از پیام های دلگرم کننده شما
در چند قسمت آینده روی ارتباطات مختلف متمرکز هستیم و آنها را بررسی میکنیم.