一 在STM32F1x系列串口通信实验中,常用的寄存器有:
(1)USART_SR 状态寄存器
(2)USART_DR 数据寄存器
(3)USART_BRR 波特率寄存器
(4) USART_CR 使能位
二 串口操作相关的库函数(省略入口参数):
(1)void USART_Init() ; //串口初始化:波特率,数据字长,奇偶校验,硬件流控以及收发使能
(2)void USART_Cmd ; //使能串口
(3)void USART_ITConfig() ; //使能相关中断
(4)void USART_SendData() ; //发送数据到串口,DR
(5)uint16_t USART_ReceiveData() ; //接受数据,从DR读取接受到的数据
(6)FlagStatus USART_GetFlagStatus() ; //获取状态标志位
(7)void USART_ClearFlag() ; //清除状态标志位
(8)ITStatus USART_GetITStatus() ; //获取中断状态标志位
(9)void USART_ClearITPendingBit() ; //清除中断状态标志位
三 串口配置的一般步骤:
(1)串口时钟使能,GPIO时钟使能:RCC_APB2PeriphClockCmd() ;
(2)串口复位:USART_DeInit() ; 这一步不是必须的
(3)GPIO端口模式设置:GPIO_Init() ; 模式设置为GPIO_Mode_AF_PP
(4)串口参数初始化:USART_Init() ;
(5)开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤):
NVIC_Init() ;
USART_ITConfig() ;
(6)使能串口:USART_Cmd() ;
(7)编写中断处理函数:USARTx_IRQHandler() ;
(8)串口数据的收发:
void USART_SendData() ; //发送数据到串口,DR
uint16_t USART_ReceiveData() ; //接受数据,从DR读取接受到的数据
(9)串口传输状态获取:
FlagStatus USART_GetFlagStatus(RT_FLAUSART_TypeDef * USARTx , uint16_t USART_FLAG) ;
void USART_ClearITPendingBit(RT_FLAUSART_TypeDef * USARTx , uint16_t USART_IT) ;
程序中的main.c文件 代码如下:
#include "stm32f10x.h"
void My_USART1_Init()
{
GPIO_InitTypeDef GPIO_InitStruct ;
USART_InitTypeDef USART_InitStruct ;
NVIC_InitTypeDef NVIC_InitStruct ;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE) ; //GPIO时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE) ; //´串口时钟使能
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP ; //GPIO端口模式设置
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9 ;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz ;
GPIO_Init(GPIOA,&GPIO_InitStruct) ;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING ; //GPIO端口模式设置
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10 ;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz ;
GPIO_Init(GPIOA,&GPIO_InitStruct) ;
USART_InitStruct.USART_BaudRate = 115200 ;
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None ;
USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx ;
USART_InitStruct.USART_Parity = USART_Parity_No ;
USART_InitStruct.USART_StopBits = USART_StopBits_1 ;
USART_InitStruct.USART_WordLength = USART_WordLength_8b ;
USART_Init(USART1,&USART_InitStruct) ;
USART_Cmd(USART1,ENABLE) ; //串口使能
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE) ; //打开接收中断
NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn ;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE ;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1 ;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1 ;
NVIC_Init(&NVIC_InitStruct) ;
}
void USART1_IRQHandler(void) //中断服务函数
{
u8 res ;
if(USART_GetITStatus(USART1,USART_IT_RXNE))
{
res = USART_ReceiveData(USART1) ;
USART_SendData(USART1,res) ;
}
}
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //系统中断优先级分配为2
My_USART1_Init() ;
while(1) ;
}
打开串口调试助手调试:
成功运行