I have written code for sending data on uart0 of TM4C123G LaunchPad Evaluation Board.
Problem is I am getting wrong data on PC. For example if I send 'A' char then I receive 'P' on PC.
If I send 'B' then I receive '<' on PC.
Below is my code:
/* UART regsiter , UART0_BASE 0x4000C000 */
#define RB_UARTCTL_UARTEN REG32_BIT_0
#define RB_UARTFR_TXFE REG32_BIT_7
#define RB_UARTFR_RXFE REG32_BIT_4
#define RB_UARTFR_TXFF REG32_BIT_5
#define RB_UARTLCRH_BRK REG32_BIT_0
#define RB_UARTLCRH_PEN REG32_BIT_1
#define RB_UARTLCRH_STP2 REG32_BIT_3
#define RB_UARTLCRH_FEN REG32_BIT_4
#define RB_UARTLCRH_WLEN8 ((uint32_t)0x60)
#define RB_UARTCC_CS ((uint32_t)0x00)
/* SYSCTL regsiter , SYSCTL_BASE 0x400FE000UL */
/* Register 9, GPIOHBCTL, offset 0x06C */
#define RB_GPIOHBCTL_PORTA_AHB REG32_BIT_0
#define RB_GPIOHBCTL_PORTF_AHB REG32_BIT_5
/* Register 60, RCGCGPIO, offset 0x608 */
#define RB_RCGCGPIO_PORTA_CLK REG32_BIT_0
#define RB_RCGCGPIO_PORTF_CLK REG32_BIT_5
/* Register 63, PRGPIO, offset 0x618 */
#define RB_RCGCUART_UART0_CLK REG32_BIT_0
/* Register 108, PRGPIO, offset 0xA08 */
#define RB_PRGPIO_PORTA_READY REG32_BIT_0
#define RB_PRGPIO_PORTF_READY REG32_BIT_5
/* Register 111, PRUART, offset 0xA18 */
#define RB_PRUART_UART0_READY REG32_BIT_0
/* SysTick regsiter , SysTick_BASE 0xE000E000UL */
/* Register 1, STCTRL, offset 0x010 */
#define RB_STCTRL_ENABLE REG32_BIT_0
#define RB_STCTRL_INTEN REG32_BIT_1
#define RB_STCTRL_CLK_SRC REG32_BIT_2
void main(void)
{
/* clock init at 80Mhz */
clock_init();
uart_1_init();
while(1U)
{
uart1OutByte('B');
}
}
void uart_1_init(void)
{
/* enable uart 0 */
SYSCTL->RCGCUART |= RB_RCGCUART_UART0_CLK; /* enable clock */
while(! (SYSCTL->PRUART & RB_PRUART_UART0_READY)); /* while periph ready */
/* enable clock for tx pin PA1 */
SYSCTL->RCGCGPIO |= RB_RCGCGPIO_PORTA_CLK; /* enable PORTA clock */
while(! (SYSCTL->PRGPIO & RB_PRGPIO_PORTA_READY)); /* while periph ready */
SYSCTL->GPIOHBCTL |= RB_GPIOHBCTL_PORTA_AHB; /* enable access to AHB bus */
/* enable clock for rx pin PA0 */
SYSCTL->RCGCGPIO |= RB_RCGCGPIO_PORTA_CLK; /* enable PORTB clock */
while(! (SYSCTL->PRGPIO & RB_PRGPIO_PORTA_READY)); /* while periph ready */
SYSCTL->GPIOHBCTL |= RB_GPIOHBCTL_PORTA_AHB; /* enable access to AHB bus */
/* disable uart */
UART0->CTL &= (uint32_t)(~RB_UARTCTL_UARTEN);
/* wait while tx not empty */
while(!(UART0->FR & RB_UARTFR_TXFE));
/* wait while rx not empty */
while(!(UART0->FR & RB_UARTFR_RXFE))
{
(void)UART0->DR; /* dummy read the register */
}
/* flush the tx fifo */
UART0->LCRH &= (uint32_t)(~RB_UARTLCRH_FEN);
/* set 9600 baud rate */
UART0->IBRD = 520U; /* 80,000,000 / (16 * 9600) = 520.8333 */
UART0->FBRD = 53U; /* int(0.8333 * 64 + 0.5)= 53 */
/* uart line control */
UART0->LCRH |= (RB_UARTLCRH_WLEN8 | RB_UARTLCRH_FEN); /* 8 bit word length , fifo enabled */
/* one stop bit , parity disabled, break diabled */
UART0->LCRH &= (uint32_t)(~(RB_UARTLCRH_BRK | RB_UARTLCRH_PEN | RB_UARTLCRH_STP2));
/* set clock */
UART0->CC = RB_UARTCC_CS; /* set system clock as clock */
/* set PA1 as uart tx */
GPIOA_AHB->AFSEL |= REG32_BIT_1; /* alternate mode select */
GPIOA_AHB->ODR &= (u32_t)(~REG32_BIT_1); /* not open drain */
GPIOA_AHB->AMSEL &= (u32_t)(~REG32_BIT_1); /* analog function disabled */
GPIOA_AHB->PUR &= (u32_t)(~REG32_BIT_1); /* pull up disabled */
GPIOA_AHB->PDR &= (u32_t)(~REG32_BIT_1); /* pull down disabled */
GPIOA_AHB->DR2R |= REG32_BIT_1; /* 2mA drive enable */
GPIOA_AHB->SLR &= (u32_t)(~REG32_BIT_1); /* slew disabled */
GPIOA_AHB->PCTL = (GPIOA_AHB->PCTL & 0xFFFFFF0FU) | 0x00000010U; /* select uar functionality */
GPIOA_AHB->DEN |= REG32_BIT_1; /* digital function enabled */
/* set PA0 as uart rx */
GPIOA_AHB->AFSEL |= REG32_BIT_0; /* alternate mode select */
GPIOA_AHB->ODR &= (u32_t)(~REG32_BIT_0); /* not open drain */
GPIOA_AHB->AMSEL &= (u32_t)(~REG32_BIT_0); /* analog function disabled */
GPIOA_AHB->PUR &= (u32_t)(~REG32_BIT_0); /* pull up disabled */
GPIOA_AHB->PDR &= (u32_t)(~REG32_BIT_0); /* pull down disabled */
GPIOA_AHB->DR2R |= REG32_BIT_0; /* 2mA drive enable */
GPIOA_AHB->SLR &= (u32_t)(~REG32_BIT_0); /* slew disabled */
GPIOA_AHB->PCTL = (GPIOA_AHB->PCTL & 0xFFFFFFF0U) | 0x00000001U; /* select uart functionality */
GPIOA_AHB->DEN |= REG32_BIT_0; /* digital function enabled */
/* enable uart */
UART0->CTL |= RB_UARTCTL_UARTEN; /* enable uart */
} /* function ends here */
uint8_t uart1InByte(uint8_t *error)
{
uint16_t temp;
while( UART0->FR & RB_UARTFR_RXFE );
temp = (uint16_t)( UART0->DR & 0xFFFU ); /* only 12 bits are required */
*error = (uint8_t)( (temp >> 8U) & 0x0FU );
return ( (uint8_t)(temp & 0xFFU) );
} /* function ends here */
void uart1OutByte(uint8_t temp)
{
while( UART0->FR & RB_UARTFR_TXFF );
UART0->DR = (uint32_t)temp;
} /* function ends here */