STM32的IO端口有八种模式:
1、输入浮空 5、开漏输出
2、输入上拉 6、推挽输出
3、输入下拉 7、推挽复用
4、模拟输入 8、开漏复用
每个IO口都有七个寄存器来控制:
CHL、CHR :端口配置寄存器(32位)
IDR、ODR :数据寄存器(32位)
BSRR :置位/复位寄存器(32位)
BRR :复位寄存器(16位)
LCKR :所存寄存器(32位)
其中,比较常用的IO端口寄存器为CRL,CRH,IDR,ODR
低配置寄存器CRL:
该寄存器复位值为0x4444 4444。即复位后IO口默认为浮空输入模式。STM32的CRL寄存器控制着每组IO端口的低8位。每4个位(2位MODE,2位CNF)即控制对应IO端口的输入输出模式和端口速度的配置。常用的配置有:0X0(模拟输入,ADC使用),0X3(推挽输出,50M速率),0X8(上下拉输入),0XB(复用输出,50M速率)。
CRH与CRL功能相同,CRH控制高八位(8-15),CRL控制低八位(0-7)。
例:想要设置PTC11为上拉输入,PTC12为推挽输出:
GPIOC->CRH &= 0XFFF0 0FFF; //清除该两位设置而不影响其他位
GPIOC->CRH |= 0X0003 8000; //C11输入,C12输出
GPIOC->ODR = 1<<11;//C11上拉
IDR是端口输入数据寄存器,只用了低16位,该寄存器是只读寄存器,并且只能以16位形式读出。
要想知道某个IO口的状态时,只需读该寄存器,看某位的状态即可。
ODR为端口输出数据寄存器,只用了低16位,可读写,读出来的状态可作为IO口输出状态的判断,写数据则改变对应IO端口的电平状态。
完整IO口初始化示例:
void LED_Init(void){
RCC->APB2ENR |= 1<<2; //使能PTA时钟
RCC->APB2ENR |= 1<<5; //使能PTD时钟
GPIOA->CRH&=0XFFFF FFF0; //清空PA8设置
GPIOA->CRH|=0X0000 0003; //设置PA8推挽输出
GPIOA->ODR|=1<<8; //PA8输出高
GPIOD->CRL&=0XFFFF F0FF;//清空PD2设置
GPIOD->CRL|=0X0000 0300;//设置PD2推挽输出
GPIOD->ODR|=1<<2;//PD2输出高
}
需注意,任何外设在初始化之前,都需要配置其时钟。在上例中,APB2ENR为APB2总线上的外设时钟使能寄存器。
由上图所示,GPIOA和GPIOD的端口时钟分别在第二位和第五位,这两位置一即可使能这两个端口的时钟
关键字:STM32 IO 寄存器操作『本文转载自网络,版权归原作者所有,如有侵权请联系删除』