历史上的今天
返回首页

历史上的今天

今天是:2025年06月27日(星期五)

正在发生

2019年06月27日 | STM32串口——5个串口的使用方法

2019-06-27 来源:eefocus

串口是我们常用的一个数据传输接口,STM32F103系列单片机共有5个串口,其中1-3是通用同步/异步串行接口USART(Universal Synchronous/Asynchronous Receiver/Transmitter),4,、5是通用异步串行接口UART(Universal Asynchronous Receiver/Transmitter)。

STM32学习笔记——5个串口的使用方法

配置串口包括三部分内容:


1.  I/O口配置:TXD配置为复用推挽输出(GPIO_Mode_AF_PP),RXD配置为浮空输入(GPIO_Mode_IN_FLOATING);


2.  串口配置:波特率等;


3.  中断向量配置:一般用中断方式接收数据。


注意事项:


1.  USART1是挂在APB2,使能时钟命令为:     


RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE );


其他几个则挂在APB1上,如2口:


RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE );


2.  配置4口和5口的时候,中断名为UART4、UART5,中断入口分别为


UART4_IRQn、UART5_IRQn


对应的中断服务函数为


void UART4_IRQHandler(void)



void UART5_IRQHandler(void)。


下面是5个串口的配置函数和收发数据函数代码:


#include "stm32f10x.h"


#include "misc.h"


#include "stm32f10x_gpio.h"


#include "stm32f10x_usart.h" 


void USART1_Configuration(void)


{


GPIO_InitTypeDef GPIO_InitStructure;


USART_InitTypeDef USART_InitStructure;


NVIC_InitTypeDef NVIC_InitStructure;        


 


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );


RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE );


 


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //USART1 TX;


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出;


GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;


GPIO_Init(GPIOA, &GPIO_InitStructure); //端口A;


    


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //USART1 RX;


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入;


GPIO_Init(GPIOA, &GPIO_InitStructure); //端口A;


 


USART_InitStructure.USART_BaudRate = 9600; //波特率;


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


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


USART_InitStructure.USART_Parity = USART_Parity_No ; //无校验位;


USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;


//无硬件流控;


USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;


//收发模式;


USART_Init(USART1, &USART_InitStructure);//配置串口参数;


 


NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断组,4位抢占优先级,4位响应优先级;


 


NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //中断号;


NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级;


NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级;


NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;


NVIC_Init(&NVIC_InitStructure);


 


USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);


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


}


 


void USART1_Send_Byte(u8 Data) //发送一个字节;


{


USART_SendData(USART1,Data);


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


}


 


void USART1_Send_String(u8 *Data) //发送字符串;


{


while(*Data)


USART1_Send_Byte(*Data++);


}


 


void USART1_IRQHandler(void) //中断处理函数;


{


u8 res;    


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


{


USART_ClearFlag(USART1, USART_IT_RXNE); //清除标志位;


res=USART_ReceiveData(USART1); //接收数据;


USART1_Send_Byte(res); //用户自定义;


}  



 


 


 


void USART2_Configuration(void)


{


GPIO_InitTypeDef GPIO_InitStructure;


USART_InitTypeDef USART_InitStructure;


NVIC_InitTypeDef NVIC_InitStructure;        


 


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );


RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE );


 


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //USART2 TX;


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出;


GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;


GPIO_Init(GPIOA, &GPIO_InitStructure); //端口A;


    


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //USART2 RX;


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入;


GPIO_Init(GPIOA, &GPIO_InitStructure); //端口A;


 


USART_InitStructure.USART_BaudRate = 9600; //波特率;


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


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


USART_InitStructure.USART_Parity = USART_Parity_No ; //无校验位;


USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;


//无硬件流控;


USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;


//收发模式;


USART_Init(USART2, &USART_InitStructure);//配置串口参数;


 


NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断组,4位抢占优先级,4位响应优先级;


 


NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //中断号;


NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级;


NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级;


NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;


NVIC_Init(&NVIC_InitStructure);


 


USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);


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


}


 


void USART2_Send_Byte(u8 Data) //发送一个字节;


{


USART_SendData(USART2,Data);


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


}


 


void USART2_Send_String(u8 *Data) //发送字符串;


{


while(*Data)


USART2_Send_Byte(*Data++);


}


 


void USART2_IRQHandler(void) //中断处理函数;


