配置流程:
1:系统时钟初始化,包括系统时钟和要开放的IO口和串口的时钟配置,要打开串口的时钟!!!
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);。
2:IO口初始化,包括引脚,速率,输入输出模式等。
3:配置USART的波特率,数据位等。
4:串口的初始化包括两部分。一部分是串口使用的IO口初始化调用GPIO_Init(),另一部分是串口功能的初始化调用USART_Init(),同样注意结构体数据类型的定义。
注意:
1:USART的IO口也需要配置
配置流程如下:
//USART1 IO初始化 GPIOA9 TX
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//引脚选择
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHz速率
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出 注意此处为复用推挽输出
GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化
//USART1 IO初始化 GPIOA10 RX
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//引脚选择
// GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHz速率 注意RX不用配置速率!!(不知道原因)
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入 注意此处为浮空输入
GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化
2:两次发送时间间隔不能太长,如果太长就会出现只收到前两位数据的情况!!!!!!!!!!!!!!!!!!
程序如下:
1:系统时钟初始化,包括系统时钟和要开放的IO口和串口的时钟配置,要打开串口的时钟!!!
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);。
2:IO口初始化,包括引脚,速率,输入输出模式等。
3:配置USART的波特率,数据位等。
4:串口的初始化包括两部分。一部分是串口使用的IO口初始化调用GPIO_Init(),另一部分是串口功能的初始化调用USART_Init(),同样注意结构体数据类型的定义。
注意:
1:USART的IO口也需要配置
配置流程如下:
//USART1 IO初始化 GPIOA9 TX
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//引脚选择
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHz速率
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出 注意此处为复用推挽输出
GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化
//USART1 IO初始化 GPIOA10 RX
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//引脚选择
// GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHz速率 注意RX不用配置速率!!(不知道原因)
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入 注意此处为浮空输入
GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化
2:两次发送时间间隔不能太长,如果太长就会出现只收到前两位数据的情况!!!!!!!!!!!!!!!!!!
程序如下:
#include"stm32f10x.h"
#define LED0_ON GPIO_SetBits(GPIOA,GPIO_Pin_8) // LED0开
#define LED0_OFF GPIO_ResetBits(GPIOA,GPIO_Pin_8)//LED0关
//初始化IO端口
void IO_Configuart(void)
{
GPIO_InitTypeDef GPIO_InitStructure;//定义 GPIO_InitStructure为 GPIO_InitTypeDef结构体类型
//LED指示灯初始化,闪说明系统运行
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;//引脚选择
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHz速率
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出
GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化
//USART1 IO初始化 GPIOA9 TX
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//引脚选择
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHz速率
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//推挽输出
GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化
//USART1 IO初始化 GPIOA10 RX
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//引脚选择
// GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHz速率
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//推挽输出
GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化
// //配置GPIOD_2
// GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;//引脚选择
// GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHz速率
// GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出
// GPIO_Init(GPIOD,&GPIO_InitStructure);//初始化
}
//复位和系统时钟控制
void RCC_Configuare(void)
{
SystemInit();//频率设定有system_stm32f10x.c文件中的宏定义 开放某个宏 当调用SystemInit()时即可设置好频率
RCC_ClockSecuritySystemCmd(ENABLE);//使能或者失能时钟安全系统
//使能GPIOA,GPIOD端口时钟 USART1时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);//允许总线CLOCK,在使用GPIO之前必须允许相应的端口时钟
/* 也可以写为RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD,ENABLE); 更加简洁*/
}
//NVIC设置
void NVIC_Configuare(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);//设定中断向量表基址0x08000000
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);// 先占优先级0位 从优先级4位
// //使能KEY0,KEY1中断
// NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;//外部中断线15-10中断 由于两个按键是PA13 PA15由外部中断IO映射得知
// NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x0F; //先占优先级0位,从优先级4位
// NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x0F; //
// NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
// NVIC_Init(&NVIC_InitStructure);
// //使能WK_UP中断
// NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn;//外部中断线0中断 WK_UP按键 接PA0
// NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //先占优先级0位,从优先级4位
// NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; //
// NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
// NVIC_Init(&NVIC_InitStructure);
}
void USART_Configuare(void)
{
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 9600; //波特率
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_Tx | USART_Mode_Rx; //收发模式
USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE); //使能USART1
}
void Delay(u16 speed)
{
u16 i=0;
while(speed!=0)
{
speed--;
for(i=0;i<400;i++);
}
}
int main(void)
{
u8 Buffer;
RCC_Configuare();
IO_Configuart() ;
NVIC_Configuare();
USART_Configuare();
while(1)
{
while(USART_GetFlagStatus (USART1,USART_FLAG_RXNE)==RESET); // 接收数据寄存器非空标志位
Buffer=USART_ReceiveData(USART1);//返回 USARTx 最近接收到的数据
// Delay(20); 此处不能延时时间太长!!!!!!!!!!!!
USART_SendData(USART1,Buffer); // 通过外设 USARTx 发送单个数据
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET); // 发送数据寄存器空标志位
}
}