|
|
|
@ -21,25 +21,11 @@
|
|
|
|
|
#include"pin.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define CR1_TE_EN (1U << 3)
|
|
|
|
|
#define CR1_UE_EN (1U << 0)
|
|
|
|
|
|
|
|
|
|
#define ISR_TXE (1U << 7)
|
|
|
|
|
|
|
|
|
|
#define UART_BAUD 115200
|
|
|
|
|
#define SYST_CLK 8000000
|
|
|
|
|
#define AF1 0x01
|
|
|
|
|
|
|
|
|
|
#define USART_CHANNEL ((USART_TypeDef *)channel)
|
|
|
|
|
void print_Usart(char *ptr)
|
|
|
|
|
{
|
|
|
|
|
uint16_t len = 0;
|
|
|
|
|
|
|
|
|
|
while(ptr[len] != '\0')
|
|
|
|
|
{
|
|
|
|
|
usartSendChar(ptr[len]);
|
|
|
|
|
len++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void usartInit( usartNo_t channel,
|
|
|
|
|
pinNo_t pinTx,
|
|
|
|
@ -47,7 +33,7 @@ void usartInit( usartNo_t channel,
|
|
|
|
|
uint32_t baud,
|
|
|
|
|
usartWordLength_t lenght,
|
|
|
|
|
uint8_t parity,
|
|
|
|
|
uint8_t hwFlowControl)
|
|
|
|
|
usartHwFlowCtrl_t flowCtrl)
|
|
|
|
|
{
|
|
|
|
|
/* COnfiguring teh pins for the uart*/
|
|
|
|
|
usartInitTx(pinTx);
|
|
|
|
@ -63,13 +49,20 @@ void usartInit( usartNo_t channel,
|
|
|
|
|
RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
usartSetBaudRate(channel,baud);
|
|
|
|
|
|
|
|
|
|
//enables the transmit and sets all the other values to 0 = Default
|
|
|
|
|
USART_CHANNEL->CR1 = CR1_TE_EN; // The = 0 is on purpose to set uart to default mode.
|
|
|
|
|
|
|
|
|
|
USART_CHANNEL->CR1 = 0; // The = 0 is on purpose to set uart to default mode.
|
|
|
|
|
USART_CHANNEL->CR2 = 0; // The = 0 is on purpose to set uart to default mode.
|
|
|
|
|
USART_CHANNEL->CR3 = 0; // The = 0 is on purpose to set uart to default mode.
|
|
|
|
|
|
|
|
|
|
USART_CHANNEL->CR1 |= USART_CR1_TE; //Enbale trasnmit
|
|
|
|
|
USART_CHANNEL->CR1 |= USART_CR1_RE; //Enable recieve
|
|
|
|
|
|
|
|
|
|
//UART Enable
|
|
|
|
|
USART_CHANNEL->CR1 |= CR1_UE_EN;
|
|
|
|
|
usartSetBaudRate(channel,baud);
|
|
|
|
|
usartSetWordLenght(channel, lenght);
|
|
|
|
|
usartSetHwFlowCtrl(channel, flowCtrl);
|
|
|
|
|
|
|
|
|
|
//UART Enable shall be allwas date a th ene of configuration.
|
|
|
|
|
USART_CHANNEL->CR1 |= USART_CR1_UE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void usartInitTx(pinNo_t pinTx)
|
|
|
|
@ -84,9 +77,24 @@ void usartInitRx(pinNo_t pinRx)
|
|
|
|
|
pinSetAlternate(pinRx, AF1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//this one is special as the register bist's don't follow eachother.
|
|
|
|
|
void usartSetWordLenght(usartNo_t channel, usartWordLength_t lenght)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
if(lenght == seven)
|
|
|
|
|
{
|
|
|
|
|
USART_CHANNEL->CR1 |= USART_CR1_M1;
|
|
|
|
|
USART_CHANNEL->CR1 &= ~USART_CR1_M0;
|
|
|
|
|
}
|
|
|
|
|
else if (lenght == eight)
|
|
|
|
|
{
|
|
|
|
|
USART_CHANNEL->CR1 &= ~USART_CR1_M0;
|
|
|
|
|
USART_CHANNEL->CR1 &= ~USART_CR1_M1;
|
|
|
|
|
}
|
|
|
|
|
else if(lenght == nine)
|
|
|
|
|
{
|
|
|
|
|
USART_CHANNEL->CR1 &= ~USART_CR1_M1;
|
|
|
|
|
USART_CHANNEL->CR1 |= USART_CR1_M0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static uint16_t usartComputeBaudRate(uint32_t clk, uint32_t baud)
|
|
|
|
@ -100,9 +108,42 @@ void usartSetBaudRate(usartNo_t channel, uint32_t baud)
|
|
|
|
|
USART_CHANNEL->BRR = usartComputeBaudRate(SYST_CLK,baud);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void usartSendChar(int ch)
|
|
|
|
|
void usartSetHwFlowCtrl(usartNo_t channel, usartHwFlowCtrl_t flowCtrl)
|
|
|
|
|
{
|
|
|
|
|
if(flowCtrl == noFlowControl)
|
|
|
|
|
{
|
|
|
|
|
USART_CHANNEL->CR3 &= ~USART_CR3_CTSE;
|
|
|
|
|
USART_CHANNEL->CR3 &= ~USART_CR3_RTSE;
|
|
|
|
|
}
|
|
|
|
|
else if(flowCtrl == cts)
|
|
|
|
|
{
|
|
|
|
|
USART_CHANNEL->CR3 |= USART_CR3_CTSE;
|
|
|
|
|
}
|
|
|
|
|
else if(flowCtrl == rts)
|
|
|
|
|
{
|
|
|
|
|
USART_CHANNEL->CR3 |= USART_CR3_RTSE;
|
|
|
|
|
}
|
|
|
|
|
else if(flowCtrl == ctsRts)
|
|
|
|
|
{
|
|
|
|
|
USART_CHANNEL->CR3 |= USART_CR3_CTSE;
|
|
|
|
|
USART_CHANNEL->CR3 |= USART_CR3_RTSE;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void print_Usart(char *ptr)
|
|
|
|
|
{
|
|
|
|
|
uint16_t len = 0;
|
|
|
|
|
|
|
|
|
|
while(ptr[len] != '\0')
|
|
|
|
|
{
|
|
|
|
|
usartSendChar(ptr[len]);
|
|
|
|
|
len++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void usartSendChar(uint8_t ch)
|
|
|
|
|
{
|
|
|
|
|
// Make sure that TX buffer is empty
|
|
|
|
|
while(!(USART2->ISR & ISR_TXE)){}
|
|
|
|
|
USART2->TDR = (ch & 0xFF);
|
|
|
|
|
while(!(USART2->ISR & USART_ISR_TXE)){}
|
|
|
|
|
USART2->TDR = ch;
|
|
|
|
|
}
|
|
|
|
|