当前位置: 首页 > news >正文

STM32——端口复用与重映射概述与配置(HAL库)

文章目录

    • 前言
    • 一、什么是端口复用?什么是重映射?有什么区别?
    • 二、端口复用配置

前言

本篇文章介绍了在单片机开发过程中使用的端口复用与重映射。做自我学习的简单总结,不做权威使用,参考资料为正点原子STM32F1系列精英板HAL库开发手册。我也做了相关对比,其实HAL库与标准库差别不大,HAL库封装更多更好移植,原理上是通用的。

一、什么是端口复用?什么是重映射?有什么区别?

STM32F1 有很多的内置外设,这些外设的外部引脚都是与 GPIO 复用的。也就是说,一个 GPIO如果可以复用为内置外设的功能引脚,那么当这个 GPIO 作为内置外设使用的时候,就叫做复用。

根据正点资料和自己搜索的资料,大概总结,端口复用就是一个端口有多个功能,我们查看原理图的时候有以下标志,表示是个复用端口,既可以作为PD2IO,还可以作为TIM定时器和UART串口和SDIO接口。
在这里插入图片描述
映射就是寄存器配置,某一位改变其IO口的功能,比如使能第三位原来是串口的TX,由于不满足配置要求,比如电压、频率等,换成了使能第四位为TX,那么重映射后,引脚的物理位置发生变化。

二、端口复用配置

参考正点资料,例子为配置 GPOPA.9,GPIOA.10 口为串口 1 复用功能的一般步骤。
1.首先,我们要使用 IO 复用功能,必须先打开对应的 IO 时钟和复用功能外设时钟,这里我们使用了 GPIOA 以及 USART1,所以我们需要使能 GPIOA 和 USART1 时钟。方法如下:

__HAL_RCC_GPIOA_CLK_ENABLE(); //使能 GPIOA 时钟 
__HAL_RCC_USART1_CLK_ENABLE(); //使能 USART1 时钟
__HAL_RCC_AFIO_CLK_ENABLE(); //使能辅助功能 IO 时钟 

2. 然后,我们在 GIPOx_MODER 寄存器中将所需 IO(对于串口 1 是 PA9,PA10)配置为复用功能。
3. 最后,我们还需要对 IO 口的其他参数,例如上拉/下拉以及输出速度等进行配置。
上面三步,在我们 HAL 库中是通过 HAL_GPIO_Init 函数来实现的,参考代码如下:

GPIO_InitTypeDef GPIO_Initure; 
GPIO_Initure.Pin=GPIO_PIN_9;//PA9 
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出 
GPIO_Initure.Pull=GPIO_PULLUP;//上拉 
GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;//高速 
HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化 PA9 

通过上面的配置,PA9 复用为串口 1 的发送引脚。这个时候,PA9 将不再作为普通的 IO 口
使用。对于 PA10,配置方法一样,修改 Pin 成员变量值为 PIN_10 即可。

相关文章:

  • STM32-HAL库09-CAN通讯(loopback模式)
  • labview实现仪器的控制visa
  • 【Java】如何将二进制转换成MultipartFile
  • Flink SQL 表值聚合函数(Table Aggregate Function)详解
  • 突然消失的桌面文件如何恢复?详细教程让你轻松解决问题!
  • 模拟法——张三的零花钱(C#)
  • 从零开始搭建React+TypeScript+webpack开发环境-基于lerna的webpack项目工程化改造
  • 立体库堆垛机控制程序手动功能实现
  • linux 下正确使用cp命令复制目录
  • QT windows与linux之间sokcet通信中文乱码问题解决方法
  • go学习之接口知识
  • 【ArcGIS Pro微课1000例】0031:las点云提取(根据范围裁剪点云)
  • 前、后端程序员开发常用api接口
  • SpringBoot 项目优雅实现读写分离 | 京东云技术团队
  • CTFhub-RCE-远程包含
  • 【mysql】环境安装、服务启动、密码设置
  • 【笔记】你不知道的JS读书笔记——Promise
  • 〔开发系列〕一次关于小程序开发的深度总结
  • Angular Elements 及其运作原理
  • Flex布局到底解决了什么问题
  • mockjs让前端开发独立于后端
  • PHP的Ev教程三(Periodic watcher)
  • php的插入排序,通过双层for循环
  • RxJS: 简单入门
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 警报:线上事故之CountDownLatch的威力
  • 前端性能优化——回流与重绘
  • 如何学习JavaEE,项目又该如何做?
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 时间复杂度与空间复杂度分析
  • 数据科学 第 3 章 11 字符串处理
  • 提醒我喝水chrome插件开发指南
  • AI算硅基生命吗,为什么?
  • Android开发者必备:推荐一款助力开发的开源APP
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (九)One-Wire总线-DS18B20
  • (论文阅读30/100)Convolutional Pose Machines
  • (转载)CentOS查看系统信息|CentOS查看命令
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • @AliasFor注解
  • [ 蓝桥杯Web真题 ]-布局切换
  • [20171101]rman to destination.txt
  • [Android 13]Input系列--获取触摸窗口
  • [android] 请求码和结果码的作用
  • [BZOJ 3680]吊打XXX(模拟退火)
  • [C++] 统计程序耗时
  • [Electron] 将应用打包成供Ubuntu、Debian平台下安装的deb包
  • [GN] Vue3.2 快速上手 ---- 核心语法2
  • [IE编程] 如何获得IE版本号
  • [JavaScript]_[初级]_[不使用JQuery原生Ajax提交表单文件并监听进度]
  • [Linux] Apache的配置与运用