STM32 USART串口初始化

发布者:DazzlingSmile最新更新时间:2018-08-12 来源: eefocus关键字:STM32  USART  串口初始化 手机看文章 扫描二维码
随时随地手机看文章

1、初始化串口时钟以及串口IO端口时钟:


使用RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); 

备注:为什么要使能IO口时钟? 

参照用户手册 P165-P166



使用串口这个外设的时候需要将串口的IO属性配置为图示; 

使用串口是否需要打开复用时钟,请见http://blog.csdn.net/u012411027/article/details/44217313,看到这位的解释才恍然大悟的。


2、串口参数设置(波特率、数据长度、停止位、校验位、发送接收模式、硬件控制流)


具体初始化及初始化方式如图: 



3、使能串口:


使用USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState); 

参数说明: 



4、配置NVIC及打开串口中断,编写中断服务函数(如果不使用中断,使用轮询的方法的话,直接跳过该步骤即可)




中断服务函数 



5、调用串口函数使用串口功能。


以下粘贴一下测试使用的代码,实现的功能为接受一个或多个字符然后转发到上位机,不使用中断。


#include "stm32f10x.h"

#include "stm32f10x_rcc.h"

#include "delay.h"


int main(void)

{

    GPIO_InitTypeDef GPIO_InitStruct;

    USART_InitTypeDef USART_InitStruct;

    delay_init();


    /*LED指示灯初始化,用来标志全部初始化完成*/

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;

    GPIO_Init(GPIOB,&GPIO_InitStruct);

    GPIO_SetBits(GPIOB,GPIO_Pin_5);


    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);

    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12;

    GPIO_Init(GPIOD,&GPIO_InitStruct);


    GPIO_SetBits(GPIOB,GPIO_Pin_5);

    GPIO_SetBits(GPIOD,GPIO_Pin_12);


    /*串口端口初始化*/

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);           //串口1时钟使能

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


    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;

    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOA,&GPIO_InitStruct);


    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;

    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOA,&GPIO_InitStruct);


    /*串口参数初始化*/

    USART_InitStruct.USART_BaudRate = 115200;

    USART_InitStruct.USART_WordLength = USART_WordLength_8b;

    USART_InitStruct.USART_StopBits = USART_StopBits_1;

    USART_InitStruct.USART_Parity = USART_Parity_No;

    USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

    USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

    USART_Init(USART1,&USART_InitStruct);

    USART_Cmd(USART1,ENABLE);


    /*初始化完成*/

    GPIO_ResetBits(GPIOB,GPIO_Pin_5);

    GPIO_ResetBits(GPIOD,GPIO_Pin_12);

    while(1)

    {

        unsigned char dat = 0;

        if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE) == SET)

        {

            dat = USART_ReceiveData(USART1);

            USART_SendData(USART1,dat);

            if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5))

            {

                GPIO_ResetBits(GPIOB,GPIO_Pin_5);

                GPIO_ResetBits(GPIOD,GPIO_Pin_12);

            }

            else

            {

                GPIO_SetBits(GPIOB,GPIO_Pin_5);

                GPIO_SetBits(GPIOD,GPIO_Pin_12);

            }

        }

    }

}


使用中断


#include "stm32f10x.h"

#include "stm32f10x_rcc.h"

#include "delay.h"


void USART1_IRQHandler(void)

{

    unsigned char dat = 0;


    if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE) == SET)              //等待接受完成

    {

        //USART_ClearITPendingBit(USART1,USART_FLAG_PE);

        dat = USART_ReceiveData(USART1);

        USART_SendData(USART1,dat);

        //while(!USART_GetFlagStatus(USART1,USART_FLAG_TC));

        //USART_ClearFlag(USART1,USART_FLAG_TC);

        if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5))

        {

            GPIO_ResetBits(GPIOB,GPIO_Pin_5);

            GPIO_ResetBits(GPIOD,GPIO_Pin_12);

            GPIO_SetBits(GPIOD,GPIO_Pin_6);

        }

        else

        {

            GPIO_SetBits(GPIOB,GPIO_Pin_5);

            GPIO_SetBits(GPIOD,GPIO_Pin_12);

            GPIO_ResetBits(GPIOD,GPIO_Pin_6);

        }

    }

}


