با سلام،در این قسمت از آموزش ها میخواهیم در مورد رابط UART میکرو صحبت کنیم. در قسمت قبل در رابطه با واحد GPIO در میکرو کنترلر WCH صحبت کردیم.
برای کار کردن با این واحد از میکرو کنترلر نیز باید پیش زمینه ای از اینکه این پریفرال چگونه کار میکند و چیست و موارد استفاده ان چیست داشته باشید.
اگر با این واحد اشنایی ندارید پیشنهاد میکنم آموزش های دوستان عزیزمون در این باره رو حتما قبل از شروع این اموزش بخونید.
اگر اموزش هارو دنبال کرده باشید و پروژه ای با MRS ساخته باشید متوجه میشوید که به صورت پیش فرض یک کد آماده برای دیباگ برای ما ساخته و در اول کد ما قرار داده به شکل زیر:
از این کد آماده ای برای ما ساخته میشود برای کار های دیگر هم استفاده کرد اما ما میخواهیم خودمون بتونیم واحد UART این میکرو رو کانفیگ کنیم،پس ادامه آموزش رو از دست ندید.
طبق معمول برای شروع کار در دیتاشیت به دنبال واحد UART که میخواهیم فعال کنیم میگردیم،مثلا من میخواهم UART8 رو راه اندازی کنم.
درون دیتاشیت پیدا میکنیم که به کدامین باس متصل است و با کمک آن کلاک آن را فعال میکنیم.همچنین ماباید واحد GPIO را هم کانفیگ کنیم تا بتوانیم خروجی و ورودی UART رو داشته باشیم.پس:
پس از فعال سازی کلاک این بخش ها نوبت به کانفیگ کردن آنهاست،برای بخش GPIO که در آموزش قبل صحبت کردیم فقط فرقی که اینجا دارد این است که من به جای خروجی معمولی برای پایه TX خروجی Alternate functionرو گذاشتم و برای اون پایه از GPIO مشخص کرده ام که به خروجی پریفرال UART8 متصل شو، Alternate functionها داخل دیتاشیت هستند از دیتاشیت میتوانید ببینید که هر پایه میتواند به کدام پریفرال ها متصل شود و چه کارایی هایی دارد.
مثل عکس زیر:
این هم کانفیگ بخش GPIO
اینجا نوبت میرسه به خود کانفیگ خود UART
اول از همه به استراکت فعال سازش یک اسم میدهیم بعد از این کار میشود به تک تک اجزای آن دسترسی داشت که به صورت زیر هستند.
ما برای شروع کارمون بادریت و پایه های کنترل سخت افزار رو به شکل زیر تنظیم میکنیم:
اپشن بعدی مود کاری هست که چون ما هم ارسال میخواهیم هم دریافت جفت حالات رو با هم OR میکنیم:
بقیه گزینه هارو دیفالت یک رابط سریال معمولی میزاریم،سپس تنظیماتمون رو توسط تابع USART_Init اعمال میکنیم به شکل زیر:
سپس یک تابع ساده مینویسیم تا برای ما رشته ای رو ارسال کند تا بتوانیم از عملکرد صحیح آن اطمینان حاصل کنیم.
1 2 3 4 5 6 7 8 9 10 | void send_string(char *data) { while((UART8->STATR & USART_STATR_TC)==0); while(*data!=0) { UART8->DATAR =*data; while((UART8->STATR & USART_STATR_TC)==0); ///wait data++; } } |
این تابع بالا با ریجستر با UART کار میکنه شما میتوانید به سادگی از توابع پیش تعریف شده خودش نیز استفاده کنید.ما در کد نهایی ازش استفاده کردیم.
1 | USART_SendData(USART8, *DATA++); |
خب وقت تست کد هست:
1 2 3 4 5 6 7 | send_string("Hello\r\n"); //test Uart TX functionality sprintf(buffer,"My name is Erfan Rafiei from Sisoog!\r\nCHIPID:%08x\r\n", DBGMCU_GetCHIPID()); send_string(buffer); Delay_Ms(100); |
پس از اطمینان از کارکرد صحیح کد ،یک برنامه تست مینویسم که هرچی رو دریافت کرد ارسال کند که کد نهایی به شکل زیر میشود:
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 186 | /********************************** (C) COPYRIGHT ******************************* * File Name : main.c * Author : WCH * Version : V1.0.0 * Date : 2021/06/06 * Description : Main program body. ********************************************************************************* * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. * Attention: This software (modified or not) and binary are used for * microcontroller manufactured by Nanjing Qinheng Microelectronics. *******************************************************************************/ /* *@Note USART Print debugging routine: USART1_Tx(PA9). This example demonstrates using USART1(PA9) as a print debug port output. */ #include "debug.h" /* Global typedef */ /* Global define */ void send_string(char *data); /* Global Variable */ uint16_t last_temp_data=0; char buffer[128]; /********************************************************************* * @fn main * * @brief Main program. * * @return none */ int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); SystemCoreClockUpdate(); Delay_Init(); USART_Printf_Init(115200); printf("SystemClk:%d\r\n",SystemCoreClock); printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() ); printf("This is printf example\r\n"); ////////////////////////////////////////////////////////Uart8 Init -> Uart 8 -> PC4 TX | C5->RX RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART8 ,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC ,ENABLE); GPIO_InitTypeDef GPIO_InitStr; GPIO_InitStr.GPIO_Pin = GPIO_Pin_4; ///TX_PIN GPIO_InitStr.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStr.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOC, &GPIO_InitStr); GPIO_InitStr.GPIO_Pin = GPIO_Pin_5; ///RX_PIN GPIO_InitStr.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOC, &GPIO_InitStr); USART_InitTypeDef UART_InitStr; UART_InitStr.USART_BaudRate = 9600; UART_InitStr.USART_HardwareFlowControl =USART_HardwareFlowControl_None; //UART8->CTLR1 |= 0x0000000C; UART_InitStr.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; UART_InitStr.USART_WordLength = USART_WordLength_8b; UART_InitStr.USART_StopBits = USART_StopBits_1; UART_InitStr.USART_Parity = USART_Parity_No; USART_Init(UART8, &UART_InitStr); USART_Cmd(UART8, ENABLE); ////////////////////////////////////////////////////////END Uart8 Init -> Uart 8 -> PC4 TX | C5->RX send_string("Hello\r\n"); //test Uart TX functionality sprintf(buffer,"My name is Erfan Rafiei from Sisoog!\r\nCHIPID:%08x\r\n", DBGMCU_GetCHIPID()); send_string(buffer); Delay_Ms(100); /////////////////////////////////////////////////////////////// while(1)//////SEND RX INPUT { // if(UART8->DATAR != last_temp_data) if(USART_ReceiveData(UART8) != last_temp_data) { last_temp_data=UART8->DATAR; } //UART8->DATAR = last_temp_data; if(last_temp_data!='\0') { USART_SendData(UART8,last_temp_data); while((UART8->STATR & USART_STATR_TC)==0); } Delay_Ms(100); } } void send_string(char *data) { while((UART8->STATR & USART_STATR_TC)==0); while(*data!=0) { UART8->DATAR =*data; while((UART8->STATR & USART_STATR_TC)==0); ///wait data++; } } |
در قسمت بعد ما آموزش واحد ADC رو داریم با ما همراه باشید.
نویسنده شو !
سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.