STM32小白入门(第六天)-------串口通信

今天要讲的是串口通信,个人觉得挺重要的,以后USART、蓝牙通信,485等等都要用到串口,面试官也喜欢问一些串口的问题,比如问你串口参数,数据位几位,波特率多少,还会问你怎样设置串口等等。

一、串口概述

1. 定义

串口通信是一种设备间非常常用的串行,以比特位的形式发送或接收数据,电子工程师经常使用这种方式来调试数据

2. 开发板硬件用于串口跟PC相连的时候有以下注意事项:

A. 使用到usb转串口,所以得安装驱动

B. 跳线帽要进行短接

STM32小白入门(第六天)-------串口通信_第1张图片

STM32小白入门(第六天)-------串口通信_第2张图片


STM32小白入门(第六天)-------串口通信_第3张图片

STM32小白入门(第六天)-------串口通信_第4张图片

STM32小白入门(第六天)-------串口通信_第5张图片

二、程序设计

1、设置引脚功能复用

		RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); 	//使能GPIOA时钟
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);	//使能USART1时钟
	 
		//串口1对应引脚复用映射
		GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);//GPIOA9复用为USART1
		GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);//GPIOA10复用为USART1
		
		//USART1端口配置
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;//GPIOA9与GPIOA10
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;		//复用功能
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	//速度50MHz
		GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; 		//推挽复用输出
		GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; 		//上拉
		GPIO_Init(GPIOA,&GPIO_InitStructure); 			//初始化PA9,PA10

2、串口参数配置

		//USART1 初始化设置
		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
		USART_Cmd(USART1, ENABLE);  						//使能串口1 
	
	//USART_OverSampling8Cmd(USART1,ENABLE);//在超高速的波特率才打开,如5MHz频率。正常很少有设备达到这么高的速度
	

3、串口中断配置

		USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);			//开启相关中断
	
		//Usart1 NVIC 配置
		NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;		//串口1中断通道
		NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;	//抢占优先级3
		NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;		//子优先级3
		NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
		NVIC_Init(&NVIC_InitStructure);					//根据指定的参数初始化VIC寄存器
	

4. 发送函数的编写

	void usart1_send_bytes(uint8_t *pbuf,uint32_t len)
	{
		while(len--)
		{
			USART_SendData(USART1,*pbuf++);
			while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
		}
	}
	
	void usart1_send_str(char *pbuf)
	{
		while(pbuf && *pbuf)
		{
			USART_SendData(USART1,*pbuf++);
			while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
		}
	}

5、重定向printf函数

STM32小白入门(第六天)-------串口通信_第6张图片

//重定义fputc
intfputc(int ch,FILE *f)
{
        USART_SendData(USART1,ch);
        while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
 
        returnch;
}



你可能感兴趣的:(STM32)