int main(void)

{

    GPIO_InitTypeDef GPIO_InitStruct;

    USART_InitTypeDef USART_InitStruct;

    NVIC_InitTypeDef NVIC_InitStruct;


    delay_init();


    /*LED指示灯初始化,用来标志全部初始化完成*/

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;

    GPIO_Init(GPIOB,&GPIO_InitStruct);

    GPIO_SetBits(GPIOB,GPIO_Pin_5);


    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);

    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12;

    GPIO_Init(GPIOD,&GPIO_InitStruct);


    GPIO_SetBits(GPIOB,GPIO_Pin_5);

    GPIO_SetBits(GPIOD,GPIO_Pin_12);


    /*蜂鸣器初始化*/

    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;

    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOD,&GPIO_InitStruct);


    GPIO_SetBits(GPIOD,GPIO_Pin_6);

    delay_ms(1000);

    GPIO_ResetBits(GPIOD,GPIO_Pin_6);


    /*串口端口初始化*/

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);           //串口1时钟使能

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


    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;

    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOA,&GPIO_InitStruct);


    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;

    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOA,&GPIO_InitStruct);


    /*串口参数初始化*/

    USART_InitStruct.USART_BaudRate = 115200;

    USART_InitStruct.USART_WordLength = USART_WordLength_8b;

    USART_InitStruct.USART_StopBits = USART_StopBits_1;

    USART_InitStruct.USART_Parity = USART_Parity_No;

    USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

    USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

    USART_Init(USART1,&USART_InitStruct);

    USART_Cmd(USART1,ENABLE);


    /*开中断*/

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                 //设置中断分组,2位抢占,2位优先


    NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;

    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;

    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;

    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;

    NVIC_Init(&NVIC_InitStruct);


    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);                        //开启串口接受完成中断


    /*初始化完成*/

    GPIO_ResetBits(GPIOB,GPIO_Pin_5);

    GPIO_ResetBits(GPIOD,GPIO_Pin_12);


    while(1)

    {


    }

}


关键字:STM32  USART  串口初始化 引用地址:STM32 USART串口初始化

上一篇:STM32F103和STM32F105在串口初始化的区别
下一篇:STM32F105串口USART3无法发送数据或数据错误问题

推荐阅读最新更新时间:2024-03-16 16:10

