历史上的今天
返回首页

历史上的今天

今天是:2025年07月12日(星期六)

正在发生

2019年07月12日 | STM32学习笔记——5个串口的使用方法

2019-07-12 来源:eefocus

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


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

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 );


配置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位响应优先级;

推荐阅读

史海拾趣

Cables To Go公司的发展小趣事

随着电子设备的普及和互联网的发展,Cables To Go公司看到了巨大的市场潜力。公司积极拓展销售渠道,通过线上电商平台和线下实体店相结合的方式,将产品销往全国各地。此外,公司还积极开拓国际市场,与多个国家和地区的代理商建立了合作关系,进一步扩大了市场份额。这种跨越式的市场拓展策略为公司的快速发展奠定了坚实的基础。

GigPeak公司的发展小趣事

GigPeak公司自成立之初,便专注于高速数据传输技术的研发。在2005年,公司研发团队成功开发出一种新型的光电转换器,该转换器能够在极低的功耗下实现前所未有的数据传输速率。这一技术创新迅速吸引了业界的关注,并成功应用于多个高端数据中心项目,帮助GigPeak在竞争激烈的市场中脱颖而出。随着技术的不断迭代和市场的广泛认可,GigPeak逐渐成为了高速数据传输领域的领军企业。

Genesis Microchip公司的发展小趣事

进入21世纪后,电子行业面临着前所未有的变革和挑战。随着信息技术的飞速发展,云计算、大数据、人工智能等新兴技术不断涌现,对传统电子企业提出了更高的要求。GI积极响应行业变革的号召,不断加大在新技术研发方面的投入,努力推动产品升级和转型。同时,公司也积极拥抱互联网思维,加强与互联网企业的合作与融合,共同探索电子行业的新未来。这一阶段的努力,使GI在激烈的市场竞争中保持了领先地位,并继续为电子行业的发展贡献着力量。

需要注意的是,以上故事是基于行业常识和通用发展路径构建的,并非直接针对GI的官方历史。由于GI的具体发展历史和详细故事可能因资料限制而无法全面呈现,因此以上内容仅供参考。

Auris公司的发展小趣事

在不断追求技术创新的道路上,Auris公司并未止步。近年来,该公司正在积极研发柔性机器人技术,这种技术有望在治疗喉咙、肺和肠胃疾病方面发挥重要作用。柔性机器人的研发不仅展示了Auris在技术创新方面的持续努力,也为其在未来的医疗市场中抢占先机提供了有力支持。

这五个故事展示了Auris公司在电子行业中的发展历程,从创始人的科技愿景到技术突破获得认可,再到与强生的合作以及柔性机器人的研发,每一步都体现了Auris对于技术创新和市场拓展的不懈追求。这些事实性的故事不仅展现了Auris公司的成长轨迹,也反映了电子行业中技术创新和市场竞争的激烈态势。

ATOP_Technologies公司的发展小趣事

随着产品线的不断丰富和技术实力的提升,ATOP Technologies开始将目光投向更广阔的市场。公司积极参与国内外各类行业展会和交流活动,加强与同行和客户的交流与合作。同时,ATOP Technologies还积极开展国际合作,与多个国家的知名企业建立了战略合作关系,共同推动工业自动化领域的发展。

Hantronix公司的发展小趣事

随着业务的不断增长,HANBIT Electronics意识到全球化布局的重要性。2010年,公司在韩国本土之外的首个生产基地——中国东莞分公司正式成立。这一举措不仅有效降低了生产成本,还大大缩短了产品交付周期,提高了对亚洲市场的响应速度。同时,公司还积极在欧洲和美国等地设立研发中心和销售网络,实现了从研发、生产到销售的全球化布局。这一战略调整极大地增强了HANBIT Electronics在全球电子市场的竞争力。

问答坊 | AI 解惑

ARM开发过程

用户选用ARM处理器开发嵌入式系统时,选择合适的开发工具可以加快开发进度,节省开发成本。因此一套含有编辑软件、编译软件、汇编软件、链接软件、调试软件、工程管理及函数库的集成开发环境(IDE)一般来说是必不可少的,至于嵌入式实时操作系统、 ...…

查看全部问答>

无铅焊接工艺表面贴装工艺研究【转】!

为了适应各国对环保的越来越高的要求,欧洲已于2006年7月1日实施确 立了《报废电子电气设各指令》和《关于在电子电气设备中限制使用某些有害物 质指令》的两项法规。铅是法规中不允许使用的物质,而传统焊接中经常使用。 国际上各电子产品生产厂 ...…

查看全部问答>

自动变速器的基本组成和工作过程

一、自动变速器的基本组成     自动变速器的厂牌型号很多,外部形状和内部结构也有所不同,但它们的组成基本相同,都是由液力变矩器和齿轮式自动变速器组合起来的。常见的组成部分有液力变矩器、行星齿轮机构、离合器、制动器、油泵、 ...…

查看全部问答>

寻南京WDK开发高级人员

因业务需求,招WDK开发,从事BDA架构,WDK  PCIe设备驱动开发,待遇优厚,要求有过WDK项目开发经验。非诚勿扰.mail:karllichina@sina.com,Tel:13376067858…

查看全部问答>

windows键盘中断问题

在DOS下敲下键盘就会触发一条int 9指令 windows下呢?是不是也是用int 来触发一个中断 这个中断号是多少? …

查看全部问答>

WINCE下网卡驱动的开发问题,进者有分,结贴做总结,欢迎畅所欲言【推荐】

最近在做网卡驱动,但是无论是google还是baidu发现这方面的资料不多,尤其是wince下网卡驱动的开发,就更少了!以前由于BSP包里面都带,要么CS8900,要么DM9000,当然也有其他的网卡。其中在模拟器里面提供了CS8900网卡的源码,现在抛出问题,希望能 ...…

查看全部问答>

帮我解释下这个AT89C51实验

实验一:P1.1端口连接发光二极管,输出低电平时亮,高电平灭;P3.2按键,松开悬空,按下接低电平                ORG     0000H         &n ...…

查看全部问答>

如何改变EVC下DIALOG对话框的背景色

如题 大家帮忙咯 最好提供出确切代码 谢谢++ 还有个附加问题,如果想给对话框加个边框,怎么弄 又谢谢,再谢谢    嘿嘿…

查看全部问答>

关于cpld问题

我刚刚做了一块VC33的板子,板子上用的是XC95144XL,它的jtag直接引出(没有加上拉或者下拉电阻),我用IMPACT做边界扫描时(用自己做的下载线和购买革新科技的下载线),总是报告发现了很多个未知器件,当我手动加入XC95144XL器件后,无法和CPLD进 ...…

查看全部问答>

基于SOPC虚拟示波器的设计分析

  基于SOPC虚拟示波器的设计分析   模拟示波器由于无法高效地观察实验结果、数据处理功能弱等缺点,已逐渐被数字示波器所取代,但数字示波器价格昂贵。虚拟仪器是在通用计算机平台上,用户利用软件根据自已的需求定义设计仪器的测量功能,其可 ...…

查看全部问答>