{


u8 res;    


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


{


USART_ClearFlag(USART2, USART_IT_RXNE); //清除标志位;


res=USART_ReceiveData(USART2); //接收数据;


USART2_Send_Byte(res); //用户自定义;


}  



 


 


 


void USART3_Configuration(void)


{


GPIO_InitTypeDef GPIO_InitStructure;


USART_InitTypeDef USART_InitStructure;


NVIC_InitTypeDef NVIC_InitStructure;        


 


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE );


RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE );


 


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //USART3 TX;


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出;


GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;


GPIO_Init(GPIOB, &GPIO_InitStructure); //端口B;


    


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //USART3 RX;


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入;


GPIO_Init(GPIOB, &GPIO_InitStructure); //端口B;


 


USART_InitStructure.USART_BaudRate = 9600; //波特率;


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


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


USART_InitStructure.USART_Parity = USART_Parity_No ; //无校验位;


USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;


//无硬件流控;


USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;


//收发模式;


USART_Init(USART3, &USART_InitStructure);//配置串口参数;


 


NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断组,4位抢占优先级,4位响应优先级;


 


NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; //中断号;


NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级;


NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级;


NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;


NVIC_Init(&NVIC_InitStructure);


 


USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);


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


}


 


void USART3_Send_Byte(u8 Data) //发送一个字节;


{


USART_SendData(USART3,Data);


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


}


 


void USART3_Send_String(u8 *Data) //发送字符串;


{


while(*Data)


USART3_Send_Byte(*Data++);


}


 


void USART3_IRQHandler(void) //中断处理函数;


{


u8 res;    


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


{


USART_ClearFlag(USART3, USART_IT_RXNE); //清除标志位;


res=USART_ReceiveData(USART3); //接收数据;


USART3_Send_Byte(res); //用户自定义;


}  



 


 


 


void UART4_Configuration(void)


{


GPIO_InitTypeDef GPIO_InitStructure;


USART_InitTypeDef USART_InitStructure;


NVIC_InitTypeDef NVIC_InitStructure;        


 


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE );


RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE );


 


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //UART4 TX;


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出;


GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;


GPIO_Init(GPIOC, &GPIO_InitStructure); //端口C;


    


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //UART4 RX;


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入;


GPIO_Init(GPIOC, &GPIO_InitStructure); //端口C;


 


USART_InitStructure.USART_BaudRate = 9600; //波特率;


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


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


USART_InitStructure.USART_Parity = USART_Parity_No ; //无校验位;


USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;


//无硬件流控;


USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;


//收发模式;


USART_Init(UART4, &USART_InitStructure);//配置串口参数;


 


NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断组,4位抢占优先级,4位响应优先级;


 


NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn; //中断号;


NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级;


NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级;


NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;


NVIC_Init(&NVIC_InitStructure);


 


USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);


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


}


 


void UART4_Send_Byte(u8 Data) //发送一个字节;


{


USART_SendData(UART4,Data);


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


}


 


void UART4_Send_String(u8 *Data) //发送字符串;


{


while(*Data)


UART4_Send_Byte(*Data++);


}


 


void UART4_IRQHandler(void) //中断处理函数;


{


u8 res;    


if(USART_GetITStatus(UART4, USART_IT_RXNE) == SET) //判断是否发生中断;


{


USART_ClearFlag(UART4, USART_IT_RXNE); //清除标志位;


res=USART_ReceiveData(UART4); //接收数据;


UART4_Send_Byte(res); //用户自定义;


}  



 


 


 


void UART5_Configuration(void)


{


GPIO_InitTypeDef GPIO_InitStructure;


USART_InitTypeDef USART_InitStructure;


NVIC_InitTypeDef NVIC_InitStructure;        


 


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE );


RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE );


 


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //UART5 TX;


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出;


GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;


GPIO_Init(GPIOC, &GPIO_InitStructure); //端口C;


    


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //UART5 RX;


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入;


GPIO_Init(GPIOD, &GPIO_InitStructure); //端口D;


 


USART_InitStructure.USART_BaudRate = 9600; //波特率;


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


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

推荐阅读

史海拾趣

Anachip公司的发展小趣事

品质一直是Anachip公司非常重视的一环。为了确保产品的稳定性和可靠性,公司建立了严格的品质管理体系,从原材料采购到生产过程的每一个环节都进行严格控制。同时,公司还加大了品牌建设的力度,通过广告宣传、赞助活动等方式提升品牌知名度。这些举措不仅提升了公司的市场竞争力,也赢得了客户的信任和忠诚。

BURGESS公司的发展小趣事

