对于STM32F1的IO可以配置成8种模式,三种最大输出速度。也就是每组IO口有7个寄存器,也就是说7个寄存器可以控制一组16个IO口。
这个7个寄存器分别是:
位配置寄存器,主要是:模式的选择以及输出速度的选择。
GPIOx_CRL
GPIOx_CRH
数据寄存器,主要是:一个是输入数据寄存器。一个是输出数据寄存器。
GPIOx_IDR
GPIOx_ODR
一个32位置位/复位数据寄存器
GPIOx_BSRR
一个16位复位寄存器
GPIOx_BRR
一个32位锁存器
GPIOx_LCKR
假设:PB5和PE5和外部的LED相连。通过配置相应的寄存器来驱动LED灯。
寄存器版本步骤是三部:
第一步:使能IO端口时钟。
在配置 STM32 外设的时候,任何时候都要先使能该外设的时钟。 GPIO 是挂载在 APB2 总线上的外设,相应的寄存器是:APB2 外设时钟使能寄存器(RCC_APB2ENR)
GPIOB与GPIOE是在寄存器:RCC_APB2ENR的第三位和第六位。我们只需要把相应的位设置为1即可。
通过查找相应的寄存器使能GPIOB。
RCC->APB2ENR |= 1<<3 ; //一般情况下我们不直接赋值,主要是为了保持其他位不变。
同样我们可以使能GPIOE:RCC->APB2ENR |= 1<<6;
第二步:初始化IO口模式
在使能了相应的端口以后,我们需需要设置相应的IO口模式。配置模式有2个32位的寄存器CRL和CRH。GPIOB与GPIOE都是低八位,因此只需要我们配置寄存器CRL。
每个IO口需要配置4位,低两位输出模式选择,高两位是配置模式。
选择模式:输出模式,最大速度50MHZ。复用推挽输出。
程序可以写成:
在我们设置相应的位之前,我们先把要设置的位清零。(利用和1相与不变,和0相与清零)
GPIOB->CRL &=0xFF0FFFFF;
然后选择模式:
GPIOB->CRL |=0x00300000; //PB5的工作模式
初始化我们设置输出为1,通过寄存器ODR设置。
GPIOB->ODR |= 1<<5;
同样可以设置GPIOE的模式以及PE5的状态。
GPIOE->CRL &=0xFF0FFFFF;
GPIOE->CRL |= 0x00300000; //PE5的工作模式
GPIOE->ODR |= 1<<5;
第三步骤:操作IO口
操作寄存器ODR或者寄存器BRR/BSRR.
通过配置PB5和PE5相应输出寄存器ODR的位置位或者清零。
GPIOE->ODR |= 1<<5;
调用延时函数delay;
GPIOB->ODR &= ~(1<<5);
或者配置寄存器BRR/BSRR.
通过BSRR的低16位置1,
GPIOB->BSRR |= 1<<5;
调用延时函数delay;
通过BSRR的低16位置0,
GPIOB->BRR |= 1<<5;
【补充C语言操作符号】
把CRL寄存器所有位清零: GPIOB->CRL &= 0x0;
把CRL寄存器所有位置1: GPIOB->CRL |= 0xFFFFFFFF
把CRL寄存器的第1位置1:GPIOB->CRL |= 1<<1;
把CRL寄存器的第1位清零:GPIOB->CRL &= ~(1<<1) ;
把CRL寄存器的第0-3位设置成A,其他保持不变: GPIOB->CRL |= 0x0000000A;(为了举例,没有实际意义)