Configurar serie con registros en STM32l073RZ

0

Estoy intentando configurar la serie de mi STM32L073RZ con registros para enviar datos en el pin PA_9. Actualmente tengo este script

#include "mbed.h"

void usartSetup (void) {
    RCC->IOPENR |= RCC_IOPENR_IOPAEN;
    GPIOA->ODR |= GPIO_ODR_OD9;
    RCC->APB2ENR |= RCC_APB2ENR_USART1EN;            // enable clock for USART1
    USART1->BRR  = 160000 / 96;              // set baudrate
    USART1->CR1 |= (USART_CR1_RE | USART_CR1_TE);  // RX, TX enable
    USART1->CR1 |= USART_CR1_UE;                    // USART enable
}

void SendChar(){
    while (!(USART1->ISR & (USART1->ISR | USART_ISR_TXE)));
    char stringtosend[4];
    stringtosend[0] = 'T';
    stringtosend[1] = 'e';
    stringtosend[2] = 'x';
    stringtosend[3] = 't';
    for(int send = 0; send < 4; send++){
        USART1->TDR = stringtosend[send];
    }
}

int main() {
    usartSetup();
    SendChar();
}

También puede ver mi proyecto aquí en el sitio web mbed

Cuando muestro el estado del pin con mi osciloscopio, éste siempre está a cero.

¿Alguien puede ayudarme?

¡Gracias!

EDITAR:

A continuación puede ver mi script actual, funciona bien para escribir y leer algo, simplemente quiero configurar un reloj externo en el pin PB_5, pero funciona. También trato de configurar el UART en modo de tarjeta inteligente

#include "mbed.h"

void board_init(void){
    RCC->IOPENR |= RCC_IOPENR_IOPBEN;
    RCC->APB2ENR |= RCC_APB2ENR_USART1EN;            // enable clock for USART1
    USART1->BRR  = 320000 / 96;              // set baudrate

    GPIOB->MODER &= ~GPIO_MODER_MODE5_0;
    GPIOB->MODER |= GPIO_MODER_MODE5_1;

    GPIOB->MODER &= ~GPIO_MODER_MODE6_0;
    GPIOB->MODER |= GPIO_MODER_MODE6_1;

    GPIOB->MODER &= ~GPIO_MODER_MODE7_0;
    GPIOB->MODER |= GPIO_MODER_MODE7_1;

    GPIOB->AFR[1] |= 0x500000;
    GPIOB->OTYPER &= ~GPIO_OTYPER_OT_5;
    GPIOB->OTYPER &= ~GPIO_OTYPER_OT_6;
    GPIOB->OTYPER |= GPIO_OTYPER_OT_7;

    USART1->CR3 |= USART_CR3_DMAT;

    //Secure element part
    USART1->CR2 &= ~USART_CR2_LINEN;
    USART1->CR3 &= ~USART_CR3_HDSEL;
    USART1->CR3 &= ~USART_CR3_IREN;
    USART1->CR3 |= USART_CR3_SCEN;
    USART1->GTPR = 32 >> 1;
    USART1->CR2 |= USART_CR2_CLKEN;
    USART1->CR3 |= SMARTCARD_NACK_ENABLE;
    USART1->CR2 |= SMARTCARD_STOPBITS_1_5;
    USART1->CR1 |= USART_CR1_PCE;


    USART1->CR1 |= (USART_CR1_UE | USART_WORDLENGTH_8B);  // RX, TX enable
    USART1->CR1 &= ~USART_CR1_RE;
    USART1->CR1 &= ~USART_CR1_TE;
}

void delay(int cnt) {
    while (cnt-- > 0) {
        asm("nop");
    }
}

int usart_rec(void) {
    /* Wait until the data is ready to be received. */
    while ((USART1->ISR & USART_ISR_RXNE) == 0);

    // read RX data, combine with DR mask (we only accept a max of 9 Bits)
    return USART1->RDR & 0x1FF;
}

void usart_rec_str(int array[], int sizeArray){
    USART1->CR1 |= USART_CR1_RE | USART_CR1_TE;
    for(;;){
        pcMain.printf("%i",usart_rec());
    }
    USART1->CR1 &= ~USART_CR1_RE;
    USART1->CR1 &= ~USART_CR1_TE;
}

void usart_snd(int data) {
    USART1->TDR = data;

    // wait for TX
    while ((USART1->ISR & USART_ISR_TXE) == 0);
}

void usart_snd_str(char *str) {
    USART1->CR1 |= USART_CR1_TE;
    int   i = 0;
    while(str[i] != 0) {
        usart_snd(str[i++]);
    }
    USART1->CR1 &= ~USART_CR1_TE;
}

void usart_snd_str(int array[], int size) {
    USART1->CR1 |= USART_CR1_TE;
    for(int j = 0; j<size; j++) {
        // read blocking form usart
        usart_snd(array[j]);
    }
    USART1->CR1 &= ~USART_CR1_TE;
}
    
pregunta Simon NOWAK

1 respuesta

1

Hay algunos problemas aparentes

  • El pin TX no está configurado para el puerto serie, presumiblemente todavía está en modo analógico después del reinicio. Debe configurarlo para alternar el modo de función en GPIOA->MODER y asignarlo a USART1 en GPIOA->AFRH . Los números de función alternativos se enumeran en la hoja de datos, no en el manual de referencia.

  • Debes marcar USART_ISR_TXE cada vez antes de escribir en TDR , esperando hasta que se convierta en 1.

  • while (!(USART1->ISR & (USART1->ISR | USART_ISR_TXE)));

Esta expresión no tiene sentido.

  • GPIOA->ODR |= GPIO_ODR_OD9;

Esto es innecesario. La configuración de ODR no tiene efecto a menos que el pin se establezca como salida.

    
respondido por el berendi

Lea otras preguntas en las etiquetas