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.hqwc.cn/news/100835.html

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

相关文章

最新Win10离线安装.NET Framework 3.5的方法(附离线包2022/3/22)

win10系统安装软件时&#xff0c;可能需要.net framework3.5的运行环境&#xff0c;当我们安装某些软件的时候会提示“你的电脑上的应用需要使用以下Windows功能:.NET Framework 3.5(包括.NET 2.0和3.0)。如果系统默认的是4.0以上的版本&#xff0c;当软件需要.net framework3.…

记录Echarts双Y轴左右刻度不一致问题

根据项目需要,echarts实现双Y轴图表。因为两边数据不同&#xff0c;所以会出现左右Y轴刻度不一致。 增长率暂时是0&#xff0c;在X轴上&#xff0c;懒得改了。 修改之前: 修改之后: 根据数据找出最大值&#xff0c;分为6份向上取整&#xff0c;得到的每份就是间隔。 // dataAr…

摘要-签名-PKI-访问控制-DOS-欺骗技术

摘要-签名-PKI-访问控制-DOS-欺骗技术 信息摘要数字签名PKI访问控制抗攻击技术欺骗技术ARP欺骗DNS欺骗IP欺骗 信息摘要 信息摘要通过哈希函数生成的 信息摘要保证数据的完整性 MD5 和 SHA-1 数字签名 唯一确定发送方 基于非对称加密技术&#xff08;公钥和私钥技术&#xff09;…

鸿鹄工程项目管理系统 Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统

工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&am…

LLVM 与代码混淆技术

项目源码 什么是 LLVM LLVM 计划启动于2000年&#xff0c;开始由美国 UIUC 大学的 Chris Lattner 博士主持开展&#xff0c;后来 Apple 也加入其中。最初的目的是开发一套提供中间代码和编译基础设施的虚拟系统。 LLVM 命名最早源自于底层虚拟机&#xff08;Low Level Virtu…

中国行政区域带坐标经纬度sql文件及地点获取经纬度方法

文章目录 前言一、如何获取某地的经纬度&#xff1f;1.1 搜索百度地图1.2 在下方找到地图开放平台1.3 下滑找到坐标拾取器1.4 使用 二、sql文件2.1 创建表2.2 插入数据 前言 当工作业务上需要涉及地图&#xff0c;给前端返回经纬度等场景&#xff0c;需要掌握区域经纬度的获取…

第5章 驱动模块传参实验(iTOP-RK3568开发板驱动开发指南 )

经过前两章实验的实战操作&#xff0c;我们已经完成最简单的helloworld驱动实验和模块驱动实验&#xff0c;加载模块可以使用“insmod”函数&#xff0c;使用“insmod”函数进行模块加载时也能进行参数的传递。运用得当可以极大提升内核测试速度。本节就来学习一下如何进行驱动…

【已解决】pycharm 突然每次点击都开新页面,关不掉怎么办?

今天在 pycharm 中写代码&#xff0c;突然发现&#xff0c;新开的文件不再原来的页面上&#xff0c;而是新增了页面&#xff0c;导致整个屏幕全都是新开的页面&#xff0c;最难受的是&#xff0c;关不掉&#xff01; 无奈&#xff0c;我只能关闭 pycharm&#xff0c;重新双击…

力扣373. 查找和最小的 K 对数字 优先队列法

题目 给定两个以 非递减顺序排列 的整数数组 nums1 和 nums2 , 以及一个整数 k 。 定义一对值 (u,v)&#xff0c;其中第一个元素来自 nums1&#xff0c;第二个元素来自 nums2 。 请找到和最小的 k 个数对 (u1,v1), (u2,v2) … (uk,vk) 。 示例 1: 输入: nums1 [1,7,11], …

stm32 学习笔记:GPIO输出

一、GPIO简介 引脚电平 0-3.3V,部分可容忍5V&#xff0c;对输出而言最大只能输出3.3V, 只要可以用高低电平来控制的地方&#xff0c;都可以用GPIO来完成&#xff0c;如果控制的功率比较大的设备&#xff0c;只需加入驱动电路即可 GPIO 通用输入输出口&#xff0c;可配置为 8种 …

PyCharm 虚拟环境搭建

Anaconda搭建虚拟环境 安装 前往Anaconda官网&#xff08;https://www.anaconda.com/products/individual&#xff09;&#xff0c;下载适合您操作系统的Anaconda版本&#xff0c;建议下载最新的稳定版。这里可以直接进入这个&#xff1a;https://repo.anaconda.com/archive/ …

M1 Pro 新芯片安装python2 方案汇总

前言&#xff1a;磨刀不误砍柴工&#xff0c;环境装好&#xff0c;才能打工。M1 Pro 新芯片安装python2 文章目录 方案一 docker 容器构造环境&#xff08;如果涉及本地两个仓库需要关联则不适用&#xff09;方案二 使用 pyenv &#x1f680; 作者简介&#xff1a;作为某云服务…