重学STM32----(一)

前言       

       在这学习stm32半年的时间中,虽然明显的感觉到自己在进步,但是还是发现学习方法的错误。由于急功近利的性格,在学习stm32之初,我选择了最简单的办法,用库函数来写程序,而且也由于我这急功近利的性格,我也根本没有仔细看stm32芯片的资料,就照着视频却看,然后对着例程去写。刚开始这也让我学习了许多,随着时间的流逝,在知道更多关于嵌入式的知识后,我也不满足现状了,想学习liunx,这就要学习可以上系统的芯片了,发现都是没有库函数的,这就让我发现了许多以前没有发现的问题。这些偷懒的行为严重限制了以后的发展,当然不想学习更高级知识的人例外。但是我相信没有人能满足现状。学习嵌入式的,都是有野心的。

  所以现在开始重新开始学习stm32,当然不是用库函数了,而是用寄存器慢慢去写,这样我相信可以学的更多,为以后学其他高级的芯片也打下坚实的基础。。。

 

按键控制LED灯

1、led.h

#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

2、led.c

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

        }

    }
}

3、测试

测试已通过

 

 

关注公众号"小败日记",搬砖过程遇到的问题,大家一起探讨,资源共享

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值