STM32:STM32学习记录4:串口

本文详细介绍了STM32中串口的配置步骤,包括系统时钟和IO口时钟初始化、IO口配置、USART波特率设置以及串口初始化。特别强调了串口IO口需配置为复用推挽输出和浮空输入,以及发送数据时需要注意的间隔问题,以避免数据丢失。提供了一个完整的串口配置和使用示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

配置流程:
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);    // 发送数据寄存器空标志位 
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值