stm32f103系列单片机串口初始化

发布者:SereneDreams最新更新时间:2022-09-13 来源: csdn关键字:stm32f103系列  单片机  串口初始化 手机看文章 扫描二维码
随时随地手机看文章

这篇文章是本人从小白到熟悉这个单片机的过程,本在使用过程中主要是针对的64为单片机,但是其它引脚位数的单片机应该也是比较实用,由于篇幅较长,


废话不多说,开始单片机学习之旅吧!(本文章比较适用于对硬件知识有一定基础,如果有51系列单片机开发或者学习经验者。)


最开始笔者是从串口初始化开始,串口是个很好用的东西。不光可以用来通信而且还可以用来调试调试程序。下面这段程序是对串口1-3的初始化函数。这三段函数基本上没有什么区别只是引脚不同,所以后面的程序没加注释。


/*

******串口1初始化*****************************************

* 函数名称:Usart1_Init

*

* 函数功能: 串口1初始化

*

* 入口参数: baud:设定波特率

*

* 返回参数:

*

* 说明: TX-PA9 RX-PA10

************************************************************

*/

void Usart1_Init(unsigned int baud)

{

 

GPIO_InitTypeDef gpioInitStruct;

USART_InitTypeDef usartInitStruct;

NVIC_InitTypeDef nvicInitStruct;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //打开GPIOA时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //打开USART1的时钟

//PA9 TXD

gpioInitStruct.GPIO_Mode = GPIO_Mode_AF_PP; //设置为复用模式

gpioInitStruct.GPIO_Pin = GPIO_Pin_9; //初始化Pin9

gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz; //承载的最大频率

GPIO_Init(GPIOA, &gpioInitStruct); //初始化GPIOA

//PA10 RXD

gpioInitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; //设置为浮空模式

gpioInitStruct.GPIO_Pin = GPIO_Pin_10; //初始化Pin10

gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz; //承载的最大频率

GPIO_Init(GPIOA, &gpioInitStruct); //初始化GPIOA

usartInitStruct.USART_BaudRate = baud;   //设置串口波特率

usartInitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件流控制

usartInitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //接收和发送

usartInitStruct.USART_Parity = USART_Parity_No; //无校验

usartInitStruct.USART_StopBits = USART_StopBits_1; //1位停止位

usartInitStruct.USART_WordLength = USART_WordLength_8b; //8位数据位

USART_Init(USART1, &usartInitStruct); //初始化串口1

USART_Cmd(USART1, ENABLE); //使能串口

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //使能接收中断

nvicInitStruct.NVIC_IRQChannel = USART1_IRQn; //usart1中断号

nvicInitStruct.NVIC_IRQChannelCmd = ENABLE; //中断通道使能

nvicInitStruct.NVIC_IRQChannelPreemptionPriority = 0; //抢占中断优先级(值越小优先级越高)

nvicInitStruct.NVIC_IRQChannelSubPriority = 1; //子中断优先级(值越小优先级越高)

NVIC_Init(&nvicInitStruct); //初始化NVIC

}

 

/*

******串口2初始化*****************************************

* 函数名称:Usart2_Init

*

* 函数功能: 串口2初始化

*

* 入口参数: baud:设定波特率

*

* 返回参数:

*

* 说明: TX-PA2 RX-PA3

************************************************************

*/

 

void Usart2_Init(unsigned int baud)

{

 

GPIO_InitTypeDef gpioInitStruct;

USART_InitTypeDef usartInitStruct;

NVIC_InitTypeDef nvicInitStruct;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

//PA2 TXD

gpioInitStruct.GPIO_Mode = GPIO_Mode_AF_PP;

gpioInitStruct.GPIO_Pin = GPIO_Pin_2;

gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &gpioInitStruct);

//PA3 RXD

gpioInitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;

gpioInitStruct.GPIO_Pin = GPIO_Pin_3;

gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &gpioInitStruct);

usartInitStruct.USART_BaudRate = baud;

usartInitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

usartInitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

usartInitStruct.USART_Parity = USART_Parity_No;

usartInitStruct.USART_StopBits = USART_StopBits_1;

usartInitStruct.USART_WordLength = USART_WordLength_8b;

USART_Init(USART2, &usartInitStruct);

USART_Cmd(USART2, ENABLE);

USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);

nvicInitStruct.NVIC_IRQChannel = USART2_IRQn;

nvicInitStruct.NVIC_IRQChannelCmd = ENABLE;

nvicInitStruct.NVIC_IRQChannelPreemptionPriority = 0;

nvicInitStruct.NVIC_IRQChannelSubPriority = 0;

NVIC_Init(&nvicInitStruct);

 

}

 

/*

******串口3初始化*****************************************

* 函数名称:Usart3_Init

*

* 函数功能: 串口3初始化

*

* 入口参数: baud:设定波特率

*

* 返回参数:

*

* 说明: TX-PB10 RX-PB11

************************************************************

*/

 

