Electrical – USART not working

armstm32

I am using STM32VL discovery board(STM32f100rb6).. Using this codes but at result ther is nothing on TX pin.
systeminit():

#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;

    }

custom.h

#include <stdint.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

USART.c

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


void UART1_init(void)
{
    /* Enable GPIOA's Clock from APB2, Bit2->1  */
    RCC->APB2ENR |= BIT2;

    /* 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=1->baurdate=(fclk)/(8*USARTDIV)
    //DIV_Mantasia=2500; BRR=0b1001110001000000
    USART1->BRR |=  BIT15 | BIT12 | BIT11 | BIT10 | BIT6;

    USART1->CR1 |= BIT3;
    //Send
    USART1->DR = 0b110011;


}

PA9 connected to logic Analyzer and this is the result:
enter image description here
I putted UART1_init(); line in main.c too.
please help to find the mistake.

Best Answer

You need to enable the clock for UART1 before you use it.

I don't have the reference manual for STM32F100 handy, but this should probably be on either APB1ENR or APB2ENR.