Skocz do zawartości

STM32 prędkości USART powyżej 115200


galczys

Pomocna odpowiedź

Witam,

Mam mały problem z ustawieniem niestandardowej prędkości na STM32 powyżej 115200. Problem pojawia się zarówno przy użyciu funkcji niesocjalizującej jak i ręcznego skonfigurowania ( ręczne wyliczenie wartości dla rejestru BRR ).

Nie ma problemu z różnymi transmisjami 9600, 28800 aż do 115200. Po tej wartości terminal milczy. Jedynie przy użyciu funkcji z biblioteki do inicjalizacji USART do terminala docierały jakieś błędne informacje. Przy konfiguracji ręcznej nic nie dociera powyżej 115200.

Ogólnie to muszę rozpędzić USART do 1Mb, ponieważ tworzę sterownik do serw które właśnie na takiej prędkości komunikują się po tym interfejsie.

Dodam jeszcze że korzystam z win 7 i programu terminal v1.9b. Kiedyś testowałem prędkość np 256000 na ATMga32 i działało bez problemu.

#include "stm32f10x.h"
#include "stm32f10x_conf.h"

void RCC_Conf(void);

int main(){
RCC_Conf();
uint16_t zmienna = 0;

USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);

/* Configure USART1 Tx (PA.09) as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* Configure USART1 Rx (PA.10) as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);



USART_ClockInitTypeDef  USART_ClockInitStructure;

USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;
USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;

USART_ClockInit(USART1, &USART_ClockInitStructure);


USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

uint32_t tmp;

tmp = USART1->CR1;
tmp |= USART_InitStructure.USART_WordLength|USART_InitStructure.USART_Parity|USART_InitStructure.USART_Mode;
USART1->CR1 = tmp;

tmp = USART1->CR2;
tmp |= USART_InitStructure.USART_StopBits;
USART1->CR2 = tmp;

tmp = USART1->CR3;
tmp |= USART_InitStructure.USART_HardwareFlowControl;
USART1->CR3 = tmp;

USART1->BRR = (uint16_t)0x9c4;

/* Enable USART1 */
USART_Cmd(USART1, ENABLE);

while(1){
	while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){}
	USART_SendData(USART1, 0xA2);
	while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET){}
	zmienna = USART_ReceiveData(USART1);
}

return 0;
}

void RCC_Conf(void){
ErrorStatus HSEStartStatus;

//reset ustawień RCC
RCC_DeInit();

//Włącz HSE
RCC_HSEConfig(RCC_HSE_ON);

//Czekaj aż HSE będzie gotowy
HSEStartStatus = RCC_WaitForHSEStartUp();

if(HSEStartStatus == SUCCESS){
	FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

	//zwloka dla pamieci Flash
	FLASH_SetLatency(FLASH_Latency_2);

	//HCLK = SYSCLK
	RCC_HCLKConfig(RCC_SYSCLK_Div1);

	//PCLK2 = HCLK
	RCC_PCLK2Config(RCC_HCLK_Div1);

	//PCLK1 = HCLK/2
	RCC_PCLK1Config(RCC_HCLK_Div2);

	//PLLCLK = 8MHz * 9 = 72MHz
	RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

	//Włącz PLL
	RCC_PLLCmd(ENABLE);

	//Czekaj aż PLL poprawnie się uruchomi
	while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){}

	//PLL będzie zrodlem sygnalu zegarowego
	RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

	while(RCC_GetSYSCLKSource() != 0x08){}
}
}

Istnieje może jakiś preskaler do ustawienia albo coś, bo dla mnie to dziwne że procek zaczyna nadawać śmieci przy następnej prędkości powyżej 115200

Link do komentarza
Share on other sites

RS232 i 1Mbod/sek to nie jest za dobry pomysł. Tzn. jak najbardziej się da, ja nawet tak miałem spięte 2 PC-ty, ale to były jeszcze czasy WiN98.

Problem natomiast polegał na tym że na byle jakim kablu to nie chciało chodzić, np. w połowie transferu pliku zrywała się komunikacja. Ogólnie dopiero na 3 czy 4 kablu, mi to chodziło w miarę stabilnie.

Może się okazać że bez korekty błędów i protokołu XON, XOFF nie pojedziesz za daleko., bo szybkość transferu to jedno, a inny problem to czy urządzenia nadążają trawić dane z taką szybkością ?

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.