STM32 Yazılımsal UART Mümkün mü?

Başlatan respected, 12 Temmuz 2013, 15:15:06

respected

STM32F4 üzerinde 6 adet usart modülü var. Ne gerek var yazılımsal uart diye düşünebiliriz ama 7. uart lazım ise ya da donanımsal uart kullanmak istemiyor isek yazılımsal olarak eventout olan uçları uart olarak ayarlayabilir miyiz?

X-Fi

Yazılımsal olarak uart yazılabilir. Ancak donanımdaki avantajlarını yani kesmeleri ve yüksek hızı elde edemezsiniz.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

respected

Evet test ettim hocam. Kesme kullanmıyorum çünkü sadece gönderim yapmayı düşünüyorum. Hız 9600 de test ettim sorunsuz.

Erhan YILMAZ

Alıntı yapılan: respected - 13 Temmuz 2013, 02:00:46
Evet test ettim hocam. Kesme kullanmıyorum çünkü sadece gönderim yapmayı düşünüyorum. Hız 9600 de test ettim sorunsuz.

Yaptın yani, paylaşsana?

respected

#define UART_TX_PIN                  (GPIO_Pin_9)
#define UART_TX_PORT                 (GPIOC)
#define UART_TX_ENABLE_PIN                  (GPIO_Pin_9)
#define UART_TX_ENABLE_PORT                 (GPIOA)
#define Baudrate              9600                      //bps
#define OneBitDelay           (1000000/Baudrate)
#define DataBitCount          8 


void InitSoftUART(void)		
{
	GPIO_InitTypeDef GPIO_InitStruct;
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA| RCC_AHB1Periph_GPIOC , ENABLE);	
	
	GPIO_InitStruct.GPIO_Pin = UART_TX_PIN; 
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_NOPULL;
  GPIO_Init(UART_TX_PORT, &GPIO_InitStruct);
	
	GPIO_InitStruct.GPIO_Pin = UART_TX_ENABLE_PIN; 
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_NOPULL;
  GPIO_Init(UART_TX_ENABLE_PORT, &GPIO_InitStruct);
	
	 GPIO_SetBits(UART_TX_PORT,UART_TX_PIN);
	 GPIO_SetBits(UART_TX_ENABLE_PORT,UART_TX_ENABLE_PIN);

}


void UART_Transmit(const char DataValue)
{
	
	unsigned char  i;
	GPIO_ResetBits(UART_TX_PORT,UART_TX_PIN);
	delay_us(OneBitDelay);

	for ( i = 0; i < DataBitCount; i++ )
	{
	
		if( ((DataValue>>i)&0x1) == 0x1 )   
		{
			GPIO_SetBits(UART_TX_PORT,UART_TX_PIN);
		}
		else      //if Bit is low
		{
			GPIO_ResetBits(UART_TX_PORT,UART_TX_PIN);
		}

	    delay_us(OneBitDelay);
	}


	GPIO_SetBits(UART_TX_PORT,UART_TX_PIN);
	delay_us(OneBitDelay);
}


for(b=0;b<10;b++)
{
UART_Transmit(adc_bilgisi[b]);
}


"adc_bilgisi " bu dizi içine attığınız değeri gönderir.

camby

aynısını bir timer kesmesi programının içine koyun , program esir olmasın en azından. Timer 1/baud olacak.

Gidecek datalar için de bir buffer yapabilirsiniz. Siz buffer'a yollayın , kesme geldiğinde buffer'a baksın. Buffer'da eleman var ise bekleyen onları da yollasın.

DMA da belki işin içine sokabilirsiniz.

GPIO_SetBits yerine write_bit(sanırım böyleydi) daha hızlı çalışır. Hatta register seviyesinde BSRR register ile en hızlı o çalışır. Kesmeden daha çabuk çıkar

respected

Evet hocam saolasın. Aceleyle yazdığım kodlardı. Paylaşma talebi gelincede paylaştım.  Söylediklerinizi ekleyince daha efektif bir kod olacağı kesin.