PY32F003F18端口复用功能映射

PY32F003F18端口复用功能映射,GPIO引脚可配置为"输入,输出,模拟或复用功能。

一、端口A复用功能映射

端口A复用功能映射表里,每个引脚都有AF0~AF15,修改AF0~AF15的值,就可以将对应复用用能引脚映射到CPU引脚上。

修改PA0~PA7,见下面的寄存器:

 举例:

GPIOA_AFRL的bit3:0=9时,表示将PA0映射到AF9,即将USART2_TX映射到PA0;

GPIOA_AFRL的bit3:0=10时,表示将PA0映射到AF10,即将SPI1_MISO映射到PA0

GPIOA_AFRL的bit7:4=9时,表示将PA0映射到AF9,即将USART2_RX映射到PA1;

GPIOA_AFRL的bit7:4=10时,表示将PA0映射到AF10,即将SPI1_MOSI映射到PA1;

这个4是PA1的引脚号码乘以4得到的,1*4=4。

注意:引脚号码>7时,使用GPIOA_AFRH寄存器

GPIOA_AFRH的bit24:20=8时,表示将PA13映射到AF8,即将USART1_RX映射到PA13

这个20是PA13的(引脚号码-8)乘以4得到的,(13-8)*4=20。

注意,不要看花了眼睛

修改PA8~PA15,见下面的寄存器:

 二、端口B复用功能映射

举例:

GPIOB_AFRL的bit27:24=0时,表示将PB6映射到AF0,即将USART1_TX映射到PB6;

GPIOB_AFRL的bit27:24=4时,表示将PB6映射到AF10,即将USART2_TX映射到PB6

这个24是PB6的引脚号码乘以4得到的,6*4=24。

GPIOB_AFRL的bit31:28=0时,表示将PB7映射到AF0,即将USART1_RX映射到PB7;

GPIOB_AFRL的bit31:28=4时,表示将PB7映射到AF4,即将USART2_RX映射到PB7;

这个28是PB7的引脚号码乘以4得到的,7*4=28

注意,不要看花了眼睛

 三、端口F复用功能映射

 举例:

GPIOF_AFRL的bit7:4=8时,表示将PA0映射到AF8,即将USART1_TX映射到PF1;

GPIOF_AFRL的bit7:4=9时,表示将PA0映射到AF9,即将USART2_RX映射到PF1

这个4是PF1的引脚号码乘以4得到的,1*4=4。

注意,不要看花了眼睛

复用功能,能看懂这几个表,就可以了。 

四、先理论后实践,见程序:

