完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
关于STM32通用和复用I/O口
一,概述 STM32F10x系列具有丰富的端口可供使用包括26、37、51、80、112个多功能双向5V兼容的快速I/O口,所有I/O口可以映射到16个外部中断。每个通用的I/O(GPIO)端口有 2个32位配置寄存器(GPIOx_CRL、GPIO_CRH) 2个32位数据寄存器(GPIOx_IDR、GPIO_ODR) 1个32位置位/复位寄存器(GPIOx_BSSR) 1个16位复位寄存器(GPIOx_BRR) 1个32位锁定寄存器(GPIOx_LCKR) GPIO端口的每个位可以由软件分别配置成多种模式,如输入浮空、输入上拉、输入下拉、模拟输入、开漏输出、推挽式输出、推挽式复用功能和开漏复用功能。 1.1 通用I/O 复位期间和复位后,复用功能未开启,I/O端口被配置成浮空输入模式。复位后,JTAG引脚被置于上拉或下拉模式。
1.2 单独的位设置或位清除 当对GPIOx_ODR(数据寄存器)的个别位编程时,软件不需要禁止中断,在单次APB2写操作中,可以只更改一个或多个位。这是通过对置位/复位寄存器(GPIOx_BSSR/GPIOx_BRR)中想要更改的位写1实现的。没被选择的位将不更改。 1.3 外部中断/唤醒线 所有的端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。 1.4 复用功能 使用默认复用功能前必须对端口位配置寄存器编程。 对于复用的输入功能,端口必须配置成输入模式(浮空、上拉、下拉)且输入引脚必须由外部驱动; 对于复用的输出功能,端口必须配置成复用功能输出模式(推挽或开漏)。 对于双向复用功能,端口必须配置成复用功能输出模式(推挽或开漏)。这时,驱动器被配置成浮空输入模式。 如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的信号连接。如果软件吧一个GPIO引脚配置成复用输出功能,但是外设没有被激活,它的输入将不确定。 1.5 软件重新映射I/O复用功能 为了使不同期间封装的外设I/O功能的数量达到最优,可以把一些复用功能重新映射到其他的一些引脚上,这可以通过软件配置相应的寄存器来完成(AFIO)。这时,复用功能就不再映射到它们的原始引脚上。 1.6 GPIO锁定机制 锁定机制允许冻结I/O配置,当在一个端口位上执行了锁定(LOCK)程序,在下一次复位之前,将不能更改端口位的配置。这主要用在一些关键引脚的配置上,防止程序跑飞引起灾难性后果,如果在驱动功率模块的配置上,应用了锁定机制,以冻结I/O口配置,即使程序跑飞,也不会改变这些引脚的配置。 1.7 输入配置 当I/O端口置为输入时,I/O端口位会有如下变化 (1)输出缓冲器被禁止 (2)施密特触发器输入被激活 (3)根据输入配置(上拉、下拉、浮动)的不同弱上拉和下拉电阻被连接 (4)出现在I/O引脚上的数据在每个APB2时钟被采样到输入数据寄存器。 (5)对输入数据寄存器的访问可得到I/O状态。 1.8 输出配置 当I/O口端被配置成输出时,所有的I/O端口会有如下变化 (1)输出缓冲器被激活 ①开漏模式:输出寄存器上的0激活N-MOS,而输出寄存器上的1将端口置于高阻状态。(P-MOS从不被激活)。 ②推挽模式:输出寄存器上的0激活N-MOS,而输出寄存器上的1将激活P-MOS。 (2)施密特触发输入被激活 (3)弱上拉和下拉电阻被禁止。 (4)出现在I/O引脚上的数据在每个APB2时钟被采样到输入数据寄存器。 (5)在开漏模式时,对输入数据寄存器的访问可得到I/O状态。 (6)在推挽模式时,对输出数据寄存器的访问得到最后一次写的值。 1.9 复用功能配置 当I/O端口被配置为复用功能时,I/O端口的基本结构会有以下变化: (1)在开漏或推挽模式配置中,输出缓冲器被打开。 (2)内置外设的信号驱动输出缓冲器(复用功能输出)。 (3)施密特触发输入被激活。 (4)弱上拉和下拉电阻被禁止。 (5)在每个APB2时钟周期,出现在I/O引脚上的数据被采样到输入数据寄存器。 (6)开漏模式时,读输入数据寄存器可得到I/O口状态。 (7)在推挽模式时,读输出数据寄存器可得到最后一次写的值。 一组复用功能I/O寄存器允许用户把一些复用功能重新映射到不同的引脚。 1.10 模拟输入配置 当I/O端口被配置为模拟输入配置时,所有的I/O端口位的基本结构会有如下变化: (1)输出缓冲器被禁止。 (2)禁止施密特触发输入,实现了每个模拟I/O引脚上的零消耗。施密特触发输出值被强制为零。 (3)弱上拉和下拉电阻被禁止。 (4)读取输入数据寄存器时数值为零。 |
|
|
|
只有小组成员才能发言,加入小组>>
3309 浏览 9 评论
2988 浏览 16 评论
3490 浏览 1 评论
9050 浏览 16 评论
4085 浏览 18 评论
1171浏览 3评论
602浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
594浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2331浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1894浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-20 09:47 , Processed in 1.250615 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号