La tasa de baudios de USART no se estableció correctamente

Estoy usando la placa de descubrimiento STM32VL (STM32f100rb6). Usando este código para la configuración de USART (incluida la velocidad en baudios):

#include "main.h"
#include "LCD-HD44780.h"
void UART1_init(void)
{
    lcd_clear();
    /* Enable GPIOA's Clock from APB2, Bit2->1  */
    RCC->APB2ENR |= BIT2;
    //Enable USART1 Clock
    RCC->APB2ENR |= BIT14;

    /* UART1 : UART1_RX: PA10 -> input Floating: (GPIOA_CRH -> reset state so leave it)*/

    /* UART1 : UART1_TX: PA9  -> alternate function push pull */
    GPIOA->CRH |= BIT4 | BIT5; //Output mode 50Mhz
    GPIOA->CRH |= BIT7; // Alternate function output Push-pull

    //Enable UART
    USART1->CR1 |= BIT13;
    //OVER8=1
    //USART1->CR1 |= BIT15;
    //Word Lenght 8 bit reset mode
    //SET 1 STOP Bit reset mode
    // BaudRate config (baudrate=1200)-fclk=24MHz
    //OVER8=0->baurdate=(fclk)/(16*USARTDIV)
    //DIV_Mantasia=1250;
    USART1->BRR = (uint32_t)(1250 << 4);
    //Enable Transmit,Send IDLE Frame as first data
    lcd_writeString(cprintf(USART1->BRR));
    USART1->CR1 |= BIT3;
    while (!(USART1->SR && BIT7));//Wait until TXE is 1;
    while (!(USART1->SR && BIT6));//Wait until TC is 1;
    //Send
    USART1->DR = 1;
    while (!(USART1->SR && BIT7));//Wait until TXE is 1;
    while (!(USART1->SR && BIT6));//Wait until TC is 1;
}

y este código para configurar los relojes:

#include "stm32f10x.h"
#include "custom.h"

void SystemInit(void)
{

    /* Enable HSI-RC Bit0->1 */
    RCC->CR |= BIT0;

    /* Set PLL Source As HSI/2 Bit 16->0 */
    RCC->CFGR &= ~BIT16;

    // Set PLLMUL to 6-> Bit 20 ->1 */
    RCC->CFGR |= BIT20;

    //Set SYSCLK Source As PLL bit 1 ->1
    RCC->CFGR |= BIT1;

    // Set AHB Prescalar to 8 bit[7:4]: 1010
    //RCC->CFGR |= (BIT5 | BIT7);

    /* Select HSI as System Clock */
    //RCC->CFGR &= ~BIT0 & ~BIT1; // OR Nothing (Reset State)

    /* Set AHPR prescalar as Bit7 ->0 */
    //RCC->CFGR &= ~BIT7; //Or reset state

    /* Set APB2 prescalar to 1 BIT13->0 */
    //RCC->CFGR &= ~BIT13;

}

necesito esto:

#include <stdint.h>
#ifndef CUSTOM_H
#define CUSTOM_H
#define BIT0  (uint32_t)0x1
#define BIT1  (uint32_t)0x2
#define BIT2  (uint32_t)0x4
#define BIT3  (uint32_t)0x8
#define BIT4  (uint32_t)0x10
#define BIT5  (uint32_t)0x20
#define BIT6  (uint32_t)0x40
#define BIT7  (uint32_t)0x80
#define BIT8  (uint32_t)0x100
#define BIT9  (uint32_t)0x200
#define BIT10 (uint32_t)0x400
#define BIT11 (uint32_t)0x800
#define BIT12 (uint32_t)0x1000
#define BIT13 (uint32_t)0x2000
#define BIT14 (uint32_t)0x4000
#define BIT15 (uint32_t)0x8000
#define BIT16 (uint32_t)0x10000
#define BIT17 (uint32_t)0x20000
#define BIT18 (uint32_t)0x40000
#define BIT19 (uint32_t)0x80000
#define BIT20 (uint32_t)0x100000
#define BIT21 (uint32_t)0x200000
#define BIT22 (uint32_t)0x400000
#define BIT23 (uint32_t)0x800000
#define BIT24 (uint32_t)0x1000000
#define BIT25 (uint32_t)0x2000000
#define BIT26 (uint32_t)0x4000000
#define BIT27 (uint32_t)0x8000000
#define BIT28 (uint32_t)0x10000000
#define BIT29 (uint32_t)0x20000000
#define BIT30 (uint32_t)0x40000000
#define BIT31 (uint32_t)0x80000000

char* cprintf(int integer);
int strlenght(char str[20]);
char int2char(int i);
char* revstr(char* str);
#endif

Estoy dispuesto a tener 24Mhz como USART1-fclk y baud-rate-1200, pero cuando analizo la salida del analizador lógico seleae, descubrí que la tasa de baudios real es 400, no 1200 (se adjuntan imágenes). baud-rate=1200 ingrese la descripción de la imagen aquímismo por baud-rate=400: ingrese la descripción de la imagen aquídonde esta el error??

¿Qué tan seguro está del reloj del sistema? Algo así como el uso directo de un cristal de 8 MHz sin el PLL habilitado explicaría su error de factor de tres.
de acuerdo con SystemInit (), configuré PCLK2 = 24 MHz usando una fuente de reloj de oscilador RC interno de 8 MHz. Parece cierto, ¿dónde está el error?
Para el cálculo de Baudrate utilicé el documento RM0008 (Página 803/1137 - capítulo 27.3.4) y de acuerdo con USARTDIV=Fclk/(16*Baudrate), entonces USARTDIV=1250
Debe encontrar una manera de verificar que el reloj sea realmente de 24 MHz.
Creo que descubrí el error. Comenté toda la configuración en SystemInit (), ¡así que el resultado es el mismo! @ Chris Stratton: Tienes razón... Fclk está mal... Intento más e informo...
Finalmente solucionado. Debe habilitar el bit PLLON en RCC-CR. pero después de toda la configuración. Si establece el bit PLLON, no se establecerá ninguna configuración. en realidad solo usamos un reloj de 8MHz. @Chris Stratton: Responda eso para aceptar.

Respuestas (1)

Finalmente solucionado. Debe habilitar el bit PLLON en RCC-CR. pero después de toda la configuración. Si establece el bit PLLON, no se establecerá ninguna configuración. en realidad solo usamos un reloj de 8MHz.