USART_串口通讯1

一、编程要点总结

1、初始化USART1相关GPIO

2、初始化USART结构体

3、 配置中断优先级(NVIC)

4、串口使能

5、写中断函数

二、代码分析

1、初始化USART1相关GPIO

GPIO_InitTypeDef GPIO_InitStructure;									//定义GPIO初始化结构体

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);	//打开GPIO时钟
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;				//选择串口接收引脚
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;	                //浮空输入
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;				//选择串口发送引脚
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;				//复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;			//输出速率
	GPIO_Init(GPIOA,&GPIO_InitStructure);

2、初始化USART结构体

USART_InitTypeDef USART_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);	                //开启串口1时钟
	USART_InitStructure.USART_BaudRate = 115200;	                //设置串口波比特率
	USART_InitStructure.USART_StopBits =USART_StopBits_1 ;            //停止位
	USART_InitStructure.USART_Parity =USART_Parity_No;		//校验位  
	USART_InitStructure.USART_WordLength =USART_WordLength_8b ;        //数据位
	USART_InitStructure.USART_Mode =USART_Mode_Rx|USART_Mode_Tx;        //选择串口模式
	USART_InitStructure.USART_HardwareFlowControl =USART_HardwareFlowControl_None;//配置硬件控制流
	USART_Init(USART1, &USART_InitStructure);

3、 配置中断优先级(初始化NVIC结构体)

扫描二维码关注公众号,回复: 1053167 查看本文章
static void NVIC_Configuration(void)						//配置中断向量控制器
{
	NVIC_InitTypeDef NVIC_InitStructure;									//
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);				//选择中断控制器组
	
	NVIC_InitStructure.NVIC_IRQChannel =USART1_IRQn;			//选择中断源
	NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE;				//使能中段
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1;//抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority =1;			//子优先级
	NVIC_Init(&NVIC_InitStructure);						//初始化结构体将值写入
	
	
}

4、串口使能

USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);					//串口接收使能
USART_Cmd(USART1, ENABLE)						//串口使能

5、写中断函数

//串口发送一个字节   串口号    数据
void USARTSend_Byes(USART_TypeDef* USARTx, uint8_t Data)
{
	USART_SendData(USARTx,Data);				//发送数据到USARTE
	while(USART_GetFlagStatus(USARTx,USART_FLAG_TXE)==RESET);//等待数据发送完成
}

三、结构体&库函数

1、USART结构体 

typedef struct
{
  uint32_t USART_BaudRate;            /*!< 串口波特率 */

  uint16_t USART_WordLength;          /*!< 数据位*/

  uint16_t USART_StopBits;            /*!< 停止位 */

  uint16_t USART_Parity;              /*!<校验位 */
 
  uint16_t USART_Mode;                /*!<出口模式*/

  uint16_t USART_HardwareFlowControl; /*!< 硬件配置流*/
} USART_InitTypeDef;

2、串口中断使能函数

USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState)
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
@brief 指定USART 使能或者使能
@param1:串口号USARTx     (1-5)
@param2:中断源
@param3:使能或使能

 TUSART_IT 值
USART_IT 描述
USART_IT_PE 奇偶错误中断
USART_IT_TXE 发送中断
USART_IT_TC 传输完成中断
USART_IT_RXNE 接收中断
USART_IT_IDLE 空闲总线中断
USART_IT_LBD LIN 中断检测中断
USART_IT_CTS CTS 中断
USART_IT_ERR 错误中断

3、串口使能函数

USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState)
USART_Cmd(USART1, ENABLE);
@brief 串口通讯总使能
 
@param1:串口号USARTx     (1-5)
@param2:使能或失能

4、串口数据发送函数

USART_SendData(USART_TypeDef* USARTx, uint8_t Data)
USART_SendData(USARTx,Data)
@brief 使串口发送数据
 
@param1:串口号USARTx     (1-5)
@param2:要发送的数据      (一个字节 字符型)

5、检测USART数据是否发送完成

USART_GetFlagStatus(USART_TypeDef* USARTx, u16 USART_FLAG)
USART_GetFlagStatus(USARTx,USART_FLAG_TXE)    (TXE发送寄存器空标志位)
@brief 检查USART 相应标志位状态 
 
@param1:串口号USARTx     (1-5)
@param2:要检测的相应寄存器(位)

四、程序总源码

usart.c文件

#include "usart.h"


static void NVIC_Configuration(void)						//配置中断向量控制器
{
	NVIC_InitTypeDef NVIC_InitStructure;					//
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);				//选择中断控制器组
	
	NVIC_InitStructure.NVIC_IRQChannel =USART1_IRQn;			//选择中断源
	NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE;				//使能中段
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1;                //抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority =1;			//子优先级
	NVIC_Init(&NVIC_InitStructure);						//初始化结构体将值写入
	
	
}


void USART_config(void)								//串口初始化配置函数
{
	
	GPIO_InitTypeDef GPIO_InitStructure;					//定义GPIO初始化结构体
	USART_InitTypeDef USART_InitStructure;					//定义GPIO初始化结构体
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);	            //打开GPIO时钟
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;				//选择串口接收引脚
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;	                //浮空输入
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;				//选择串口发送引脚
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;				//复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;			//输出速率
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);	                //开启串口1时钟
	USART_InitStructure.USART_BaudRate = 115200;				    //设置串口波比特率
	USART_InitStructure.USART_StopBits =USART_StopBits_1 ;                        //停止位
	USART_InitStructure.USART_Parity =USART_Parity_No;		              //校验位  
	USART_InitStructure.USART_WordLength =USART_WordLength_8b ;                    //数据位
	USART_InitStructure.USART_Mode =USART_Mode_Rx|USART_Mode_Tx;                  //选择串口模式
	USART_InitStructure.USART_HardwareFlowControl =USART_HardwareFlowControl_None;//配置硬件控制流
	USART_Init(USART1, &USART_InitStructure);
	
	NVIC_Configuration();							//调用中断控制函数
	
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);					//串口接收使能
	
	USART_Cmd(USART1, ENABLE);							//串口使能
	
}


//串口发送函数   串口号    数据
void USARTSend_Byes(USART_TypeDef* USARTx, uint8_t Data)
{
	USART_SendData(USARTx,Data)					//发送数据到USARTE
	while(USART_GetFlagStatus(USARTx,USART_FLAG_TXE)==RESET);        //等待数据发送完成
                                                                         //(TXE发送寄存器空标志位)
}

usart.h文件

#ifndef __USART_H
#define __USART_H

#include "stm32f10x.h"

void USART_config(void);
void USARTSend_Byes(USART_TypeDef* USARTx, uint8_t Data);


#endif

main.c

#include "stm32f10x.h"   
#include "bsp_led.h"
#include "usart.h"
int main(void)
{
	USART_config();                //串口初始化配置函数
	USARTSend_Byes(USART1,100);     //串口发送函数
  while(1);
}

猜你喜欢

转载自blog.csdn.net/qq_41985317/article/details/80378059