STM32串口操作相关事项

发布者:SereneDreamer最新更新时间:2024-10-21 来源: cnblogs关键字:STM32  串口操作  配置 手机看文章 扫描二维码
随时随地手机看文章

放了一段时间,对stm32似乎有点陌生,总结一下!

(基于3.0固件库,芯片stm32f103rbt6)

1、配置串口的管脚和时钟

由于串口1、2是在GPIOA上:

所以要是能串口GPIOA、AFIO和1或者2的串口时钟,代码如下:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | 

            RCC_APB2Periph_AFIO |

            RCC_APB2Periph_USART1 , 

            ENABLE);

2、对串口的具体物理管脚进行相应的配置:

 /* A9 USART1_Tx */

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //推挽输出-TX

    GPIO_Init(GPIOA, &GPIO_InitStructure);

    /* A10 USART1_Rx  */

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

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

GPIO_Init(GPIOA, &GPIO_InitStructure);

3、在设置波特率、数据位、停止位。。。。。。。

完整测试程序如下:

串口的配置:

void USART_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
 USART_ClockInitTypeDef USART_ClockInitStructure;
 
 //
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |
            RCC_APB2Periph_AFIO |
            RCC_APB2Periph_USART1 ,
            ENABLE);

    /* A9 USART1_Tx */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    /* A10 USART1_Rx  */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//
    GPIO_Init(GPIOA, &GPIO_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_Rx | USART_Mode_Tx;
 
 USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;
 USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
 USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
 USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;

 USART_ClockInit(USART1, &USART_ClockInitStructure);
    USART_Init(USART1, &USART_InitStructure);
    /* Enable the USARTx */
    USART_Cmd(USART1, ENABLE);
 
 
 //
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
 
 // A2 ×?T2X
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // A3 ×?R2X
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_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_Rx | USART_Mode_Tx;
 
 USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;
 USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
 USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
 USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;

    USART_ClockInit(USART2, &USART_ClockInitStructure);
    USART_Init(USART2, &USART_InitStructure);
   
    USART_Cmd(USART2, ENABLE);
 //
 USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
}
串口发送函数:

void USART1_Putc(unsigned char c)
{
    USART_SendData(USART1, c);
    while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET );
}

void USART1_Puts(char * str)
{
    while(*str)
    {
        USART_SendData(USART1, *str++);
        /* Loop until the end of transmission */
        while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
    }
}

串口1接收中断函数:

void USART1_IRQHandler(void)
{
 //接收中断
 if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET)
 {
  USART_ClearITPendingBit(USART1,USART_IT_RXNE);
  Uart1_Get_Data=USART_ReceiveData(USART1);

 }
 
 //溢出-如果发生溢出需要先读SR,再读DR寄存器 则可清除不断入中断的问题
 if(USART_GetFlagStatus(USART1,USART_FLAG_ORE)==SET)
 {
  USART_ClearFlag(USART1,USART_FLAG_ORE); //读SR
  USART_ReceiveData(USART1);    //读DR
 }
}


关键字:STM32  串口操作  配置 引用地址:STM32串口操作相关事项

上一篇:UCGUI在STM32平台移植经验(无操作系统)
下一篇:关于stm32串口下载的问题

推荐阅读最新更新时间:2026-03-23 11:49

