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);

         }
              
     }     
 }
 
 


     
        


 
 

 

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

入门->放弃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值