目录
一、更新时间
2022.1.23
二、相关器件
stm32f103c8t6最小系统板,CH340。
三、硬件连接
PA9与PA10。
四、现象与事件
接收电脑发送的数据,再发回给电脑。
五、具体操作:
UART(通用异步收发器)为异步通讯(无时钟),所以要双方约定好波特率。需要定义的参数如下:
1.起始位;
2.数据位;
3.奇偶校验位;(可以没有)
4.停止位;
5.波特率。
5.1 常用的串口相关寄存器以及波特率计算
USART_SR状态寄存器:串口传输当前的状态数据。
USART_DR数据寄存器:数据的中转站。
USART_CR1控制寄存器:发送接受使能以及一些中断使能。
USART_BRR波特率寄存器。
其中波特率计算方法如下:

其中PCLK1用于USART2、3、4、5;PCLK2用于USART1。PCLK2时钟最高可达72MHz,而PCLK1最大36MHz。比如需要设置串口1波特率为115200,则:

则DIV_Fraction=16*0.625=1=0x01;
DIV_Mantissa=39=0x27。
所以BRR寄存器的值设置为0x0271。
5.1 串口配置步骤
1.串口时钟使能
void uart_init()
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);	
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
}2.串口复位(可有可无)
3.GPIO模式设置
void uart_init()
{ 
  GPIO_InitTypeDef GPIO_InitStructure;
	
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
  GPIO_Init(GPIOA, &GPIO_InitStructure); 
  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空
  GPIO_Init(GPIOA, &GPIO_InitStructure);
}4.串口参数初始化
void uart_init()
{
 
	USART_InitTypeDef USART_InitStructure;
	
	USART_InitStructure.USART_BaudRate = 115200;//波特率
    USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无硬件流
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//发送与接收使能
	USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位1位
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//位数无奇偶校验8位
}
5. 开启中断并初始化NVIC
6.使能串口
void uart_init()
{
 
	USART_InitTypeDef USART_InitStructure;
	
	USART_InitStructure.USART_BaudRate = 115200;//波特率
    USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无硬件流
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//发送与接收使能
	USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位1位
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//位数无奇偶校验8位
    USART_Init(USART1, &USART_InitStructure); 
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断,接收数据就跳中断子函数
    USART_Cmd(USART1, ENABLE);
}
7.编写中断处理函数
void USART1_IRQHandler(void)                	//中断服务函数
	{
	u8 Res;
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //判断是否接收数据
	{
		Res =USART_ReceiveData(USART1);	//读取数据
        USART_SendDats(USART1,Res)	; //接受的数据发回去
     } 8.串口数据收发
9.串口传输状态获取










