STM32学习笔记 - 串口的初始设置

2023-05-16

STM32学习笔记 - 串口的初始设置

1. 声明结构体变量
GPIO_InitTypeDef GPIO_InitStructure;

-GPIO_InitTypeDef是一个结构体变量,包括GPIO_Pin(u16类型),GPIOSpeed(GPIOSpeed_TypeDef 类型)和GPIOMode(GPIOMode_TypeDef 类型),之后在设置引脚时会再用到。

2. RCC时钟设置

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);

-串口1模块时钟寄存器:RCC_APB2Periph_USART1;
-串口1端口(PA9/PA10)的时钟寄存器:RCC_APB2Periph_GPIOA;
-串口2的模块时钟寄存器:RCC_APB1Periph_USART2;
-串口2端口(PA2/PA3)的时钟寄存器:RCC_APB2Periph_GPIOA;

3. 设置引脚的IO功能模式和speed

/* 定义USART1-TX引脚 PA9 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //IO口第9脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //IO口复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* 定义USART1-RX引脚 PA10 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //IO口第10脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //IO口悬空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* 定义USART2-TX引脚 PA2 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //IO口第2脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//IO口复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* 定义USART2-RX引脚 PA3 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //IO口第3脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //IO口悬空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);

4. IO重映射
STM32的管脚功能可以重映射,将串口2的TX和RX端口从默认的PA2/PA3,重新定义到PD2/PD3上。
IO重映射的时钟寄存器:RCC_APB2Periph_AFIO;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
写入控制IO重定义功能的寄存器:
GPIO_PinRemapConfig(GPIO_Remap_USART2,ENABLE);

5. 串口初始化设置
USART_InitStructure.USART_BaudRate = 115200;//波特率
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_Init(USART1, &USART_InitStructure); //把以上设置写入寄存器中(串口1)
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//接收中断
//USART_ITConfig(USART1, USART_IT_TXE, ENABLE);//发送中断
USART_Cmd(USART1, ENABLE); //使能串口1

USART_Init(USART2, &USART_InitStructure); //把以上设置写入寄存器中(串口2)
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//接收中断
//USART_ITConfig(USART2, USART_IT_TXE, ENABLE);//发送中断
USART_Cmd(USART2, ENABLE); //使能串口2

6. 中断设置
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//主优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//次优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//中断使能
NVIC_Init(&NVIC_InitStructure);


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32学习笔记 - 串口的初始设置 的相关文章

随机推荐

  • ESP8266学习笔记3-闪存文件系统

    3 3 1 闪存文件SPIFFS基本操作 程序来源 xff1a 太极创客http www taichi maker com homepage esp8266 nodemcu iot iot c spiffs spiffs operation
  • 同一寄存器不同位域赋值的两种方法

    当一个寄存器有不同位域时 xff0c 我们需要给不同位域赋值 如何赋值方便呢 xff1f 下面有两种方法 xff0c 总结一下 个人觉得位域写法更简洁 整体寄存器法 typedef struct StrNa uint32 t reg1 re
  • mavlink解析

    之前看了mavlink协议 xff0c 网上关于mavlink的资料不多 本系列共三篇 xff0c 这是第一篇 本文大概总结了下对mavlink协议的理解 以下如不说明都是说mavlink v1 0版本 首先附上mavlink的各个消息的简
  • Tomcat部署及优化

    目录 1 Tomcat概述 1 Tomcat的概念 2 Tomcat的核心组件 3 Java Servlet 的概念 4 JSP的概念 5 Tomcat中最顶层的容器 server 6 四个子容器的作用 7 Tomcat请求过程 2 Tom
  • STC89C52系列单片机内部资源——串口通信

    计算机通信是将计算机技术和通信技术的相结合 xff0c 完成计算机与外部设备或计算机与计算机之间的信息交换 可以分为两大类 xff1a 并行通信与串行通信 并行通信通常是将数据字节的各位用多条数据线同时进行传送 并行通信控制简单 传输速度快
  • 用TCP/UDP 网络调试助手(PC版)无法获取网页信息

    以前的网页均是http开头的 xff0c 是没有加密的 xff0c 以前用GET就能获取网页的信息 xff0c 但是现在的基本是https开头的 xff0c 是加密的 xff0c 所以现在用以前的方法 xff0c 只能返回301错误 现在想
  • Ubuntu 20.04安装Ros Noetic及Ubuntu 18.04安装ROS Melodic(两版本详细填坑)

    Ubuntu 20 04安装Ros Noetic及18 04安装ROS Melodic 表1 1 ROS的历史版本 1 设置安装源2 添加秘钥3 更新列表4 开始安装5 配置ROS环境变量6 安装rosinstall6 1 初始化核心组件r
  • linux 根文件系统,根设备,sys_open, sys_read, sys_write, sys_mount, sys_mknod

    笔者语 xff1a 1 内容涉及比较多 xff0c 自己也没有分章节 xff0c 因为觉得这些内容关联性很强 xff0c 自己也懒的去弄了 2 本文涉及以下内容 xff1a 2 1 内核启动过程中 xff0c 第一个文件系统为rootfs
  • uboot的配置(make xxx_config)和编译(make)工程解读

    uboot编译三步走 make xxx configmakemake install 第一步make xxx config 这一步是产生板子的配置文件 我们假设是配置ast2500evb板子 xff0c 那么这里的配置命令就是 make a
  • uboot启动之第一次运行C函数到uboot重定位

    接上一篇博文 uboot启动流程之上电启动到第一次准备好C语言运行环境 xff0c 本文从board init f 开始 board init f定义在uboot common board f c中 CONFIG SYS GENERIC B
  • pci总线扫描及pci网卡驱动

    本文讲述的基于intel 总线架构的硬件架构为例来说明linux是如何扫描总线上的PCI设备 CPU通过前端总线FS连接到北桥芯片North Bridge Chip 又称host Bridge 北桥芯片本身也是PCI总线0上的PCI设备 北
  • k8s下POD之间的通信过程

    本文主要描述同一个node之内的pod之间的通信 xff0c 以及不同node之间的pod之间的通信 同一个 node 上的不同 pod 之间的通信 xff1a 假设上图的POD A要和POD B 通信 POD A 发送一个包 xff0c
  • bash: ./<one_executable_file>: no such file or directory

    关于这个问题 xff0c 原因很多 但大部分的资料都是说PATH环境变量坏掉了 xff0c 或者 etc profile坏掉了 但其实 xff0c 还有一种原因 xff0c 就是你的可执行程序 lt one executable file
  • linux下动态库so的debug方式

    1 查看哪些进程使用了特定的动态库so lsof lib arm linux gnueabi libselinux so 1 COMMAND PID USER FD TYPE DEVICE SIZE OFF NODE NAME init 1
  • linux usb gadget driver代码

    本文基于linux 5 4 124 aspeed 2600 BMC 的代码实现来描述arm结构下的gadget driver 在读之前 xff0c 我们需要了解什么是usb gadget driver xff0c 以及它的作用 从英文字面上
  • 【毕业设计】深度学习社交安全距离检测系统 - python opencv

    文章目录 0 前言1 课题背景2 实现效果3 相关技术3 1 YOLOV43 2 基于 DeepSort 算法的行人跟踪 4 最后 0 前言 x1f525 Hi xff0c 大家好 xff0c 这里是丹成学长的毕设系列文章 xff01 x1
  • 关于进程和线程对于全局变量共享的问题学习总结

    进程和线程的共享 本文档可以说明以下几个问题 xff1a 问题一 xff1a 多进程编程中 xff0c 不同进程是否可以通过全局变量来通信 问题二 xff1a 多线程编程中 xff0c 不同线程是否可以通过全局变量来通信 xff1f 在说明
  • C语言调用so动态库的两种方式

    方式1 xff1a 类似静态库的调用 xff08 使用头文件 xff09 这种方式生成的程序会在启动时候就加载so动态库 add h span class hljs keyword int span add span class hljs
  • GPS RTK测量定位原理

    转自 xff1a https baijiahao baidu com s id 61 1603136753092877848 amp wfr 61 spider amp for 61 pc 手机定位是什么原理 xff1f 实时动态工程测量是
  • STM32学习笔记 - 串口的初始设置

    STM32学习笔记 串口的初始设置 1 声明结构体变量 GPIO InitTypeDef GPIO InitStructure GPIO InitTypeDef是一个结构体变量 xff0c 包括GPIO Pin xff08 u16类型 xf