STM32
直播中

王静

7年用户 684经验值
私信 关注
[问答]

请问一下STM32按键是如何控制LED灯的

请问一下STM32按键是如何控制LED灯的?

回帖(1)

姚秋月

2021-10-14 15:08:09
  在这学习stm32半年的时间中,虽然明显的感觉到自己在进步,但是还是发现学习方法的错误。由于急功近利的性格,在学习stm32之初,我选择了最简单的办法,用库函数来写程序,而且也由于我这急功近利的性格,我也根本没有仔细看stm32芯片的资料,就照着视频却看,然后对着例程去写。刚开始这也让我学习了许多,随着时间的流逝,在知道更多关于嵌入式的知识后,我也不满足现状了,想学习liunx,这就要学习可以上系统的芯片了,发现都是没有库函数的,这就让我发现了许多以前没有发现的问题。这些偷懒的行为严重限制了以后的发展,当然不想学习更高级知识的人例外。但是我相信没有人能满足现状。学习嵌入式的,都是有野心的。
  所以现在开始重新开始学习stm32,当然不是用库函数了,而是用寄存器慢慢去写,这样我相信可以学的更多,为以后学其他高级的芯片也打下坚实的基础。。。
  按键控制LED灯
  #ifndef __LED_H
  #define __LED_H
  typedef unsigned char u8;
  typedef unsigned short u16;
  typedef unsigned int u32;
  #define KEY0 1
  #define KEY1 2
  #define WK_UP 3
  #define MYGPIOA_BASE ((volatile unsigned int*) 0x40010800)
  #define MYGPIOB_BASE ((volatile unsigned int*) 0x40010C00) //GPIOB基地址
  #define MYGPIOE_BASE ((volatile unsigned int*) 0x40011800) //GPIOE基地址
  #define MYRCC_BASE ((volatile unsigned int*) 0x40021000) //RCC基地址
  typedef struct
  {
  volatile unsigned int CRL;
  volatile unsigned int CRH;
  volatile unsigned int IDR;
  volatile unsigned int ODR;
  volatile unsigned int BSRR;
  volatile unsigned int BRR;
  volatile unsigned int LCKR;
  }GPIO_TYPE;
  typedef struct
  {
  volatile unsigned int CR;
  volatile unsigned int CFGR;
  volatile unsigned int GIR;
  volatile unsigned int APB2RSTR;
  volatile unsigned int APB1RSTR;
  volatile unsigned int AHNENR;
  volatile unsigned int APB2ENR;
  volatile unsigned int APB1ENR;
  volatile unsigned int BDCR;
  volatile unsigned int CSR;
  volatile unsigned int AHBRSTR;
  volatile unsigned int CFGR2;
  }RCC_TYPE;
  #define MYRCC ((RCC_TYPE*)MYRCC_BASE)
  #define MYGPIOA ((GPIO_TYPE*)MYGPIOA_BASE)
  #define MYGPIOB ((GPIO_TYPE*)MYGPIOB_BASE)
  #define MYGPIOE ((GPIO_TYPE*)MYGPIOE_BASE)
  void LED_Init(void);//初始化
  void KEY_Init(void);
  u8 KEY_Scan(void);
  #endif
  #include “led.h”
  void KEY_Init()
  {
  MYRCC-》APB2ENR |= (1《《2)|(1《《6);
  MYGPIOA-》CRL &= 0xfffffff0;
  MYGPIOA-》CRL |= 0x00000008; //默认下拉
  MYGPIOE-》CRL &= 0xfff00fff;
  MYGPIOE-》CRL |= 0x00088000;
  MYGPIOE-》ODR |= (1《《3)|(1《《4); //必须要设置成上拉,否则按键不灵敏,时灵时不灵
  }
  //
  u8 KEY_Scan()
  {
  u8 key;
  u16 GPIOA_DATA;
  u16 GPIOE_DATA;
  GPIOA_DATA = MYGPIOA-》IDR ;
  GPIOE_DATA = MYGPIOE-》IDR ;
  if((GPIOA_DATA &0x0001)||(!(GPIOE_DATA & 0x0010))||!(GPIOE_DATA & 0x0008))
  {
  if (GPIOA_DATA &0x0001) key = WK_UP ;
  if (!(GPIOE_DATA & 0x0010)) key = KEY0 ;
  if (!(GPIOE_DATA & 0x0008)) key = KEY1 ;
  }
  else key = 0;
  return key;
  }
  //
  void LED_Init()
  {
  MYRCC-》APB2ENR &= ~(1《《3)&~(1《《6);
  MYRCC-》APB2ENR |= (1《《3)|(1《《6);
  MYGPIOB-》CRL &= 0xff0fffff;
  MYGPIOB-》CRL |= 0x00300000;
  MYGPIOE-》CRL &= 0xff0fffff;
  MYGPIOE-》CRL |= 0x00300000;
  MYGPIOB-》ODR |= 1《《5;
  MYGPIOE-》ODR |= 1《《5;
  }
  int main(void)
  {
  u8 key;
  LED_Init();
  KEY_Init();
  while(1)
  {
  key = KEY_Scan();
  switch (key)
  {
  case KEY0:
  MYGPIOB-》ODR &= ~(1《《5);
  break ;
  case KEY1:
  MYGPIOE-》ODR &= ~(1《《5);
  break ;
  case WK_UP :
  MYGPIOB-》ODR |= (1《《5);
  MYGPIOE-》ODR |= (1《《5);
  break ;
  }
  }
  }
举报

更多回帖

发帖
×
20
完善资料,
赚取积分