void Usart3_Init(unsigned int baud)

{

 

GPIO_InitTypeDef gpioInitStruct;

USART_InitTypeDef usartInitStruct;

NVIC_InitTypeDef nvicInitStruct;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);

//USART3_TX   GPIOB.10

gpioInitStruct.GPIO_Pin = GPIO_Pin_10;

gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz;

gpioInitStruct.GPIO_Mode = GPIO_Mode_AF_PP;

  GPIO_Init(GPIOB, &gpioInitStruct);

   

//USART3_RX   GPIOB.11

  gpioInitStruct.GPIO_Pin = GPIO_Pin_11;

  gpioInitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;

  GPIO_Init(GPIOB, &gpioInitStruct);

usartInitStruct.USART_BaudRate = baud;

usartInitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

usartInitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

usartInitStruct.USART_Parity = USART_Parity_No;

usartInitStruct.USART_StopBits = USART_StopBits_1;

usartInitStruct.USART_WordLength = USART_WordLength_8b;

USART_Init(USART3, &usartInitStruct);

USART_Cmd(USART3, ENABLE);

USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);

nvicInitStruct.NVIC_IRQChannel = USART3_IRQn;

nvicInitStruct.NVIC_IRQChannelCmd = ENABLE;

nvicInitStruct.NVIC_IRQChannelPreemptionPriority = 0;

nvicInitStruct.NVIC_IRQChannelSubPriority = 0;

NVIC_Init(&nvicInitStruct);

 

}

/*

*********串口打印函数******************

*函数名称:UsartPrintf

*参数: *USARTx:选择打印的端口

* fmt:需要打印的数据

*

*说明:

****************************

*/

void USART_Printf(USART_TypeDef *USARTx, char *fmt,...)

{

 

unsigned char UsartPrintfBuf[296];

va_list ap;

unsigned char *pStr = UsartPrintfBuf; //指针pStr指向数组

va_start(ap, fmt);

vsprintf((char *)UsartPrintfBuf, fmt, ap);

va_end(ap);

while(*pStr != 0)

{

USART_SendData(USARTx, *pStr++);

while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);

}

 

}


由于串口是异步通信方式,所以接收数据需要通过中断来接受。程序如下。


 

void USART1_IRQHandler(void) 

{

    if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET)  //判断是否发生中断

    { 

      USART_ClearITPendingBit(USART1,USART_IT_RXNE);  //清除当前中断标志位

 

        …………………………

        ………………………… //中断处理函数

      

    } 

}

 

 

void USART2_IRQHandler(void) 

{

    if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET)  //判断是否发生中断

    { 

      USART_ClearITPendingBit(USART2,USART_IT_RXNE);  //清除当前中断标志位

 

        …………………………

        ………………………… //中断处理函数

      

    } 

}

 

void USART3_IRQHandler(void) 

{

    if(USART_GetITStatus(USART3,USART_IT_RXNE) != RESET)  //判断是否发生中断

    { 

      USART_ClearITPendingBit(USART3,USART_IT_RXNE);  //清除当前中断标志位

 

        …………………………

        ………………………… //中断处理函数

      

    } 

}


中断处理函数需要根据自己的功能来实现,到此整个串口初始化已经完成。

关键字:stm32f103系列  单片机  串口初始化 引用地址:stm32f103系列单片机串口初始化

上一篇:STM32嵌入式显示器:首款搭载 STM32H7 的高清屏幕
下一篇:STM32之PWM波形输出配置

推荐阅读最新更新时间:2024-11-13 13:33