/*
举例:
GPIOB_AFRL的bit27:24=0时,表示将PB6映射到AF0,即将USART1_TX映射到PB6;
GPIOB_AFRL的bit27:24=4时,表示将PB6映射到AF10,即将USART2_TX映射到PB6;
这个24是PB6的引脚号码乘以4得到的,6*4=24。
GPIOB_AFRL的bit31:28=0时,表示将PB7映射到AF0,即将USART1_RX映射到PB7;
GPIOB_AFRL的bit31:28=4时,表示将PB7映射到AF4,即将USART2_RX映射到PB7;
*/
GPIO模式配置开始,GPIO Mode Configuration
//函数功能:当引脚配置为"AF复用功能时,需要将外设映射到引脚上
//alternate=GPIO_AF0_USART1,将引脚复用为USART1
//alternate=GPIO_AF1_USART1,将引脚复用为USART1
//alternate=GPIO_AF3_USART1,将引脚复用为USART1
//alternate=GPIO_AF3_USART2,将引脚复用为USART2
//alternate=GPIO_AF4_USART2,将引脚复用为USART2
//alternate=GPIO_AF5_USART2,将引脚复用为USART2
//alternate=GPIO_AF9_USART2,将引脚复用为USART2
void Configure_Alternate_function_mapped_with_Pin(GPIO_TypeDef *GPIOx,uint32_t Pin,uint32_t alternate)
{uint32_t temp;uint32_t position;uint32_t iocurrent;position=0;while( (Pin >> position) != 0x00u ){iocurrent = (Pin) & (1uL << position);//获取引脚位置,Get current io positionif(iocurrent != 0x00u)//这个引脚需要配置{temp = GPIOx->AFR[position >> 3u];//当GPIOx=GPIOA,position<=7时,表示GPIOA->AFR[0],读"GPIO复用功能寄存器GPIOA_AFRL"//当GPIOx=GPIOA,position>=8时,表示GPIOA->AFR[1],读"GPIO复用功能寄存器GPIOA_AFRH"//当GPIOx=GPIOB,position<=7时,表示GPIOB->AFR[0],读"GPIO复用功能寄存器GPIOB_AFRL"//当GPIOx=GPIOB,position>=8时,表示GPIOB->AFR[1],读"GPIO复用功能寄存器GPIOB_AFRH"//当GPIOx=GPIOF,position<=7时,表示GPIOF->AFR[0],读"GPIO复用功能寄存器GPIOF_AFRL"//当GPIOx=GPIOF,position>=8时,表示GPIOF->AFR[1],读"GPIO复用功能寄存器GPIOF_AFRH"temp &= ~(0xFu << ((position & 0x07u) * 4u));//当GPIOx=GPIOA,且position=0,则清除GPIOA_AFRL的bit3:0的值,映射到AF0通道//当GPIOx=GPIOA,且position=1,则清除GPIOA_AFRL的bit7:4的值,映射到AF0通道//当GPIOx=GPIOA,且position=2,则清除GPIOA_AFRL的bit11:8的值,映射到AF0通道//当GPIOx=GPIOA,且position=3,则清除GPIOA_AFRL的bit15:12的值,映射到AF0通道//当GPIOx=GPIOA,且position=4,则清除GPIOA_AFRL的bit19:16的值,映射到AF0通道//当GPIOx=GPIOA,且position=5,则清除GPIOA_AFRL的bit23:20的值,映射到AF0通道//当GPIOx=GPIOA,且position=6,则清除GPIOA_AFRL的bit27:24的值,映射到AF0通道//当GPIOx=GPIOA,且position=7,则清除GPIOA_AFRL的bit31:28的值,映射到AF0通道//当GPIOx=GPIOA,且position=8,则清除GPIOA_AFRH的bit3:0的值,映射到AF0通道//当GPIOx=GPIOA,且position=9,则清除GPIOA_AFRH的bit7:4的值,映射到AF0通道//当GPIOx=GPIOA,且position=10,则清除GPIOA_AFRH的bit11:8的值,映射到AF0通道//当GPIOx=GPIOA,且position=11,则清除GPIOA_AFRH的bit15:12的值,映射到AF0通道//当GPIOx=GPIOA,且position=12,则清除GPIOA_AFRH的bit19:16的值,映射到AF0通道//当GPIOx=GPIOA,且position=13,则清除GPIOA_AFRH的bit23:20的值,映射到AF0通道//当GPIOx=GPIOA,且position=14,则清除GPIOA_AFRH的bit27:24的值,映射到AF0通道//当GPIOx=GPIOA,且position=15,则清除GPIOA_AFRH的bit31:28的值,映射到AF0通道//同理当GPIOx=GPIOB和当GPIOx=GPIOF,也是一样temp |= ( alternate << ((position & 0x07u) * 4u) );//当GPIOx=GPIOA,且position=0,则使用alternate的值修改GPIOA_AFRL的bit3:0的值,映射到AF[alternate]通道,如:alternate=9将PA0映射到USART2_TX//当GPIOx=GPIOA,且position=1,则使用alternate的值修改GPIOA_AFRL的bit7:4的值,映射到AF[alternate]通道,如:alternate=9将PA0映射到USART2_RX//当GPIOx=GPIOA,且position=2,则使用alternate的值修改GPIOA_AFRL的bit11:8的值,映射到AF[alternate]通道//当GPIOx=GPIOA,且position=3,则使用alternate的值修改GPIOA_AFRL的bit15:12的值,映射到AF[alternate]通道//当GPIOx=GPIOA,且position=4,则使用alternate的值修改GPIOA_AFRL的bit19:16的值,映射到AF[alternate]通道//当GPIOx=GPIOA,且position=5,则使用alternate的值修改GPIOA_AFRL的bit23:20的值,映射到AF[alternate]通道//当GPIOx=GPIOA,且position=6,则使用alternate的值修改GPIOA_AFRL的bit27:24的值,映射到AF[alternate]通道//当GPIOx=GPIOA,且position=7,则使用alternate的值修改GPIOA_AFRL的bit31:28的值,映射到AF[alternate]通道//当GPIOx=GPIOA,且position=8,则使用alternate的值修改GPIOA_AFRH的bit3:0的值,映射到AF[alternate]通道//当GPIOx=GPIOA,且position=9,则使用alternate的值修改GPIOA_AFRH的bit7:4的值,映射到AF[alternate]通道//当GPIOx=GPIOA,且position=10,则使用alternate的值修改GPIOA_AFRH的bit11:8的值,映射到AF[alternate]通道//当GPIOx=GPIOA,且position=11,则使用alternate的值修改GPIOA_AFRH的bit15:12的值,映射到AF[alternate]通道//当GPIOx=GPIOA,且position=12,则使用alternate的值修改GPIOA_AFRH的bit19:16的值,映射到AF[alternate]通道//当GPIOx=GPIOA,且position=13,则使用alternate的值修改GPIOA_AFRH的bit23:20的值,映射到AF[alternate]通道//当GPIOx=GPIOA,且position=14,则使用alternate的值修改GPIOA_AFRH的bit27:24的值,映射到AF[alternate]通道//当GPIOx=GPIOA,且position=15,则使用alternate的值修改GPIOA_AFRH的bit31:28的值,映射到AF[alternate]通道//同理当GPIOx=GPIOB和当GPIOx=GPIOF,也是一样GPIOx->AFR[position >> 3u] = temp;//当GPIOx=GPIOA,position<=7时,表示GPIOA->AFR[0],将temp写入"GPIO复用功能寄存器GPIOA_AFRL"//当GPIOx=GPIOA,position>=8时,表示GPIOA->AFR[1],将temp写入"GPIO复用功能寄存器GPIOA_AFRH"//当GPIOx=GPIOB,position<=7时,表示GPIOB->AFR[0],将temp写入"GPIO复用功能寄存器GPIOB_AFRL"//当GPIOx=GPIOB,position>=8时,表示GPIOB->AFR[1],将temp写入"GPIO复用功能寄存器GPIOB_AFRH"//当GPIOx=GPIOF,position<=7时,表示GPIOF->AFR[0],将temp写入"GPIO复用功能寄存器GPIOF_AFRL"//当GPIOx=GPIOF,position>=8时,表示GPIOF->AFR[1],将temp写入"GPIO复用功能寄存器GPIOF_AFRH"}position++;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/70572.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode 925. 长按键入

2023.9.7 我的基本思路是两数组字符逐一对比&#xff0c;遇到不同的字符&#xff0c;判断一下typed与上一字符是否相同&#xff0c;不相同返回false&#xff0c;相同则继续对比。 最后要分别判断name和typed分别先遍历完时的情况。直接看代码&#xff1a; class Solution { p…

【业务功能篇99】微服务-springcloud-springboot-电商订单模块-生成订单服务-锁定库存

八、生成订单 一个是需要生成订单信息一个是需要生成订单项信息。具体的核心代码为 /*** 创建订单的方法* param vo* return*/private OrderCreateTO createOrder(OrderSubmitVO vo) {OrderCreateTO createTO new OrderCreateTO();// 创建订单OrderEntity orderEntity build…

[HNCTF 2022] web 刷题记录

文章目录 [HNCTF 2022 Week1]easy_html[HNCTF 2022 Week1]easy_upload[HNCTF 2022 Week1]Interesting_http[HNCTF 2022 WEEK2]ez_SSTI[HNCTF 2022 WEEK2]ez_ssrf[HNCTF 2022 WEEK2]Canyource [HNCTF 2022 Week1]easy_html 打开题目提示cookie有线索 访问一下url 发现要求我们…

C语言中计算函数执行时间

要计算C语言程序中某个函数从开始到结束执行的时间&#xff0c;可以使用C标准库中的clock()函数。clock()函数返回程序执行开始到当前时刻的时钟数&#xff0c;除以某个常数&#xff08;CLOCKS_PER_SEC&#xff09;&#xff0c;就可以得到程序执行的秒数。 下面是一个示例代码…

mybatisplus多租户原理略解

概述 当前mybatisPlus版本 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.2</version> </dependency>jdk版本&#xff1a;17 springboot版本&#xff1a;…

深入探讨Kubernetes(K8s)在云原生架构中的关键作用和应用

文章目录 1. 容器化的应用程序管理2. 自动化扩展和负载均衡3. 容器编排和调度4. 存储管理5. 自动化滚动更新6. 多云和混合云部署7. 监控和日志8. 安全9. 社区支持和生态系统10. 未来展望案例 &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &#x1…

2023年高教社杯全国大学生数学建模竞赛参赛事项注意

MathClub数模资源&#xff0c;含专属思路 资源链接&#xff1a;点击这里获取众多数模资料、思路精讲、论文模板latex和word、学习书籍等 2023高教社杯数学建模国赛–赛前准备 一年一度的数学建模国赛要来啦&#xff01;&#xff01;&#xff01;小编仔细阅读了比赛官方网站上…

java 实现外观模式

外观模式&#xff08;Facade Pattern&#xff09;是一种结构型设计模式&#xff0c;它提供了一个简化的接口&#xff0c;用于访问一组相关的接口或子系统。外观模式的主要目的是隐藏复杂的系统结构&#xff0c;提供一个更简单的接口供客户端使用。以下是一个简单的Java示例&…

【请求报错:javax.net.ssl.SSLHandshakeException: No appropriate protocol】

1、问题描述 在请求服务时报错说SSL握手异常协议禁用啥的&#xff0c;而且我的连接数据库的url也加了useSSLfalse javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)2、解决方法 在网上查找了方法…

LeetCode 1004.最大连续1的个数

题目链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目解析 硬往题目介绍上边去想的话其实非常困难&#xff0c;如果换种方式思考就会简单许多。 若我们将思想转化为&#xff0c;找出最长的子串(里面含有的0的数量最大为k)&#xff0c;然后返…

QT实现任意阶贝塞尔曲线绘制

bezier曲线在编程中的难点在于求取曲线的系数&#xff0c;如果系数确定了那么就可以用微小的直线段画出曲线。bezier曲线的系数也就是bernstein系数&#xff0c;此系数的性质可以自行百度&#xff0c;我们在这里是利用bernstein系数的递推性质求取&#xff1a; 简单举例 两个…

运维Shell脚本小试牛刀(七):在函数文脚本件中调用另外一个脚本文件中函数|函数递归调用|函数后台执行

运维Shell脚本小试牛刀(一) 运维Shell脚本小试牛刀(二) 运维Shell脚本小试牛刀(三)::$(cd $(dirname $0)&#xff1b; pwd)命令详解 运维Shell脚本小试牛刀(四): 多层嵌套if...elif...elif....else fi_蜗牛杨哥的博客-CSDN博客 Cenos7安装小火车程序动画 运维Shell脚本小试…

华纳云:Linux的底层体系结构是怎样的

Linux操作系统的底层体系结构是一个开源的Unix-like操作系统内核&#xff0c;通常称为Linux内核(Linux Kernel)。下面是Linux底层体系结构的主要组成部分和工作原理&#xff1a; 内核&#xff08;Kernel&#xff09;&#xff1a; Linux的核心部分是内核&#xff0c;它是操作系统…

【扩散模型 李宏毅B站教学以及基础代码运用】

李宏毅教学视频&#xff1a; Link1 B站DDPM公式推导以及代码实现&#xff1a; Link2 这个视频里面有论文里面的公式推导&#xff0c;并且1小时10分开始讲解实例代码。 文章目录 扩散模型概念&#xff1a;Diffusion Model工作原理&#xff1a;影像生成模型本质上的共同目标B站…

算法——组合程序算法解析

组合就是从m个元素的数组中求n个元素的所有组合&#xff0c;代码如下&#xff1a; #include <iostream> #include <vector> using namespace std; // 递归求解组合 void combinations(vector<int>& nums, vector<int>& combination, int star…

Linux 安装 JDK

要在Linux上安装JDK 1&#xff0c;按照以下步骤进行操作&#xff1a; 1. 下载JDK安装文件&#xff1a;首先&#xff0c;你需要找到适用于你操作系统的JDK安装文件&#xff08;tar.gz或tar.bz2格式&#xff09;。你可以从Oracle官方网站或其他可信的来源下载该文件。 2. 解压…

Ansible自动化运维

目录 前言 一、概述 常见的开源自动化运维工具比较 二、ansible环境搭建 三、ansible模块 &#xff08;一&#xff09;、hostname模块 &#xff08;二&#xff09;、file模块 &#xff08;三&#xff09;、copy模块 &#xff08;四&#xff09;、fetch模块 &#xff…

C++ 新旧版本两种读写锁

一、简介 读写锁&#xff08;Read-Write Lock&#xff09;是一种并发控制机制&#xff0c;用于多线程环境中实现对共享资源的高效读写操作。读写锁允许多个线程同时读取共享资源&#xff0c;但在有写操作时&#xff0c;需要互斥地独占对共享资源的访问&#xff0c;以确保数据的…

ITSS运维资质认证:提升企业竞争力

ITSS运维资质认证是近年来备受企业关注的热门话题。通过认证&#xff0c;企业能够提高运维团队的技术实力&#xff0c;加强服务质量&#xff0c;提升竞争力。下面将为大家分析其对企业的影响和意义。 随着信息技术的迅猛发展&#xff0c;企业对IT系统的可靠性和稳定性要求越来越…

ElementUI浅尝辄止21:Tree 树形控件

树形组件&#xff1a;用清晰的层级结构展示信息&#xff0c;可展开或折叠。 树组件使用挺频繁的&#xff0c;常见于侧边栏树形目录、树形下拉选项按钮或搜索查询树形信息选项 1.如何使用&#xff1f; 基础的树形结构展示 <el-tree :data"data" :props"defa…