文章目录RM中的GPIO configurations for device peripheralsRM中GPIO相关寄存器GPIO-LEDGPIO-蜂鸣器接上回RM中的GPIO configurations for device peripherals课程中老师过了一下RM(reference manual)中的相关内容这一章节是一带而过。所以具体看了一下内容。这个章节是引脚复用配置速查表。总体而言要表达的是当引脚不是当普通GPIO用而是要交给芯片内部某个外设模块如USART、SPI、TIM等控制时你应该把GPIO配置成什么模式。为什么会有这个表格和什么时候需要这个表格呢STM32芯片内部有很多外设模块USART、SPI、I2C、TIM、ADC、CAN 等这些模块需要跟外界交换信号。但它们没有自己独立的引脚而是复用 GPIO 的物理引脚。比如同一个PA0引脚它可以作为普通GPIO写ODR会输出高低电平可以复用位USART2_CTSTIM2_CH1ADC1_IN0WKUP等。当引脚被复用后注意不是“GPIO被复用”。。。控制这个引脚的就是外设模块GPIO 模块只负责配置电气特性推挽/开漏、速度、上下拉不再负责输出数据。这些表格告诉的是对于每种外设功能GPIO的3个关键配置模式、类型、速度应该配置成什么。所以当把引脚复用位为其他外设时GPIO还得“管”。GPIO配置决定了引脚的电气特性而外设模块决定了引脚上跑什么数据。当引脚被复用时电路中的多路选择器会把引脚控制权从GPIO模块切换到外设模块。至于这个引脚可以复用哪些外设这是电路已经连接好的。引脚具体被哪些外设复用可以在datasheet里找(而不是RM)。在datasheet中的“Pinouts and pin description”章节里面有个table5:Medium-density STM32F103xx pin definitions。课程用的时STM32F103C8T6时LQFP 48 pin-out比如把PA1可以被复用为USART2_RTS根据RM中的配置建议把PA1配置成alternative function push-pull。当然正常情况下PA0,PA2,PA3都要配置到相应模式。然后配置好USART2的相应时钟使能这个外设。然后PA0~PA3就被用来作为USART2。但是需要注意的是PA0,PA1等不仅仅是可以被USART2来复用也可以是TIM2或者ADC2。把一个pin脚同时配置成两个外设的引脚显然是会冲突的。所以就要保证使用的时候只有其中一个外设是被使用的不然就会信号冲突引脚输出电平异常。RM中GPIO相关寄存器每个port的模式都需要4个bits来配置16个ports就需要64 bits。所以配置一个GPIOx需要2个32位的寄存器。关于GPIO输出速度可以配置用来限制GPIO引脚翻转的最大速度。主要是考虑低功耗和稳定性的时候会配置没有要求时配置成最大的50MHz。当引脚为配置为输入模式的时候这个值是没有用的可以任意配。BSRR和BRRBSRR高16位用来清除低16位用来设置BRR: 高16位reserve低16位用来清除为什么要有两个什么时候用哪个当要顺序操作对某些位的设置和清除的时候用BSRR设置用BRR清除这样操作的都是低16位如果对时序有要求必须同时设置和清除就用BSRR.对于第一种方式STM32给的库函数里就有使用如下是GPIO_init()中配置低地址pin的一段212行用了BRR219行用了BSRR。可以发现它们的等号右边都一样都只是操作低16位复习一下两种输入模式在配置位上拉输入的时候引脚默认是高电平所以写入BSRR的低16位是set相应pin脚的ODR寄存器把电平拉高。在配置为下拉输入的时候引脚默认是低电平所以写入BRR的低16位是reset相应pin脚的ODR寄存器把电平拉低。当然还是可以用写入BSRR的16~31位去做reset但是这样212和219行的右边就“不统一”还需要额外hardcode一个offset有点“难看”。附可以发现BSRR的高16bits和BRR的低16bits都是用来“清除”的那我们往BSRR的高16bits写1或者0的时候BRR的低16bits会跟着修改么应该来说并不会。这是两个物理独立的寄存器。而且对于这两个寄存器的读取是没有意义的因为在RM中可以看到它们的所有bits都是“w只可写不可读。如果要读取某个pin的状态还是要从它的ODR寄存器上读取GPIO-LED根据发光二极管原理正向通电LED亮反向通电不亮上图方案ASTM32引脚拉低LED亮拉高LED灭 - 灌电流电流从外部流向芯片下图方案BSTM32引脚拉高LED亮拉高LED亮 - 拉电流电流从芯片流向外部两种驱动方式如何选择这就要看这个IO口的高低电平驱动能力。GPIO在推挽模式的时候高低电平都有较强的驱动能力。在当前的实验中两种方法均可。但是在单片机的电路里一般倾向使用方案A。规则高电平弱驱动低电平强驱动。这么做的原因是芯片输出低电平时吸收电流的能力通常比输出高电平时提供电流的能力更强、更稳定。GPIO-蜂鸣器用了三极管开关的驱动方案。课程中老师提到“对于功率大一点的直接用IO口驱动会导致STM32负担过重这时就可以用一个三极管驱动电路来完成驱动任务”。这里了解了一下原因如果外部设备功率很大在给定电压下需要的电流就很大那么通过引脚的电流拉点流或者灌电流就会很大引脚就会被击穿。引脚可以容忍多少电流呢这个范围可以在datasheet里面找到具体就是在5.3.5 Supply Current Characteristic里面有一个table 7可以发现单个引脚的拉点流和灌电流最大值都是25mA而且表格里也说明了所有 I/O 引脚通过 VDD 流入的总电流 MCU 本身运行电流不能超过 IVDD 的绝对最大值150mA所有 I/O 引脚通过 VSS 流出的总电流 MCU 本身消耗电流不能超过 IVSS 的绝对最大值150mA同时在5.3.13 IO port characteristic 中提到GPIO引脚设计的初衷是发信号而不是供功率。要“花小力气干大事情”可以靠三极管来完成。引脚只需控制三极管的基极就能控制三极管的断开和导通从而控制外部设备的打开和关闭。之前的设计中外部设备的供电来源是STM32内部的驱动电路而用三极管的设计中外部设备的供电来源是外部VCC电源。