串口USART的学习

串口USART的配置步骤

具体步骤如下:
添加文件(USART相关库函数在stm32f10x_usart.c和
stm32f10x_usart.h文件中)。

(1)使能串口时钟及GPIO端口时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟

(2)GPIO端口模式设置,设置串口对应的引脚为复用功能

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //复用推挽输出模式
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //浮空输入模式

(3)初始化串口参数,包含波特率、字长、奇偶校验等参数

void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef*
USART_InitStruct);

typedef struct
{
  uint32_t USART_BaudRate;            //波特率
  uint16_t USART_WordLength;          //字长
  uint16_t USART_StopBits;            //停止位
  uint16_t USART_Parity;              //校验位
  uint16_t USART_Mode;                //USART模式
  uint16_t USART_HardwareFlowControl; //硬件流控制
} USART_InitTypeDef;

例如:


USART_InitTypeDef USART_InitStructure;
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

(4)使能串口

void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState);
USART_Cmd(USART1, ENABLE);  //使能串口1

(5)设置串口中断类型并使能

void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, 
FunctionalState NewState);

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启接收中断

USART_ITConfig(USART1,USART_IT_TC, ENABLE);

对应的串口中断类型可在stm32f10x_usart.h中查找到

(6)设置串口中断优先级,使能串口中断通道

	NVIC初始化库函数是NVIC_Init()

(7)编写串口中断服务函数

USART1_IRQHandler

ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
	...//执行USART1接收中断内控制
}
void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t 
USART_FLAG);

第二个参数为状态标志选项,可选参数可在stm32f10x_usart.h中查找到
例如:

void USART1_IRQHandler(void)                	//串口1中断服务程序
{
	u8 r;
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断
	{
		r =USART_ReceiveData(USART1);//(USART1->DR);	//读取接收到的数据
		USART_SendData(USART1,r);
		while(USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET);
	} 
	USART_ClearFlag(USART1,USART_FLAG_TC);
}

程序框架如下:

(1)初始化USART1,并使能串口接收中断等
(2)编写USART1中断函数
(3)编写主函数

usart.c

#include "usart.h"
#include "stdio.h" 
int fputc(int ch,FILE *p)  //函数默认的,在使用printf函数时自动调用
{
	USART_SendData(USART1,(u8)ch);	
	while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//USART_GetFlagStatus发送数据寄存器空标志位,USART_FLAG_TXE发送完成置1.
	return ch;
}

void USART1_Init(u32 bound)
{
	//定义结构体
		GPIO_InitTypeDef GPIO_InitStructure;
		USART_InitTypeDef USART_InitStructure;
		NVIC_InitTypeDef NVIC_InitStructure;
	//开启时钟
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	//初始化引脚
		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);
	
	
		GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
		GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //浮空输入
		GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
		GPIO_Init(GPIOA,&GPIO_InitStructure);
	//初始化串口
	  USART_InitStructure.USART_BaudRate=bound;
		USART_InitStructure.USART_WordLength=USART_WordLength_8b;
	  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);
		//串口使能
		USART_Cmd(USART1,ENABLE);
		USART_ClearFlag(USART1,USART_FLAG_TC);
		
		
	
		//中断类型并使能
		USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//	接收中断函数并开启
		
		NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//定时器中断通道
		NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级
		NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;		//子优先级
		NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
		NVIC_Init(&NVIC_InitStructure);	
}
//中断服务函数
void USART1_IRQHandler(void)
{
	
	
	if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)//GetITStatus检查指定的 USART 中断发生与否,USART_IT_RXNE接收中断
	{
		//u8 r;
	  r= USART_ReceiveData(USART1);
		USART_SendData(USART1,r);
		while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//GetFlagStatus检查指定的 USART 标志位设置与否,,USART_FLAG_TC发送完成标志位.发送完成置1.
	
	}
	USART_ClearFlag(USART1,USART_FLAG_TC);
}


usart.h

#ifndef _USART_H
#define _USART_H
#include "system.h"
extern u8 r;
void USART1_Init(u32 bound);



#endif

main.c

#include "usart.h"
#include "system.h"
#include "SysTick.h"
#include "led.h"

u8 r;
int main()
{
  
	SysTick_Init(72);
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中断优先级分组 分2组
	LED_Init();
  USART1_Init(9600);
	
	while(1)
	{
			switch (r){
			
			case '0': GPIO_ResetBits(LED_PORT,LED_PIN);break;
			case '1':
					GPIO_SetBits(LED_PORT,LED_PIN);break;
			
		}





//		
//		if(r=='1')
//		{
//		GPIO_SetBits(LED_PORT,LED_PIN);
//		
//		}
//		else
//		GPIO_ResetBits(LED_PORT,LED_PIN);
}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值