====== Universal Asynchronous Receiver Transmitter ====== The UART offers a very flexible, full-duplex, industrial standard, serial receiver / transmitter. \\ Including IrDA and modem operations (CTS/RTS). \\ \\ {{usart_complete.svg}} \\ \\ ===== Features ===== * Full-, half-duplex communication. * Fractional baud rate generator. * 8- and 9 bit word length. * DMA and interrupt support. \\ ===== Configuration Registers ===== ==== USART_CR1 - Configuration register 1 ==== \\ {{usart_reg_cr1.svg}} \\ \\ |< 100% 5em 5em >| |RE|0|Receiver disable (reset state)| |:::|1|Receiver enable| |TE|0|Transmitter disable (reset state)| |:::|1|Transmitter enable| |RXNEIE|0|Receiver not empty interrupt disable (reset state)| |:::|1|Receiver not empty interrupt enable| |TCIE|0|Transmission complete interrupt disable (reset state)| |:::|1|Transmission complete enable| |TXEIE|0|Transmitter empty interrupt disable (reset state)| |:::|1|Transmitter empty interrupt enable| |M|0|8 data bits (reset state)| |:::|1|9 data bits enable| |UE|0|USART disable (reset state)| |:::|1|USART enable| \\ ==== USART_CR2 - Configuration register 2 ==== \\ {{usart_reg_cr2.svg}} \\ \\ |< 100% 5em 5em >| |STOP|00| 1 stop bit (reset state)| |:::|01| 0,5 stop bit| |:::|10| 2 stop bit| |:::|11| 1,5 stop bit| \\ ==== USART_BRR - Baud rate register ==== \\ {{usart_reg_brr.svg}} \\ \\ |< 100% 5em 5em >| |Fraction|x|Defines fraction of PCLK divider| |Mantissa|x|Defines Mantissa of the PCLK divider| \\ ===== Status Register ===== ==== USART_SR - Status register ==== \\ {{usart_reg_sr.svg}} \\ \\ |< 100% 5em 5em >| |RXNE|0|Data is not received| |:::|1|Received data is ready to be read| |TC|0|Transmission **not** complete| |:::|1|Transmission complete| |TXE|0|Data is **not** transferred to the shift register| |:::|1|Data transferred to the shift register| \\ ===== Data Register ===== ==== USART_DR - Data register ==== \\ {{usart_reg_dr.svg}} \\ \\ * Reading from DR register reads from RXDR Buffer. * Writing to DR register writes to TXDR Buffer. \\ ===== Programming Example ===== ==== Setup GPIO ==== #include "reg_stm32f4xx.h" RCC->AHBENR[0] |= (0x1 << 0u); /* Enable GPIOA clock */ /* Configure GPIO pin A.0 and A.1 in alternate function mode. */ GPIOA->MODER &= ~(0xf << 0u); /* Clear existing mode bits 0 to 3. */ GPIOA->MODER |= (0xa << 0u); /* Set pin 0..1 to alternate function mode. */ GPIOA->OSPEEDR &= ~(0xff << 0u); /* Clear existing output speed bits 0 to 3. */ GPIOA->OSPEEDR |= (0xff << 0u); /* Set pin 0..1 to high speed (100MHz) mode. */ GPIOA->AFR[0] &= ~(0xff << 0u); /* Clear existing af bits 0 to 7. */ GPIOA->AFR[0] |= (0x88 << 0u); /* Set pin 0..1 to AF8 (UART4). */ \\ ==== Transmitting Data ==== #include "reg_stm32f4xx.h" RCC->APBENR[0] |= (0x1 << 19u); /* Enable UART4 clock */ UART4->CR1 |= (0x1 << 13u); /* Enable UART */ UART4->BRR |= (42000000 / 115200); /* Set baudrate to 115'200 */ UART4->CR1 |= (0x1 << 3u); /* Enable transmission */ UART4->DR = data_send[0]; /* Send first data */ while(!(UART4->SR & (0x1 << 7u))); /* Wait til TXE flag is set */ UART4->DR = data_send[1]; /* Send first data */ while(!(UART4->SR & (0x1 << 7u))); /* Wait til TXE flag is set */ UART4->DR = data_send[2]; /* Send last data */ while(!(UART4->SR & (0x1 << 6u))); /* Wait til TC flag is set */ \\ ==== Receiving Data ==== #include "reg_stm32f4xx.h" RCC->APBENR[0] |= (0x1 << 19u); /* Enable UART4 clock */ UART4->CR1 |= (0x1 << 13u); /* Enable UART */ UART4->BRR |= (42000000 / 115200); /* Set baudrate to 115'200 */ UART4->CR1 |= (0x1 << 2u); /* Enable receiver */ while(!(UART4->SR & (0x1 << 5u))); /* Wait til RXNE flag is set */ data_received = UART4->DR /* Read data */ \\