USART
(Universal Asynchronous Receiver Transmitter) senkron yada asenkron olarak veri gönderimi ve
alımını sağlayan bir seri iletişim. USART ile 3 – 9 arası bit uzunluğunda veri
taşır. STM32F4’te 8 veya 9 bit uzunlukta veri taşınır. senkron modda veri
aktarımı için clock hattına ihtiyaç duyar. Asenkron modda ise herhangi bir
clock’a ihtiyaç duymadan veri aktarımı sağlanabilir. Veri aktarımı için veri
aktarım hızı yani baud rate belirlenmesi gerekir. Baud rate saniyede gönderilen
bit sayısı demektir ve genel olarak 1200, 2400, 4800, 19200,
38400, 57600 ve115200 değerleri kullanılır. Alıcı ve vericinin aynı baud rate değerlerine sahip olmaları
gerekmektedir.
Bilgisayara
USART ile veri iletmek ve almak için usb-ttl dönüştürücüsü gerekir. Bağlantı yaparken
Rx-Tx, Tx-Rx şeklinde yapılır. Eğer stm32f4 usb ile bilgisayara bağlıysa
usb-ttl dönüştürücünün diğer pinlerini bağlamaya gerek yoktur. USART için
kullanılabilecek portlar aşağıdaki tablodaki gibidir. Bu uygulamada PA2 (Tx )ve
PA3(Rx) pinleri kullanılacak.
STM32F4’te usart ayarları stm32f4xx_usart.h kütüphanesinde bulunan USART_InitTypeDef structı kullanılarak yapılır. Bu struct ile baudrate, data uzunluğu, datanın gönderileceği yada alınacağı gibi temel ayarları yapılır.
// USART2 USART_InitTypeDef USART_InitStruct; USART_InitStruct.USART_WordLength = USART_WordLength_8b; USART_InitStruct.USART_StopBits = USART_StopBits_1; USART_InitStruct.USART_Parity = USART_Parity_No; USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_InitStruct.USART_BaudRate = 115200; USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_Init(USART2, &USART_InitStruct); USART_Cmd(USART2, ENABLE);
Rx ve Tx olarak kullanıcağımız pinlerin tanımlamalarını yapıyoruz.
GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2);//PA2->Tx GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2);//PA3->Rx //GPIOA GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &GPIO_InitStruct);
Bilgisayardan STM32F4’e veri göndermek için kullanılacak fonksiyonu yazıyoruz.
uint16_t USART_GetChar() { while (!USART_GetFlagStatus(USART2, USART_FLAG_RXNE)); return USART_ReceiveData(USART2); }
STM32F4’ten bilgisayara veri gönderimini sağlayacak fonksiyonları yazıyoruz.
void USART_PutChar(char c) { while (!USART_GetFlagStatus(USART2, USART_FLAG_TXE)); USART_SendData(USART2, c); } void USART_PutString(char *s) { // stringi gönder while (*s) { USART_PutChar(*s++); } }
Fonksiyonları ve tanımlamaları main.c dosyasında
birleştirerek örnek programı yazıyoruz. Program da bilgisayardan STM32F4'e H karakteri gönderilirse PE7 pini high olacak ve led yanacak, L karakteri gönderilirse PE7 pini low olacak, S karakteri gönderilirse STM32F4'ten bilgisayara Hello World stringi gelecek ve ekrana yazılacak.
#include "stm32f4xx.h" uint16_t USART_GetChar() { // Data alinana kadar bekle while (!USART_GetFlagStatus(USART2, USART_FLAG_RXNE)); // Alinan datayi oku return USART_ReceiveData(USART2); } void USART_PutChar(char c) { // Data registeri bosalana kadar bekle while (!USART_GetFlagStatus(USART2, USART_FLAG_TXE)); // USART1 ile c datasini gönder USART_SendData(USART2, c); } void USART_PutString(char *s) { // stringi gönder while (*s) { USART_PutChar(*s++); } } int main(void) { RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); GPIO_InitTypeDef GPIO_InitDef; GPIO_InitDef.GPIO_Pin = GPIO_Pin_8; GPIO_InitDef.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitDef.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitDef.GPIO_OType = GPIO_OType_PP; GPIO_InitDef.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOE, &GPIO_InitDef); GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2);//PA2->Tx GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2);//PA3->Rx //GPIOA GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &GPIO_InitStruct); // USART2 USART_InitTypeDef USART_InitStruct; USART_InitStruct.USART_WordLength = USART_WordLength_8b; USART_InitStruct.USART_StopBits = USART_StopBits_1; USART_InitStruct.USART_Parity = USART_Parity_No; USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_InitStruct.USART_BaudRate = 115200; USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_Init(USART2, &USART_InitStruct); USART_Cmd(USART2, ENABLE); while (1) { uint16_t data = USART_GetChar(); //bilgisayardan input al if (data == 'H')//H karakteri gelirse PD13 High olsun { GPIO_SetBits(GPIOE, GPIO_Pin_8); } else if (data == 'L')//L karakteri gelirse PD13 Low olsun { GPIO_ResetBits(GPIOE, GPIO_Pin_8); }
else if (data == 'S')//L karakteri gelirse PD13 Low olsun { USART_PutString("Hello, World\n"); }
} }
Programın örnek videosu aşağıdadır. Sorularınızı
yorum olarak belirtirtebilirsiniz.
Hiç yorum yok:
Yorum Gönder