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