PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : STM32F427VG und USART



Che Guevara
14.11.2017, 01:11
Hi,

ich bin gerade dabei, ein Projekt von einem STM32F417VG auf einen STM32F427VG zu porten. Dabei tritt aber schon das erste Problem auf, welches ich mir nicht ganz erklären kann...
Es geht um Usart3, bzw die Baudrate. Für einen RS485 Bus brauche ich 2MBaud, auf dem alten Prozessor (417) kein Problem (HAL und fertig). Bei dem Neuen aber stimmt was nicht!
Wenn ich folgendes Programmiere:


void InitRS485Usart(void){
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;


//configure ports, &GPIO_InitStructure);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);


USART_InitStructure.USART_BaudRate = 2000000; //! 115200 // 2000000
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;

//configure clock for USART
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
//configure clock for GPIO
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
//configure AF
GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_US ART3);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_US ART3);

//configure ports, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);


USART_Init(USART3, &USART_InitStructure);
/* Enable USART */
USART_Cmd(USART3, ENABLE);


Rs485DEREHigh;
}

liegt die ausgegebene Baudrate bei ca. 2192 (456us High für 1Bit). Ich habe angefangen, das Ganze zu debuggen und bin in der stm32f4xx_usart.c Datei hängen geblieben.
Dort wird ja das BRR-Register beschrieben und bei meinen Werten (180MHz Clock, APB1 = 22.5MHz) wird ein Wert von 11 ins BRR Register geschrieben. Laut DB besteht das BRR-Register aus 4Bit Fractional und 12Bit Ganzzahl Teil.
Durch probieren habe ich herrausgefunden, dass der µC keinen Teiler kleiner 1 mag. Stelle ich BRR auf mind. 16 (sprich: Teiler>=1), wirds schon wesentlich schneller! Mit Ganzzahl = 1 und Frac = 6 komme ich auf 490ns / Bit, was fast meinen 2MBaud entspricht. Alles mit Over8=0.

Mittlerweile bin ich von der Rumrechnerei schon ganz Kirre, hoffentlich kann mir jemand auf die Sprünge helfen! Mir verwirrt v.a., dass es mit dem einen µC klappt und mit dem anderen nicht...

Vielen Dank & Gruß
Chris