–Usart.h
#ifndef __Usart_h
#define __Usart_h
#include "stm32f10x.h"
int fputc(int ch, FILE *f);
static void USART1_RCC_Configuration(void);
static void USART1_GPIO_Configuration(void);
void USART1_Configuration();
void USART1_NVIC_Configuration(void);
#endif
–Usart.c
#include <stdio.h>
#include "Usart.h"
#include "stm32f10x.h"
static void USART1_RCC_Configuration(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |
RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO, ENABLE); //打开时钟使能
}
static void USART1_GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入模式
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //推完输出模式
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
void USART1_Configuration()
{
USART_InitTypeDef USART_InitStructure; //设置串口结构体
USART1_RCC_Configuration(); //时钟使能初始化
USART1_GPIO_Configuration(); //GPIO口使能初始化
USART_InitStructure.USART_BaudRate = 115200; //设置于串口一致的115200波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//设置数据位
USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位
USART_InitStructure.USART_Parity = USART_Parity_No; //校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //流控位
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //Rx 和 Tx 发送和读操作
USART_Init(USART1, &USART_InitStructure);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
USART_ITConfig(USART1, USART_IT_TXE, DISABLE); //关闭TXE检测位(最后一位)
USART_Cmd(USART1, ENABLE);
}
int fputc(int ch, FILE *f)
{
USART_SendData(USART1, (u8)ch);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
{}
return ch;
}
void USART1_NVIC_Configuration(void) //中断初始化
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //串口中断
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void USART1_IRQHandler(void)
{
uchar ucByte;
if(USART_GetFlagStatus(USART1,USART_FLAG_ORE)==SET) //ORE
{
USART_ClearFlag(USART1,USART_FLAG_ORE); //SR
USART_ReceiveData(USART1); //DR
}
if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
{
ucByte = USART_ReceiveData(USART1);
switch ( RcvState )
{
case STATE_RX_IDLE:
usRcvBufferPos = 0;
ucTPSBuf[usRcvBufferPos++] = ucByte;
RcvState = STATE_RX_RCV;
THComProTimersEnable();
break;
case STATE_RX_RCV:
if( usRcvBufferPos < THCOMPRO_SER_BUF_SIZE_MAX )
{
ucTPSBuf[usRcvBufferPos++] = ucByte;
}
else
{
RcvState = STATE_RX_ERROR;
}
THComProTimersEnable();
break;
default:
break;
}
//USART_ClearITPendingBit(USART1, USART_IT_RXNE);
USART_ClearFlag(USART1,USART_IT_RXNE);
}
if(USART_GetITStatus(USART1, USART_IT_TXE) == SET)
{
USART_ClearFlag(USART1, USART_IT_TXE);
if( usSndBufferCount != 0 )
{
USART_SendData(USART1, (char)*pucSndBufferCur);
pucSndBufferCur++;
usSndBufferCount--;
}
else
{
while (USART_GetITStatus(USART1, USART_IT_TC) == SET);
USART_ClearFlag(USART1, USART_IT_TC);
THComProSerialEnable( TRUE, FALSE );
SndState = STATE_TX_IDLE;
}
}
if(USART_GetFlagStatus(USART1, USART_FLAG_IDLE) != RESET)
{
USART_ReceiveData(USART1);
}
if(USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET)
{
USART_ClearFlag(USART1,USART_FLAG_ORE);
USART_ReceiveData(USART1);
}
if(USART_GetFlagStatus(USART1, USART_FLAG_NE) != RESET)
{
USART_ReceiveData(USART1);
}
if(USART_GetFlagStatus(USART1, USART_FLAG_FE) != RESET)
{
USART_ReceiveData(USART1);
}
}