STM32 GPIO 寄存器配置

 一.CRHCRL的使用:fficeffice" />

       CRHCRL的使用基本相同,CRH用于控制GPIOXX表示A---G)的高8位(Pin15---Pin8,CRL用于控制GPIOXX表示A---G)的低8位Pin7----Pin0)。

      二.ODR的使用:

            1.

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

                    GPIOA->CRH&=0XFFFFFFF0;//清除该位原来的设置

                    GPIOA->CRH|=0X00000003;//PA8 推挽输出           

                    GPIOA->ODR|=1<<8;      //PA8 输出高

     由以上代码看出,PA8设置成了推挽输出。大家都知道一个端口可以输出高电平,也可以输出低电平,而GPIOA->ODR|=1<<8;这个表达式就把PA8设置成了在空闲的时候输出高电平;GPIOA->ODR|=0<<8;这个表达式,把PA8设置成了在空闲的时候输出低电平。

     如果想设置PA8为推挽输出,并且希望输出为低电平,可以不要这个表达式GPIOA->ODR|=0<<8;  ,因为系统会默认端口输出为低电平 

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

                 GPIOA->CRH&=0XFF0FFFFF;      

                 GPIOA->CRH|=0X00800000; //PA13设置成上拉/下拉输入                      
                 GPIOA->ODR|=1<<13;        //PA13上拉

    由以上代码看出,PA13设置成了上拉输入,即输入高电平。大家都知道,一个端口设置成了输入模式,那么它可以输入高电平,也可以输入低电平。GPIOA->ODR|=1<<13;      这个表达式把PA13设置成了上拉模式,即表示在端口空闲的时候输入高电平;GPIOA->ODR|=0<<13;这个表达式把PA13设置成了下拉模式,即端口在空闲的时候输入低电平。

    如果想设置PA13为输入模式,并且希望输入低电平,可以不要这个表达式GPIOA->ODR|=0<<13;   ,因为系统会默认端口输入为低电平。

    三.IDR的使用:               

IDR是一个端口输入数据寄存器,只用了低16位。该寄存器为只读寄存器,并且只能以16位的形式读出。读出的值为对应IO口的状态。

===========================================================华丽分割线==============================================================

端口低配置寄存器寄存器的复位值为0X4444 4444,,复位值其实就是配置端口为浮空输

 入模式。STM32的CRL控制着每个IO端口(A~G)的低8位的模式。每

 个IO端口的位占用CRL的4个位,高两位为CNF,低两位为MODE。这里我们可以记住几个

 常用的配置,比如0X4表示模拟输入模式(ADC用)、0X3表示推挽输出模式(做输出口用,

 50M速率)、0X8表示上/下拉输入模式(做输入口用)、0XB表示复用输出(使用IO口的第二

 功能,50M速率)。

 CRH的作用和CRL完全一样,只是CRL控制的是低8位输出口,而CRH控制的是高8

 位输出口。这里我们对CRH就不做详细介绍了。

 给个实例,比如我们要设置PORTC的11位为上拉输入,12位为推挽输出。代码如下:

GPIOA->CRH&=0XFFFFFFF0; 

  GPIOA->CRH|=0X00000003;//PA8 推挽输出    

        GPIOA->ODR|=1<<8;     
 //PA8 输出高

再如:

 GPIOC->CRH&=0XFFF00FFF;//清掉这2个位原来的设置,同时也不影响其他位的设置

 GPIOC->CRH|=0X00038000; //PC11输入,PC12输出

 GPIOC->ODR=1<<11;//PC11上拉

 通过这3句话的配置,我们就设置了PC11为上拉输入,PC12为推挽输出

你可能感兴趣的:(STM32)