STM32成长录
记录下自己的理解。 1:20121119 22:23 调用库函数。操作寄存器。 与51不同,寄存器比较多。库函数只是也是操作寄存器的。把它封装起来的。 GPIO_WriteBit与GPIO_SetBits,前面个是对一个io口进行写操作可以是写0或者写1,而后面一个可以对多个io口同时进行置位1 2:20121123 23:05 时钟频率和输出频率: 时钟频率是他的震荡频率,或者说刷新频率,用电不断的周期性激发,刷新整个芯片的所有电路。 而输出频率,是指他输出到总线的能力,有的时候也指他的运算能力 因为在时钟频率的震荡下,每间隔一定周期,他会进行一次处理操作,之间有一个倍率,当间隔这么多个周期之后,他就会进行一次操作 所以
[单片机]
STM32 SysTick 系统时钟 超简易定时器SysTick
/** * @brief Configures the SysTick. 系统时钟配置函数 main.c * @param None * @retval None */ void SysTick_Configuration(void) { /* Setup SysTick Timer for 100 msec interrupts */ if (SysTick_Config((SystemCoreClock) / 10)) // 1/10s=100ms { /* Capture error */ while (1); } NVIC_SetPriority(SysTick_IRQn, 0x0); } /**
[单片机]
STM32总结之GPIO 常用库函数
配置相关函数 1.void GPIO_Init (GPIO_TypeDef* GPIOx,GPIO_InitTypeDef* GPIO_InitStruct) 函数解释:GPIO的初始化函数,该函数的作用是对io进行初始化。 参数: (1)GPIOx,GPIO的分组,如 GPIOA,GPIOB,GPIOC等的宏定义。 (2)GPIO_InitStruct,GPIO的初始化相关结构体。该结构体里的成员变量决定了我们具体的初始化参数。以下进行说明: GPIO_Pin:指定具体的io脚,如GPIO_Pin_0,GPIO_Pin_1这样的宏定义。 GPIO_Mode:指定GPIO的模式,有八种模式: GPIO_
[单片机]
STM32实验2:IO输入
端口初始化 #include stm32f10x.h //PA15void KEY_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能外设置时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //PA15上拉输入 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOA, &GPIO_InitStructure); }1234567891011
[单片机]
STM32开发板入门的答疑解惑
首先我们需要了解什么是STM32,以及为什么选择STM32,需要哪些准备,学会之后的目的是什么,将这些都搞懂之后才会知道自己想要做什么,应该怎么做,以及做了之后的预期收获。我假设读这篇文章的人都是小白,啥都不会。 首先基本上会了解到STM32的人都是电子专业的学生,包括但不局限于电力电子,电子信息工程,电子信息科学与技术,电气自动化等等,每个学校的叫法不一样,可能这些学生在大学会学习模电,数电,电路,电工,单片机,信号与系统等等,会从51单片机开始学习。 接触到的知识非常多而且杂,而且大学生的我们哪里知道这些有什么用,只知道学校教什么,我们便学习什么,因为大学的教育就是如此,需要教授电子这个专业比较全面的知识点,但是却并不够深
[单片机]
<font color='red'>STM32</font>开发板入门的答疑解惑
STM32驱动W5100S网口模块实现UDP通讯
STM32驱动W5100S网口模块实现UDP通讯 实现UDP通讯时的资源配置: 软件资源: Keil+串口调试助手+网络调试助手,下载链接(串口助手以及网络调试助手以及调试方法说明):https://download.csdn.net/download/zsj2016o/11071403 硬件资源:PC机+STM32F103最小系统板+W5100S模块+适配器+网线+杜邦线 程序下载链接(包括程序说明):https://download.csdn.net/download/zsj2016o/11071425 具体开发过程如下(包括选型时遇到的问题以及开发说明): 选型时遇到的问题: 在拿到项目需求,了
[单片机]
<font color='red'>STM32</font>驱动W5100S网口模块实现UDP通讯
基于μC/OS-II的便携式飞行参数数据卸载器
随着嵌入式系统的广泛应用和功能的不断强大,对系统中人机界面的要求也越来越高,因此在嵌入式系统中加入图形用户界面得以广泛运用。为充分发挥32位处理器的功能和性能优势,提高系统的可靠性,使操作更加人性化,更多的工程师在其项目开发中选择移植嵌入式实时操作系统(RTOS)和图形用户界面(GUI)。基于ARM Cortex-M3内核的STM32系列处理器具有性能优异、功耗超低、接口方便、集成度好、开 发容易等优点,针对国内某型号飞机飞行参数检测设备体积大、结构复杂、数据卸载速度慢、误码率高等间题,设计出基于嵌入式实时操作系统μC/OS-II的便携式飞行参数数据卸载器,可解决以上问题。 μC/OS-II是一个可裁剪的实时操作系统多任务内
[单片机]
基于μC/OS-II的便携式飞行参数数据卸载器
STM32 FSMC操作SRAM的步骤简析
本次操作的SRAM的型号是IS62WV51216,是高速,8M位静态SRAM。它采用ISSI(Intergrated Silicon Solution, Inc)公司的高性能CMOS技术,按照512K个字(16)位进行组织存储单元。其具有高性能、低功耗特点。为方便用户扩展SRAM的存储空间,为用户有提供了两个片选引脚;此外,含有两个字节控制信号UB和LB,可方便用户按字节访问SRAM或按字访问SRAM。IS62WV51216具有45ns/55ns访问速度,因为是全静态操作,因此无需外部时钟和刷新要求。 IS62WV51216功能框图 IS62WV51216有地址译码器、数据IO、控制逻辑和存储阵列四部分构成。地址译码器将1
[单片机]
<font color='red'>STM32</font> FSMC操作SRAM的步骤简析
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved