0
\$\begingroup\$

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.

\$\endgroup\$
  • \$\begingroup\$ "BIT0", "BIT1", "BIT16"... - how do we know that these 'bits' do what the comments say? \$\endgroup\$ – Bruce Abbott May 28 '17 at 14:01
  • \$\begingroup\$ Check interface needs for CTS/RTS and DSR/DTR \$\endgroup\$ – Tony Stewart Sunnyskyguy EE75 May 28 '17 at 14:37
4
\$\begingroup\$

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.

\$\endgroup\$
  • 1
    \$\begingroup\$ With STM32's it is often an issue like this. There appears to be an attempt to enable the peripheral clock to the GPIO bank (which is required to enable the pin), but now that you mention it I'm not seeing one for the UART peripheral. \$\endgroup\$ – Chris Stratton May 28 '17 at 16:16

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.