در قسمت بیستو یکم آموزش میکروکنترلر STM8 ارتباطات این میکروکنترلر با دنیای بیرون را بهصورت اجمالی موردبررسی قراردادیم و قصد داریم در هرقسمت به یکیاز رابطهای ارتباطی بپردازد. در این از قسمت آموزش میکروکنترلر STM8 رابط سریال(UART) را بررسی میکنیم. با ما همراه باشید.
رابط سریال(UART):
شاید ارتباط سریال یکیاز روشهای ارتباطی کلاسیک برای ارتباط بین کامپیوتر یا سایر دستگاهها با میکروکنترلر باشد. تنها بااستفادهاز دو سیم، میتوانیم یک ارتباط نقطهبهنقطه دوطرفه را بدستآوریم. بهدلیلسادگی و استفاده گسترده از آن، نقش مهمی در زمینه رابط ارتباطی دارد، بهطوریکه با مودمهای GSM، ماژول RF، دستگاههای بلوتوث مانند RN-52، دستگاههای Wi-Fi مانند ESP8266 و… استفاده میشود. همچنین استفاده گستردهای در صنایع دارد. ارتباطات دیگر مانند RS-485، LIN و غیره به آن متکی هستند.
اکثر STM8ها حداقل دارای یک ماژولUART هستند و برخیاز آنها بیشز یک ماژول UART دارند. UARTهای مختلف دارای ویژگیهای مختلفی هستند که در جدولزیر نشانداده شدهاست:
برای کسب اطلاعات بیشتر درمورد UART، به لینک آن مراجعهنمایید.
UARTهای میکروکنترلرSTM8 دارای ویژگیهای بسیاری است که در این مقاله امکان توضیح تمام ویژگیها وجود ندارد. در اینجا تنها ارتباط سریالی را بررسی میکنیم. LIN و IRDA را در مقالات بعدی پوشش میدهیم.
اتصالات سختافزاری:
نمونهکد UART:
#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 روی ۲مگاهرتز تنظیم میشوند.
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV8); CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1); …. …. CLK_PeripheralClockConfig(CLK_PERIPHERAL_UART1, ENABLE);
پینهای TX-RX بهترتیب خروجی و ورودی تعریف میشوند:
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 خیلیساده است. بهراحتی میتوانید نرخ باند و بیت ونوع ارتباط (سنکرون و آسنکرون)و… را تنظیمکنید.
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 به کامپیوتر میزبان ارسال میکنیم.
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 نمایشدادهمیشود.
if(UART1_GetFlagStatus(UART1_FLAG_TXE) == FALSE) { LCD_goto(7, 0); LCD_putchar(i + 0x30); i++; }
لطفا توجهداشتهباشید هردو پرچم بسیارمهم هستند.
در این قسمت به رابط سریال(UART)پرداختیم. در قسمت بیست و سوم آموزش میکروکنترلر STM8 به رابط کاربری سریال(SPI) میپردازیم. با ما همراه باشید.
منبع: سیسوگ