STM32串口通信的基本操作
STM32中串口通信的基本操作 USART_SR状态寄存器 比较常用的位 操纵该寄存器的函数 FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG); USART_DR数据寄存器 DR寄存器的操作流程 操作DR寄存器的函数 USART_BRR波特率寄存器 操作BRR寄存器的函数 void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct); 注:除此之外,这个函数还用来配置串口通信的其他参数,具体参数如下: 波特率与USARTDI
[单片机]
<font color='red'>STM32</font>中<font color='red'>串口</font>通信的基本<font color='red'>操作</font>
基于STM32从零写操作系统系列---将printf指向串口输出
为什么需要printf? 首先,这个printf不是标准C中的printf,这个printf是自己参考标准库实现的。只是简单地完成了打印输出int,long long int, unsigned int, unsigned long long int, float, double和十六进制数等功能。主要用于在以后的学习中,输出变量、寄存器等的数据,便于调试程序。 1.函数调用中的参数传递 根据《Procedure Call Standard for the ARM ® Architecture》(文章结尾有下载分享)这个文档可知,标准规定在寄存器(r0-r3)和堆栈中传递参数。对于采用少量参数的子程序,仅使用寄存器,大大减少了
[单片机]
基于<font color='red'>STM32</font>从零写<font color='red'>操作</font>系统系列---将printf指向<font color='red'>串口</font>输出
基于STM32从零写操作系统系列---基于寄存器写串口驱动
目的 尝试基于寄存器层面,编写串口的驱动。用这种方式编写串口驱动,有点类似于使用汇编语言。面向的是每一个单独的寄存器,通过读、改、写的手段,配置寄存器。但是这种方式能够更接近硬件,用硬件的思维编程。 相对于《基于STM32从零写操作系统系列---使用C语言》,这章重新调整了文件结构,让项目文件更好管理和维护。主要使用了makefile的嵌套编译方法来编译多目录下的代码文件。 分析 1.Makefile嵌套编译 首先简单来看一下文件结构: 再看一下顶层Makefile,主要差异如下: 各子目录下的Makefile比较简单 其中需要注意的是: 在windows的cmd命令行中for命令用于查找
[单片机]
基于<font color='red'>STM32</font>从零写<font color='red'>操作</font>系统系列---基于寄存器写<font color='red'>串口</font>驱动
STM32使用串口的必备操作
从图中可以看出,这两个引脚主功能是用来做普通的io口,复用模式下用作串口1. 所以,上电初始化的时候必须开启复用功能时钟。 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
[单片机]
<font color='red'>STM32</font>使用<font color='red'>串口</font>的必备<font color='red'>操作</font>
STM32单片机串口一键下载电路与操作方法详解
STM32三种启动模式对应的存储介质均是芯片内置的,它们是: 1)用户闪存 = 芯片内置的Flash。 2)SRAM = 芯片内置的RAM区,就是内存啦。 3)系统存储器 = 芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Bootloader,就是通常说的ISP程序。这个区域的内容在芯片出厂后没有人能够修改或擦除,即它是一个ROM区。 要了解STM32的几种启动模式. BOOT0接GND,BOOT1接GND.那就是正常的启动模式,从flash加载代码. 而BOOT0接V3.3,BOOT1接GND.则是ISP模式,也就是串口更新代码. 其次,你要了解STM32 ISP下载代码的过程. 首先BOOT0接V3.3,然
[单片机]
<font color='red'>STM32</font>单片机<font color='red'>串口</font>一键下载电路与<font color='red'>操作</font>方法详解
STM32 GPIO配置速成:三步轻松搞定
快速入手STM32:三步骤搞定GPIO配置 STM32是意法半导体(STMicroelectronics)推出的一款广泛应用于嵌入式开发的32位微控制器。对于初学者来说,STM32的配置可能会显得有些复杂,但其实只要掌握了核心步骤,就能快速上手。本文将带你通过三个简单步骤,轻松配置STM32的GPIO引脚,并实现一个LED闪烁的小项目。 第一步:启用时钟 在STM32中,每个外设(如GPIO、USART、定时器等)都需要时钟信号才能工作。因此,使用任何外设的第一步就是启用它的时钟。 代码示例 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); 解释 RCC_APB2P
[单片机]
STM32串口基本配置
记得刚开始接触STM32时,第一个用到的就是串口功能,当时还是刚毕业的小菜鸟(虽然现在依然是),一点一点地啃官方手册,芯片手册,调通第一个程序时心里那叫一个激动,因为一直以来自己都是一个不太优秀的笨学生,老师同学包括家人都不太看好,干什么事情都笨笨的,庆幸自己遇到了一个好师傅,一步一步把我带进这行,我格外珍惜。经常有人问我为什么对待刚毕业的学生那么有耐心,我的回答是:"因为我有过相同的经历,我知道那种战战兢兢又要厚着脸皮问别人的滋味有多不好受。”(也不知道为啥做点经验总结,还有这么多的感慨,也是醉了~)
[单片机]
STM32 HAL开发环境搭建指南:Keil MDK-ARM、STM32F1xx DFP与ST-Link工具链配置详解,结合STM32CubeMX使
安装Keil(MDK-ARM)【集成开发环境IDE】 我们会在Keil(MDK-ARM)上去编写代码、编译代码、烧写代码、调试代码。 Keil(MDK-ARM)的安装方法: 教学视频的第02分03秒开始看。 安装过程中请修改一下下面两个路径,避免占用C盘空间。 Core就是Keil(MDK-ARM)的程序安装目录。 Pack是各系列芯片的开发板的开发包的安装目录。 还要填写下用户信息: 然后开始安装: 同意安装“KEIL-Tools By ARM 通用串行总线控制器” 启动之后Keil会自动进行包描述的更新: 我们最好耐心等待它检查完,右下角会有进度: 大概会花费10到20分钟左右的时间 2025-03-29
[单片机]
<font color='red'>STM32</font> HAL开发环境搭建指南:Keil MDK-ARM、STM32F1xx DFP与ST-Link工具链<font color='red'>配置</font>详解,结合STM32CubeMX使
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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