STM32F103 Los bits TC \ TXE se configuran automáticamente después de habilitar el reloj USART1

0

Estoy intentando habilitar el periferial USART1 en el MCU Stm32F103. Mi código se ve así:

#include "stm32f10x.h"

void UARTInit(void);
void GPIOInit(void);
USART_InitTypeDef USART_1;

int main()
{
    SystemInit();
    GPIOInit();
    UARTInit();
    USART_SendData(USART1, 0x12);
    while (1)
    {

    }
}

void UARTInit()
{
    RCC ->APB2ENR |= RCC_APB2ENR_USART1EN;  
    USART_StructInit(&USART_1);
    USART_Init(USART1, &USART_1);
    USART_ITConfig(USART1, USART_IT_TC, ENABLE);
    USART_Cmd(USART1, ENABLE);
}

void GPIOInit()
{
    RCC -> APB2ENR |= RCC_APB2ENR_IOPAEN |RCC_APB2ENR_AFIOEN;
    GPIOA-> CRH &= ~GPIO_CRH_CNF9;
    GPIOA -> CRH |= GPIO_CRH_CNF9_1;
    GPIOA -> CRH |= GPIO_CRH_MODE9_1;

    GPIOA->CRH  &= ~GPIO_CRH_CNF10; 
    GPIOA->CRH  |= GPIO_CRH_CNF10_0;
    GPIOA->CRH  &= ~GPIO_CRH_MODE10_1;
}

Como puede ver, primero habilito el reloj para USART1 y luego lo inicializo. Antes de ejecutar esto: RCC - > APB2ENR | = RCC_APB2ENR_USART1EN todos los bits en los registros USART se establecen en 0 (vea la primera imagen adjunta). Pero cuando el reloj está habilitado, los bits TC y TXE se establecen en 1, incluso cuando USART aún no está habilitado. (ver segunda pantalla).

Por lo tanto, si tiene alguna idea de por qué sucede esto, le agradeceré mucho su ayuda. Gracias.

    
pregunta Majestry

1 respuesta

1

Lo que ves es el comportamiento normal del periférico USART del STM32.

Esos bits se establecen independientemente del bit UE en el registro CR1. Solo indican que el búfer de transmisión está vacío (TXE) y el registro de cambio de transferencia está vacío (TC).

Lo que es cierto (porque acaba de habilitar el reloj, no puede haber nada) y generalmente no es un problema: simplemente no habilite la interrupción de TXE o TC antes de que se establezca el bit UE, de lo contrario, su interrupción probablemente no funcionará lo que te gustaría que hiciera.

La descripción del bit UE lee:

  

Cuando se borra este bit, los preescaladores y salidas USART se detienen y el final de la   corriente   Transferencia de bytes para reducir el consumo de energía. Este bit está establecido y eliminado por el software.

     

0: Preescalador y salidas USART deshabilitados

     

1: USART habilitado

Entonces, si bien puede sonar un poco como un bit de habilitación de USART completo, simplemente funciona en el prescaler y en las salidas.

    
respondido por el Arsenal

Lea otras preguntas en las etiquetas