PY32F003F18端口复用功能映射

news2024/10/2 3:24:22

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 position
		if(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.coloradmin.cn/o/983423.html

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

相关文章

【pthreads】支持vs2022构建

新增了一个vc16的目录 https://github.com/BrianGladman/pthreads/commit/60179353ef753ca171dee5199ec5fa54580835b0 官方已经支持直接支持v143 下载最新版,直接打开build.vs目录的sln vs 会提示安装python调试环境 安装过程自己失败取消了 再次打开就没弹出了。 直接构建静态…

2023全国大学生数学建模A题B题C题D题E题竞赛选题建议,思路模型

目录 国赛数学建模思路模型代码&#xff1a;9.7开赛后第一时间更新&#xff0c;完整思路获取见文末名片 一、题目选择 二、国赛摘要及论文写作技巧 1、国赛摘要 2、论文写作技巧 三、历年国赛真题及对应算法模型 完整国赛题思路模型获取见此 国赛数学建模思路模型代码&am…

企业架构LNMP学习笔记20

Nginx Location匹配规则&#xff1a; URI&#xff1a;统一资源标识符。 URN&#xff1a;统一资源名称。 URL&#xff1a;统一资源定位符。URL是更细化一点。 1&#xff09;精确匹配&#xff1a; location / {#规则 } 则匹配到 Example Domain 这种请求。 2&#xff09;~ 大…

RocketMQ consumer 和 queue 对应关系

参考 Consumer and Consumer Group Load Balancing https://rocketmq.apache.org/docs/4.x/consumer/01concept2 旧版本MQ结论 消费者应用和topic队列一对多的关系。 &#xff08;一个消费组consumer group里&#xff0c;一个消费者应用可以消费多个队列的消息。一个队列的消…

OpenMLDB 基于 Kubernetes 的部署全攻略

简介 Kubernetes 作为当前工业界流行的云原生容器编排和管理工具&#xff0c;在大量项目实践中被使用。目前&#xff0c;OpenMLDB 的离线引擎和在线引擎&#xff0c;均已经完整支持了基于 Kubernetes 的部署&#xff0c;可以实现更为方便的管理功能。本文将分别介绍离线和在线…

超级好用的10个思维导图模板

思维导图是一种非常有用的工具&#xff0c;可以被广泛应用于不同领域的人群。学生可以用思维导图来整理知识&#xff0c;老师可以用思维导图规划教学内容&#xff0c;设计课堂活动&#xff0c;还可以帮助学生梳理知识结构。各行各业的人都可以运用思维导图处理自己工作中的问题…

openWRT SFTP 远程文件传输

文章目录 前言 1. openssh-sftp-server 安装2. 安装cpolar工具3.配置SFTP远程访问4.固定远程连接地址 前言 本次教程我们将在OpenWRT上安装SFTP服务&#xff0c;并结合cpolar内网穿透&#xff0c;创建安全隧道映射22端口&#xff0c;实现在公网环境下远程OpenWRT SFTP&#xf…

如何阻止事件冒泡(event bubbling)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 原生 JavaScript⭐ jQuery⭐ React⭐Vue.js⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对…

龙蜥白皮书精选:龙蜥安全漏洞管理体系介绍

文/安全委员会 近日&#xff0c;龙蜥社区联合启明星辰、绿盟、360、阿里云、统信软件、浪潮信息、中兴通讯&#xff5c;中兴新支点、Intel、中科院软件所等 23 家单位正式成立了龙蜥社区安全联盟&#xff08;OASA&#xff0c;OpenAnolisSecurityAlliance&#xff09;。龙蜥社区…

解决charles只能使用30分钟

问题描述 Charles 30分钟会自动关闭&#xff0c;弹出一个弹窗。 解决步骤 1.网上查找后发现是需要注册一下。 2.打开Charles&#xff0c;如图的操作顺序 3.框内输入 Registered Name: https://zhile.io License Key: 48891cf209c6d32bf4 4.重启即可

momentjs实现DatePicker时间禁用

momentjs是一个处理时间的js库&#xff0c;简洁易用。 浅析一下&#xff0c; momentjs 在vue中对DatePicker时间组件的禁用实践。 一&#xff0c;npm下载 npm install moment --save二&#xff0c;particles.json中 "dependencies": {"axios": "^…

【C++技能树】多态解析

Halo&#xff0c;这里是Ppeua。平时主要更新C&#xff0c;数据结构算法&#xff0c;Linux与ROS…感兴趣就关注我bua&#xff01; 文章目录 0.多态的概念0.1 多态的定义 1. 重写2.Final与Override3.抽象类4.多态中的内存分布.4.1虚表存在哪里? 5.多态调用原理5.1 动态绑定与静…

解锁前端Vue3宝藏级资料 第一章 Vue3项目创建 3 (Vite 创建 vue项目 )

目前&#xff0c;Vue.js 官网建议在创建新项目的时候要使用 Vite 而不是 Vue CLI&#xff0c;尽量在开发环境中以 Vite 它作为 Vue.js 的编译基础来使用。Vite 是 Vue.js 作者Evan You 制作的 webpack 的无捆绑替代品&#xff0c;Vite vue 方式很可能会成为未来的vue项目主流方…

Spring学习|Spring配置:别名、import、依赖注入:构造器注入、Set方式注入(重点)、拓展方式注入

Spring配置 别名 我们可以在bean.xml中用alias标签给bean对象起一个别名&#xff0c;当我们在客户端通过context对象使用getBean方法获取对象时&#xff0c;可以通过这个别名获取&#xff0c;另一种方式是&#xff0c;可以在<bean标签后面加一个name&#xff0c;这个name后…

js 根据键判断值

最原始的写法&#xff1a; 改进后的写法&#xff1a; const DeviceTypeObj {SO2: "SO<sub>2</sub>",CO: "CO",NO: "NO",NO2: "NO<sub>2</sub>",O3: "O<sub>3</sub>", let value Dev…

亿发软件:智慧门店商超系统,2023新零售POS数字运营一体化管理

2023年9月6日&#xff0c;山东济宁一家超市因为酸奶价格标签错误而引发了广泛关注。标签原本显示几十个人为9.9元&#xff0c;但特价销售价却标为10元。这一小小的错误却在社交媒体上引发了轩然大波&#xff0c;让超市一度处于舆论的风口浪尖。超市工作人员回应&#xff0c;表示…

Python基础语法:数据分析利器

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

网络技术十四:文件传输协议

文件传输协议 FTP 定义 文件传输协议 客户端/服务器模型&#xff0c;具备身份验证功能 双TCP连接 端口 采用双TCP连接方式 控制连接: 21 用于传输FTP命令和执行信息 用于在FTP客户端和FTP服务器之间传输FTP控制命令及命令执行信息。控制连接在整个FTP会话期间一直保持打开…

儿童安全门和围栏,以及游戏围栏等美国站要求的合规标准是什么?

儿童安全门和围栏 儿童安全门和围栏用于在门口&#xff08;如门道&#xff09;内设置围栏&#xff0c;或用作自支撑围栏&#xff0c;将幼儿可能在其中活动的区域围起来。这些商品可能由塑料、金属、乙烯树脂或木制组件等材料制成。此政策包括但不限于可扩展围栏、伸缩安全门和…

【系统设计系列】 负载均衡和反向代理

系统设计系列初衷 System Design Primer&#xff1a; 英文文档 GitHub - donnemartin/system-design-primer: Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. 中文版&#xff1a; https://github.com/donnemart…