随着时间的推移,BURGESS不断扩展其业务范围,并于1984年首次开发租船服务。这一创新举措不仅满足了客户多样化的需求,也进一步巩固了其在行业内的领先地位。此后,BURGESS继续其国际化步伐,成功进驻美国市场,进一步扩大了其全球影响力。

中科芯(CKS)公司的发展小趣事

作为电子行业的领军企业,中科芯承担着众多国家重点科研任务。多年来,公司积极参与国家重大科研项目,涉及通信、计算机、航空航天等多个领域。通过不断的技术攻关和创新,中科芯成功完成了500多项国家重点科研任务,获得了国家奖18项、省部级奖近200项。这些成果的取得不仅提升了公司的技术实力,也为中国电子行业的发展做出了巨大贡献。

Communications & Power Industries公司的发展小趣事

随着全球化进程的加速,CPI意识到要想在电子行业中取得更大的发展,必须积极拓展国际市场。公司积极寻求与国际知名企业的合作机会,通过技术共享和市场合作,成功打开了多个海外市场。同时,CPI还加强了与国际研究机构的合作,不断引进先进的技术和管理经验,提升了自身的竞争力。这些国际合作不仅为CPI带来了更多的商业机会,也推动了公司在全球范围内的品牌传播和市场拓展。

Delphi Connection Systems公司的发展小趣事

Delphi Connection Systems公司自创立之初,就致力于在电子行业中的连接器技术上进行创新。公司投入大量研发资源,开发出一种新型的高性能连接器,这种连接器具有更小的体积、更高的可靠性和更低的传输损耗。这一创新成果迅速获得了市场的认可,为公司带来了大量的订单和合作机会。

EDAC公司的发展小趣事

精英电脑(ECS)自1987年成立以来,一直以其卓越的技术创新能力在电子行业中占据一席之地。公司早期专注于主板的研发和生产,凭借其稳定的性能和出色的兼容性,迅速赢得了市场的认可。随着科技的进步,ECS不断拓宽产品线,从主板扩展到台式机、笔记本电脑、平板电脑等多个领域。在技术创新方面,ECS始终坚持自主研发,不断推出具有行业领先水平的新产品,如采用最新制程技术的主板、搭载高性能处理器的笔记本电脑等。这些创新产品不仅提升了ECS的品牌形象,也为公司带来了可观的利润。

问答坊 | AI 解惑

美国模拟器件公司(ADI)推出业界首款适合用于42V汽车系统的差分放大器

放大器作为各种模拟电路的基本单元,在当今的利用机电系统来操纵多种功能的汽车里到处存在。来看看美国推出的放大器有什么不同?…

查看全部问答>

基于A/D和D/A转换的单片机语音录放设计

哪位高手能提供下怎么通过A/D和D/A转换将语音录放啊?很急,万分感谢,如有兴趣的可以Q聊,270329846…

查看全部问答>

一个奇怪的现象

(线性稳压电源)  通过全桥整流后接电容   如果接的电阻比较小  也即取出的电流大   此时时间常数会变小   我用示波器测试发现输出时降低了   但是按照电容充放电原则    ...…

查看全部问答>

请大家推荐一款易于上手的USB开发芯片

初学,想做点小玩意儿,请大家推荐一款易于上手的USB开发芯片.谢谢…

查看全部问答>

求助 关于表决器

小弟现在要做一个表决器,用单片机的知识,可是现在无从下手,而且网上也很难搜到相关的东西,群里的各位能否指点一二呢?…

查看全部问答>

急:关于ISA GUID?

{0x4ec507d3, 0xfbe2, 0x4c4d, { 0xa5, 0…

查看全部问答>

The Over-Power Phenomenon In DCM/CCM-Operated Flyback Converters (Part 1)

The Over-Power Phenomenon In DCM/CCM-Operated Flyback Converters (Part 1)by Christophe Basso, ON Semiconductor, Toulouse, France…

查看全部问答>

公司组织技能比赛

       公司组织个技能比赛,从简单的机械加工到电器修理机械制图等,总之就是和我们平时工作息息相关的工作一些比赛!       设置不同的奖励,交个底就是只要能选上你就有现金奖励, ...…

查看全部问答>

STM8中断向量表,有哪位朋友详细描述一下。

例如: 1、_stext是什么意思?           2、这个地址可能改吗?如果程序里有BOOTLOADER是不是要改。           3、typedef void @far (*interrupt_handler_t)(void);是什么意 ...…

查看全部问答>