We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
HiGuys, I have been trying for days trying to get the UART on the STM32F030R8 to work, I have following the datasheet and the reference manual step by step but it just doesn't work. Using the STM32 CubeMX I got it to work but I dont see where I am wrong. Could anyone point out my mistake. I am pasting the functions I am using to step the MCU below.
Thanks for the help.
#include <__cross_studio_io.h> #include <stm32f30x.h>
#ifndef _HW_Init_H #define _HW_Init_H #endif
void Port_Init(void) { RCC->AHBENR |= (RCC_AHBENR_GPIOAEN ); RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN | RCC_APB2ENR_SPI1EN ; RCC->APB1ENR |= RCC_APB1ENR_USART2EN ; GPIOA -> MODER |= GPIO_MODER_MODER7_1 | GPIO_MODER_MODER5_1 | GPIO_MODER_MODER2_1 | GPIO_MODER_MODER6_1 | GPIO_MODER_MODER3_1; /* | GPIO_MODER_MODER13_1 | GPIO_MODER_MODER14_1;*/ GPIOA -> OSPEEDR |= GPIO_OSPEEDER_OSPEEDR9 | GPIO_OSPEEDER_OSPEEDR10 | GPIO_OSPEEDER_OSPEEDR7 | GPIO_OSPEEDER_OSPEEDR3 ; GPIOA -> PUPDR |= GPIO_PUPDR_PUPDR9_0 | GPIO_PUPDR_PUPDR7_0 | GPIO_PUPDR_PUPDR10_0 ;
/*GPIOA -> MODER = GPIO_MODER_MODER7_0 ; /* so far this statement causes the CPU to freeze */
return; }
void UART_Init(void) { USART2 -> BRR = 0x341; USART2 -> CR1 |= USART_CR1_UE ; USART2 -> CR1 |= USART_CR1_TE ; return; }
void UART_SendChar(char a) { int TC ;
while ((USART2-> ISR & USART_ISR_TXE) == 0); USART2-> TDR = a ; return ; }
void UART_SendString( char* data, int length ) { int send=0 ; if ((USART2->ISR & USART_ISR_TC) == USART_ISR_TC) { USART2->TDR = data[send++]; } }
void SPI_Init(void) { SPI1->CR1 = SPI_CR1_MSTR | SPI_CR1_BR_2; /* (1) */ SPI1->CR2 = SPI_CR2_SSOE | SPI_CR2_RXNEIE | SPI_CR2_FRXTH| SPI_CR2_DS_2 | SPI_CR2_DS_1 | SPI_CR2_DS_0; /* (2) */ SPI1->CR1 |= SPI_CR1_SPE; /* (3) */ GPIOA -> MODER |= GPIO_MODER_MODER10_0 ; }
void SPI_Send_Byte(char data) { if ((SPI1->SR & SPI_SR_TXE) == SPI_SR_TXE) /* Test Tx empty */ { /* Will inititiate 8-bit transmission if TXE */ *(uint8_t *)&(SPI1->DR) = data; while ((SPI1->SR & SPI_SR_BSY) == SPI_SR_BSY) {
} return ; } }
char SPI_send_Stream(char stream[] , int length) { int stream_index = 0 ; char byte;
CLEAR_BIT(GPIOA->ODR , GPIO_ODR_10) ; while (stream_index < length ) { byte = stream[stream_index]; SPI_Send_Byte(byte); stream_index ++ ; } SET_BIT(GPIOA->ODR , GPIO_ODR_10) ; }
void Clock_setup(void) { /*int check= 0 ; RCC -> CFGR |= RCC_CFGR_PLLMULL6 | RCC_CFGR_SWS_1 ;*/ }