stm32串口通信

1.基础知识
在这里插入图片描述
并行通信可以比作多车道,串行通信可以理解为单通道。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.应用举例
++(1.)常用寄存器

USART_SR状态寄存器
USART_DR数据寄存器
USART_BRR波特率寄存器 

++(2.)串口相关库函数

void USART_Init(); //串口初始化:波特率,数据字长,奇偶校验,硬件流控以及收发使能
void USART_Cmd();//使能串口
void USART_ITConfig();//使能相关中断

void USART_SendData();//发送数据到串口,DR
uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据

FlagStatus USART_GetFlagStatus();//获取状态标志位
void USART_ClearFlag();//清除状态标志位
ITStatus USART_GetITStatus();//获取中断状态标志位
void USART_ClearITPendingBit();//清除中断状态标志位

++(3.)一般步骤
在这里插入图片描述
++(4.)实例程序

#include "stm32f10x.h"

void Uart_init(void)//配置串口通信
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	
	//1.gpio的时钟使能
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	//2.gpio端口模式设置,设置为全双工串口通信状态
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//发送推挽
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);//PA9
	
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//接收浮空
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);//PA10
	
	//3.串口参数初始化
	USART_InitStructure.USART_BaudRate=115200;//设置波特率
	USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;//设置收发
	USART_InitStructure.USART_Parity=USART_Parity_No;//不进行奇偶校验
	USART_InitStructure.USART_StopBits=USART_StopBits_1;//设置停止位1位
	USART_InitStructure.USART_WordLength=USART_WordLength_8b;//设置有效数据八位
	USART_Init(USART1,&USART_InitStructure);//初始化串口
	
	//4.配置中断
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//开启接收中断
		//设置中断参数
	NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;//串口1中断
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//给串口1中断使能
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//设置抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//设置响应优先级
	NVIC_Init(&NVIC_InitStructure);
	
	//5.串口使能
	USART_Cmd(USART1,ENABLE);
	
}

//6.中断处理函数
void USART1_IRQHandler(void)
{
	u8 res;
	if(USART_GetITStatus(USART1,USART_IT_RXNE))//RXNE:读数据寄存器非空。0代表没有收到数据,1代表已经收到数据并且可以读出
		{
		 res= USART_ReceiveData(USART1); //从USART_DR寄存器读出数据
		 USART_SendData(USART1,res);//发送数据   
		}
}



int main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//只要涉及中断就要提前分组,并且只分一次
	Uart_init();
	while(1);//让程序停在这里,不然main瞬间就会执行完
}

注意
发送端(PA9)为复用推挽输出,接收端(PA10)为浮空输入模式。(详见中文参考手册外设的GPIO配置章节)。如果是正点原子的用户,实验的时候把模板里的usart.c移除掉,否则会报重复定义


在这里插入图片描述
39.0625的十六进制表示为27.1,操作BRR寄存器的第十六位配置结果就为0x0271.

发布了74 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/naruhina/article/details/99443333