(USART相关库函数在stm32f10x_usart.c和stm32f10x_usart.h文件中)。
对USART进行配置,具体步骤如下:
(1)使能串口时钟及GPIO端口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟
(2)GPIO端口模式设置,设置串口对应的引脚为复用功能 (也就是对应的引脚不是普通的GPIO功能,而是使用其对应的复用功能 (列如此处的TXD,RXD功能)
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
(3)初始化串口参数,包含波特率、字长、奇偶校验等参数
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef*
USART_InitStruct);
typedef struct
{
uint32_t USART_BaudRate; //波特率
uint16_t USART_WordLength; //字长(有8位和9位两种,通常用8位)
uint16_t USART_StopBits; //停止位
uint16_t USART_Parity; //校验位
uint16_t USART_Mode; //USART模式
uint16_t USART_HardwareFlowControl; //硬件流控制
} USART_InitTypeDef;
例如:
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 9600;//波特率设置
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
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; //收发模式为全双工(发送和接收可以同时进行)
USART_Init(USART1, &USART_InitStructure); //初始化串口1
(4)使能串口
void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState);
USART_Cmd(USART1, ENABLE); //使能串口1
(5)设置串口中断类型并使能
void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT,
FunctionalState NewState);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启接收中断
USART_ITConfig(USART1,USART_IT_TC, ENABLE);//开启发送中断
对应的串口中断类型可在stm32f10x_usart.h中查找到
(6)设置串口中断优先级,使能串口中断通道
NVIC初始化库函数是NVIC_Init()
(7)编写串口中断服务函数
USART1_IRQHandler
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
...//执行USART1接收中断内控制
}
void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t
USART_FLAG);
第二个参数为状态标志选项,可选参数可在stm32f10x_usart.h中查找到
例如:
void USART1_IRQHandler(void) //串口1中断服务程序
{
u8 r;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断
{
r =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据
USART_SendData(USART1,r);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET);
}
USART_ClearFlag(USART1,USART_FLAG_TC);
}