重学STM32----(一)

  在这学习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 ;
}
}
}

原文地址:https://www.cnblogs.com/qigaohua/p/5299674.html