×
单片机 > 单片机程序设计 > 详情

STM32 IO 口操作

发布时间:2020-06-03 发布时间:
|
STM32 IO 口操作STM32 的0x2000_0000 到 0x200F_FFFF 单元的SRAM 被定义成 Bit Band Region,共1MB字节,与之相对应的是 0x2200_0000 到 0x23FF_FFFF单元32MB。

 

(一) 开启时钟

在初始化IO的时候,首先要初始化IO的时钟。

APB1ENR 

APB2ENR

两个从字面上看都是 Advanced Periphery Bus Enable,不同之处一个是1 ,一个是2。区别在哪里?IO初始化的应该根据需要开启哪个时钟总线?

APB1外设时钟使能寄存器(RCC_APB1ENR) 低速APB使能,最大允许频率36MHz

APB2外设时钟使能寄存器(RCC_APB2ENR) 高速APB使能,最大允许频率72MHz

首先搞清楚这里的外设是相对Cortex M3的内核来讲的。这两个寄存器都是32的,占用四个字节。

APB1外设时钟使能寄存器 的可用位为20位,这些都是R/W,对应的“外设”时钟有:(1)DAC接口时钟使能 ,(2)电源接口时钟使能,(3)备份接口时钟使能,(4、5)Can 2和Can1 接口时钟使能,(6、7)IIC2和IIC1接口时钟使能,(8、9、10、11)USART 5、USART4、USART3、USART2接口时钟使能,(12、13)SPI3和SPI2接口时钟使能,(14) 窗口看门狗时钟使能,(15-20) 定时器2-7时钟使能,可以看得出,一个位对应一个“外设”,0关闭,1打开。

 

APB2外设时钟使能寄存器,在跑马灯程序的IO_Configration函数初始化的第一个寄存器就是它。说明一下,这两个寄存器都位于结构体RCC_TypeDef中,名字叫APB1ENR和APB2ENR。操作的时候就是 RCC->APB1ENR=xxxxxxxx,这里是举个例子。同样这个寄存器和上面的1不一样,它只有11个bit有效,其余的bit保留(保留位读为0),开放出来的bit都是R/W(可读可写的)。这些外设都是:(1)USART1接口时钟使能,

(2)SPI1接口时钟使能 (3)定时器1时钟使能,(4、5)ADC2 和ADC1接口时钟使能,(6-10)端口A-E时钟使能,(11)辅助功能IO时钟使能。可以看得出,也是一个位对应一个外设,1打开,0关掉。

 

 

来看这段代码 

RCC->APB2ENR|=1<<2; //使能PORTA时钟 

RCC->APB2ENR|=1<<5; //使能PORTD时钟 

上面这两个操作就是打开端口A的端口D的时钟。更为简洁的写法:

RCC->APB2ENR|=0x00000014;//访问:字,半字和字节访问 

//这里采用字访问

 

或者

RCC->APB2ENR|=(U32)0x14;//访问:字,半字和字节访问 

//这里采用字访问

 

 

 

(二) 设置输入输出模式

CRH-x  control register high 端口配置高寄存器

CRL -x  control register low  端口配置低寄存器

//STM32 每个端口有16个口线,GPIOA,GPIOB,GPIOC,GPIOD,GPIOE, //GPIOF,GPIOG. 目前IO口的数目最多的A-G ,总共112个。

后面的X表示属于那一个端口,每个端口对应一个控制寄存器。GPIOA->CRH=0xxxxxxxx;

就可以实现对A端口CRH的操作。

CRL-x和CRH-x都是32位的寄存器,每一位都是RW。必须以字(32位)的方式操作这些外设寄存器。其中四位控制一个端口的输入输出模式,比如说速率是 50M,2M,还是20M,输出是OD,还是PP,输入是FLOATING还是IPU。这个设置在库函数中的体现就是GPIO_InitStructure.GPIO_Mode和GPIO_InitStructure.GPIO_Speed的参数配置。

(三) 读写端口数据

端口输出数据寄存器(GPIOx_ODR) (x=A..E),要写数据到端口就给这个寄存器赋值。32位寄存器,高16位保留。低16位对应IO。

端口输入数据寄存器(GPIOx_IDR) (x=A..E),要读取端口上的状态,就读取这个寄存器的值。32位寄存器,高16位保留,低16位对应IO。

(四) 还有三个寄存器

GPIOx_BSRR gpio bit set or reset register 端口位设置清除寄存器 

这是一个32位寄存器,位写1有效,写0无影响,高16位写清除对应的位,即对应位输出0;低16位写1置位对应位,对应位输出1。该寄存器只能写,不能读,并且只支持字操作。

 

GPIOx_BRR gpio bit reset register 端口位清除寄存器 

少了个S,对比上面的功能上了少了置位功能,其它相同。

GPIOx_LCKR gpio lock register 端口位配置锁定寄存器

这个暂时估计不用,就不说了。



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会