STM32按键输入(寄存器)

1.使能时钟

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

    RCC->APB2ENR|=1<<6;//使能GPIOE的时钟

2.设置GPIO输入模式

    PA0设置为输入,当ODR不设置时,默认为下拉,也可以将ODR设置位0来设置下拉输入

        GPIOA->CRL&=0xfffffff0;

         GPIOA->CRL|=0x00000008;

    PE3/4设置为输入,设置为上拉输入

        GPIOE->CRL&=0xfff00fff;

        GPIOE->CRL|=0x00088000;

       GPIOE->ODR|=3<<3;(为啥ODR左移三位就可以呢,我们可以展开来看3<<3就是0000,0000,0000,0011这个数左移3位:0000,0000,0001,1000)

思考点:

上拉,下拉的区别是啥??

    上拉则该引脚初始是一个高电平,下拉该引脚是低电平.,当我们配置了相应的模式,芯片将会按我们配置设置相应模式.

 

3.判断端口的高低电平

    uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
  uint8_t bitstatus = 0x00;
  
  /* Check the parameters */
  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  assert_param(IS_GET_GPIO_PIN(GPIO_Pin)); 
  
  if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)Bit_RESET)
  {
    bitstatus = (uint8_t)Bit_SET;
  }
  else
  {
    bitstatus = (uint8_t)Bit_RESET;
  }
  return bitstatus;
}

我们可以参考库函数的做法来判断端口的高低电平:

  if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)Bit_RESET):通过按位与的做法,来实现.例如当PE3口输入时:GPIOE->IDR&(0000,0000,0000,1000),也就是GPIOE->IDR&0x08;

 如果输入为高电平:

   if((GPIOA->IDR&0x01)!=0)//判断PA0是否为高电平

   if((GPIOE->IDR&0x08)!=0)//判断PA3

   if((GPIOE->IDR&0x10)!=0)//判断PA4

4.写一个延时函数

void delay(u32 i)

{

   while(i--);

}

 

 

程序:

#include "stm32f10x.h"
void delay(u32 i){while(i--);}

 int main(void)
     
 {    
     
     RCC->APB2ENR=1<<3;
     GPIOB->CRL&=0xff0fffff;
     GPIOB->CRL|=0x00300000;
     GPIOB->ODR|=1<<5;
     
    RCC->APB2ENR|=1<<2;//使能GPIOA的时钟

    RCC->APB2ENR|=1<<6;//使能GPIOE的时钟 
     
     
    GPIOA->CRL&=0xfffffff0;

    GPIOA->CRL|=0x00000008;
     
     
    GPIOE->CRL&=0xfff00fff;

    GPIOE->CRL|=0x00088000;
     
    GPIOE->ODR|=3<<3;
     
     while(1)
     {
     
        // if((GPIOA->IDR&0x01)!=0)//该引脚设为下拉输入,按键接高电平,所以按下按键时,电平为高
             
         if((GPIOE->IDR&0x08)==0)//判断PA3,该引脚设为上拉输入,按键接的低电平,所以按下按键时,电平为低.

        // if((GPIOE->IDR&0x10)==0)//判断PA4        
         {
                delay(1000000);
            // if((GPIOA->IDR&0x01)!=0)
     
               if((GPIOE->IDR&0x08)==0)//判断PA3
            // if((GPIOE->IDR&0x10)==0)//判断PA4        

                GPIOB->ODR=~(GPIOB->ODR);

         }
              
     }     
 }
 
 


     
        


 
 

 

 

你可能感兴趣的:(STM32)