资源描述
串口收发数据
姓名 唐珊珊 班级2011物联网 学号2011412614
实验目的:掌握串口的使用,设置方法及收发数据的方法。
实验原理:调用固件库对USART2进行设置,实现通过超级串口输入回显功能。
实验步骤:要实现本实验功能设计,需要进行必要的设置,其步骤如下:
1、 使能并设置相关GPIO.
2、 配置USART2波特率为115200,8位数据位,1位停止位,无校验无硬件流控制。
3、 启动USART2并将收到的数据通过USART2发送,进行回显。
注意:USART2使用的是重映射后的管脚,所以AFIO的时钟,也需要使能。
程序如下:
#include "stm32f10x.h"
#include "stdio.h"
void GPIO_Config(void);
void COM_Init(void);
int main(void)
{
uint8_t ch;//定义一个8位缓存变量ch
GPIO_Config();//设置GPIO
COM_Init();//初始化串口
while(1)
{
if(USART_GetFlagStatus(USART2,USART_FLAG_RXNE)!=RESET)//如果USART2的接受标志位不为0,即已经接受到数据
{
ch=USART_ReceiveData(USART2);//将USART2接收到的数据放入变量ch缓存
USART_SendData(USART2,ch);//通过USART2发送ch的内容
}
}
}
void GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);//使能
GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);//使能usaRt2管脚重映设
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
GPIO_Init(GPIOD, &GPIO_InitStructure);
}
void COM_Init(void)
{
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate=115200;
USART_InitStructure.USART_WordLength=USART_WordLength_8b;
USART_InitStructure.USART_StopBits=USART_StopBits_1;
USART_InitStructure.USART_Parity=USART_Parity_No;
USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_Init(USART2, &USART_InitStructure);
USART_Cmd(USART2, ENABLE);
}
密码回显的程序为:
#include "stm32f10x.h"
#include "stdio.h"
void GPIO_Config(void);
void COM_Init(void);
int fputc(int ch,FILE *f);
int main(void)
{
uint8_t ch[25];//定义一个8位缓存变量ch
uint8_t i=0;
GPIO_Config();//设置GPIO
COM_Init();//初始化串口
printf("\n请你输入密码:");
while(1)
{
if(USART_GetFlagStatus(USART2,USART_FLAG_RXNE)!=RESET)//如果USART2的接受标志位不为0,即已经接受到数据
{
ch[i]=USART_ReceiveData(USART2);//将USART2接收到的数据放入变量ch缓存
if(ch[i]!=0x0d)
{
printf("*");
i=i+1;
}
else{
ch[i]='\0';
printf("\n你输入的密码:%s",ch);
//i=0;
//printf("\n请你输入密码:");
}
}
}
}
void GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);//使能
GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);//使能usaRt2管脚重映设
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);//使能USART2时钟
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //设置重映射后的USART2输出TX管脚PD5为复用推挽
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
//设置重映射后的USART2输入rx管脚为浮空输入
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
GPIO_Init(GPIOD, &GPIO_InitStructure);
}
void COM_Init(void)
{
USART_InitTypeDef USART_InitStructure;//声明结构体初始化
USART_InitStructure.USART_BaudRate=115200; //设置波特率
USART_InitStructure.USART_WordLength=USART_WordLength_8b;//设置数据位
USART_InitStructure.USART_StopBits=USART_StopBits_1; //设置停止位
USART_InitStructure.USART_Parity=USART_Parity_No; //设置无校验
USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx; //设置模式为收发
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//设置不开启硬件流
USART_Init(USART2, &USART_InitStructure);//初始化
USART_Cmd(USART2, ENABLE);//使能
}
展开阅读全文