Driver_USART.c
#include "Driver_USART.h"
void Driver_USART1_Init(void)
{
RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
GPIOA->CRH |= GPIO_CRH_CNF9_1;
GPIOA->CRH &= ~GPIO_CRH_CNF9_0;
GPIOA->CRH |= GPIO_CRH_MODE9;
GPIOA->CRH &= ~GPIO_CRH_CNF10_1;
GPIOA->CRH |= GPIO_CRH_CNF10_0;
GPIOA->CRH &= ~GPIO_CRH_MODE10;
USART1->BRR = 0x271;
USART1->CR1 &= ~USART_CR1_M;
USART1->CR1 &= ~USART_CR1_PCE;
USART1->CR2 &= ~USART_CR2_STOP;
USART1->CR1 |= USART_CR1_TE;
USART1->CR1 |= USART_CR1_RE;
USART1->CR1 |= USART_CR1_RXNEIE;
USART1->CR1 |= USART_CR1_IDLEIE;
NVIC_SetPriorityGrouping(3);
NVIC_SetPriority(USART1_IRQn, 2);
NVIC_EnableIRQ(USART1_IRQn);
USART1->CR1 |= USART_CR1_UE;
}
void Driver_USART1_SendChar(uint8_t byte)
{
while ((USART1->SR & USART_SR_TXE) == 0)
;
USART1->DR = byte;
}
void Driver_USART1_SendString(uint8_t *str, uint16_t len)
{
for (uint16_t i = 0; i < len; i++)
{
Driver_USART1_SendChar(str[i]);
}
}
uint8_t Driver_USART1_ReceiveChar(void)
{
while ((USART1->SR & USART_SR_RXNE) == 0)
;
return USART1->DR;
}
void Driver_USART1_ReceiveString(uint8_t buff[], uint8_t *len)
{
uint8_t i = 0;
while (1)
{
while ((USART1->SR & USART_SR_RXNE) == 0)
{
if (USART1->SR & USART_SR_IDLE)
{
*len = i;
return;
}
}
buff[i] = USART1->DR;
i++;
}
}
uint8_t buff[100] = {0};
uint8_t len = 0;
uint8_t isToSend = 0;
void USART1_IRQHandler(void)
{
if (USART1->SR & USART_SR_RXNE)
{
buff[len] = USART1->DR;
len++;
}
else if (USART1->SR & USART_SR_IDLE)
{
USART1->SR;
USART1->DR;
isToSend = 1;
}
}
int fputc(int c, FILE *file)
{
Driver_USART1_SendChar(c);
return c;
}
Driver_USART.h
#ifndef __DRVIER_USART_H
#define __DRVIER_USART_H
#include "stm32f10x.h"
#include "stdio.h"
void Driver_USART1_Init(void);
void Driver_USART1_SendChar(uint8_t byte);
void Driver_USART1_SendString(uint8_t *str, uint16_t len);
uint8_t Driver_USART1_ReceiveChar(void);
void Driver_USART1_ReceiveString(uint8_t buff[], uint8_t *len);
#endif
main.h
extern uint8_t buff[100] = {0};
extern uint8_t len = 0;
extern uint8_t isToSend = 0;
void main(){
while(1){
if(isToSend){
Driver_USART1_SendString(buff, len);
isToSend = 0;
len = 0;
}
}
}