目录
框图很重要
STM32单片机是通过寄存器,来操作I/O口的。这篇来讲一下,如何操作STM32F103C8的I/O口:
先看一个来自Datasheet中的Block Diagram。
这个图很重要,我们拿到任何一款芯片,都需要先仔细阅读这个框图的内容。
框图中显示,GPIO是作为外设,挂在APB2这个总线上的。
APB2和AHB2之间是桥接关系,这里先不需要懂,知道即可。
可能有人会有疑问:这些I/O口都在单片机内部,为什么叫“外设”?
这里有必要解释一下:我的理解是,外设的“外”,只是相对单片机的CPU而言的。就像MCU内部还有其它模块,比如:SPI,I2C,这些模块同样也被称作外设。它们都是通过总线,连接到单片机CPU的。
知道了GPIOC是连接到APB2总线的,接下来就去操作APB2相关的寄存器。
I/O口寄存器操作,分三步:
1,打开时钟
在Reference Manual中找到APB2外设时钟使能寄存器
图3可以看到,这是一个 32位的寄存器。
其中Bit4叫做IOPCEN,该位为可读可写。
该Bit详细定义如下:
IO口C时钟使能,可通过软件置位或清零。写“0”表示Port口C时钟禁止,写“1”表示Port口C时钟使能。所以说,每个Port口16个位,它们的时钟都是统一开关的。
程序代码里需要做的就是:
将RCC_APB2ENR这个寄存器赋值为0x00000010
(32位2进制数0B00000000000000000000000000010000转换为16进制就是0x00000010)
这样说更加容易理解,实际操作中为了方便,略有不同。
2,配置输入/输出模式
看一下图5,图6两个端口配置寄存器,它们都是32位的寄存器。
其中第一个寄存器GPIOx_CRL,用来控制低8位IO口的输入输出模式,第二个寄存器GPIOx_CRH,则用来控制高8位IO口的输入输出模式。
我们需要知道的是,这款单片机的IO口是16位的,即Port0~Port15。这里低8位和高8位分别由这两个寄存器来控制。
举例说明:
假如我需要将PA1口设置为通用开漏极输出,速度2MHz。那我们就需要用到GPIOA_CRL这个寄存器,将GPIOA_CRL的Bit7-4设置为0110;
假如我需要将PB15口设置为浮空输入。那我们就需要将GPIOB_CRH的Bit31-28设置为0100。
3,设置高/低电平
前面我们介绍了将端口配置为输入或输出模式。如果是输出模式,那我们需要再明确到底是要让端口输出高,还是输出低。如果是输入模式,我们希望能知道输入的是高还是低。
这就需要用到图7,图8所示的端口输入/输出数据寄存器。
需要注意的是:端口输入数据寄存器为只读模式,不能写。而端口输出数据寄存器,既能读,又能写。
图9红框内为输入/输出数据寄存器的示意图
I/O口直接与PCBA上的外围电路相连接,涉及到一些硬件相关的知识,后续我会单独用一篇来讲。这里姑且先挖个坑。