单片机做加减乘除小算术(试看编程序)
单片机做加减乘除小算术(试看编程序)
[单片机]
<font color='red'>单片机</font>做加减乘除小算术(试看编程序)
意法半导体发布最先进的32位安全微控制器
第三代ST33安全微控制器集成业内容量最大的嵌入式闪存、最快的时钟速度以及最快的嵌入式加密加速器 可支持新的支付模式、物联网、穿戴式装置、M2M工业自动化、V2X汽车通信 全球半导体供应商意法半导体(STMicroelectronics,简称ST;纽约证券交易所代码:STM)推出第三代基于32位ARM SecurCore SC300 处理器的ST33安全微控制器。 首款产品ST33J2M0安全微控制器的内部程序闪存容量(2MB)为市场最高,几乎是市面现有安全微控制器的两倍,这使新产品成为安全微控制器市场上的新标杆。全部采用意法半导体的40nm先进制造工艺以提高成本效益,新款安全微控制器拥有最强的运算
[单片机]
基于STM32单片机的数据记录装置设计
引言 本文针对电动汽车研究的实际需求,设计一款数据记录装置,该数据记录装置是搭建在电池能量管理系统基础上的,通过与能量管理系统通信,记录电动汽车实际运行时电池的外部状态(如:电池电压、电流、温度等),一方面为了研究电池的工作特性,另一方面为了对能量管理系统的工作情况做验证,为电动汽车动力电池的理论研究提供数据支持。 1 系统总体设计 本数据记录装置的设计包括硬件设计与软件设计两方面,软件设计主要包括数据接收的编程以及数据存储的编程,而硬件设计主要有几个方面:主控芯片的选择、复位功能的实现、电源模块、实时时钟、通信模块以及SD卡连接等。主控芯片是控制系统的核心,它内部所集成的模块越多,就能省去更多的外部电路,使得电路的设
[电源管理]
基于STM32<font color='red'>单片机</font>的数据记录装置设计
紫光同芯R52+内核车规MCU THA6412重磅发布
北京贞光科技有限公司是紫光同芯产品的代理商和解决方案供应商。我们提供车规 安全芯片 硬件 、 软件 SDK 的产品销售和技术服务。可安排技术人员到客户现场进行支持,协助完成芯片选型和个性化定制服务。 8月21日,在2024紫光同芯合作伙伴大会上,紫光同芯正式发布第二代THA6系列高端旗舰级新品THA6412。该芯片在安全性、可靠性、 算力 、实时性等方面全方位升级,是继今年7月紫光同芯发布THA6206芯片后,又一款通过ASIL D产品认证的旗舰级R52+内核车规 MCU ,备受国内车厂期待。 性能大幅提升 适配复杂的汽车应用环境 会上,紫光同芯 汽车电子 事业部副总经理杨斌表示,作为紫光同芯高端 控制芯片
[汽车电子]
为物联网而创新 Spansion细分Flash与MCU融合
作为嵌入式闪存创新领域的老牌劲旅,Spansion公司早已在NASDAQ上市,目前Q3营业收入达到2750万美元。据Spansion公司微控制器与模拟业务部门市场部营销总监王钰介绍,现有Spansion的产品线主要包括,一是刚收购富士通的MCU产品线,包括专利的微处理器与ARM Cortex系列微控制器,二是闪存产品线,包括自己专利的电荷捕获NOR和SLC NAND,三是模拟器件,包括模拟、混合信号和电源管理。 从其官方提供的几组数据显示分析,从业务占比分类来看,Spansion在行业方面汽车和个人用户占据很高的份额,另外Spansion亚太占据了公司很大的市场份额,Spansion业务方面闪存占据公司主要地位。 王钰认为
[单片机]
单片机在现代电子系统的地位综述
摘要 :现代电子技术发展的速度越来越快,其基本核心技术为嵌入式计算机系统,而作为嵌入式系统之一的单片机,以其明显的典型性、广泛性、普及性的特点,在现代电子系统发展历程中占据着重要的地位。本文就针对电子技术中单片机的应用进行综述性讨论,介绍其基本组成与特点,对其应用进行分析,最后提出其未来的发展方向。    一、单片机的特点与基本组成   与其它的嵌入式系统相比,单片机的体积小,但是集成度高,具备较高的可靠性与控制功能;功耗低且采用低电压,因此对便携式产品的制造与生产十分有利;具备较好的扩展性与优异的性能比,其应用范围十分广泛,包括办公室自动化设备、实时过程的控制、各类仪器仪表、医疗领域相关设备、汽车电子产品以及计算机网络通信技
[模拟电子]
AVR单片机的DS1302操作程序
file://---by 变成浪子 //mega16 7.3728MHz石英晶体 iCCavr6.31a //相关定义: #define uint unsigned int #define uchar unsigned char #define DS1302_RST 0 //pc0 #define DS1302_SDA 1 //pc1 #define DS1302_SCLK 6 //pc6 //ds1302相关 //DS1302_RST=1 #define Set_DS1302_RST() PORTC|=1 #define Clr_DS1302_RST() PORTC&=~(1 #d
[嵌入式]
51单片机自学笔记(三)——电子电路基础
电平特性 单片机是一种数字集成芯片,走的是数字电路。在数字电路中,只有两种电平:高电平(5V)和低电平(0V)。一般定义单片机的输入和输出为TTL电平,TTL电平信号采用二进制来表示数据,5V等价于逻辑“1”,0V等价于逻辑“0”,TTL电平规定高电平输出电压 2.4V,低电平输出电压 0.4V。计算机串口采用的是RS-232C电平,其高电平为-12V,低电平为+12V。单片机与计算机串口通信时需要使用电平转换芯片,把RS-232C电平转为TTL电平后单片机才能识别。 51单片机IO口 I/O口是基本输入Input/输出Output接口。单片机对外围设备的控制都是通过I/O口来进行的(输出高低电平)。接收外部控制也是通过I/O
[单片机]
51<font color='red'>单片机</font>自学笔记(三)——电子电路基础
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved