zoukankan      html  css  js  c++  java
  • 重学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 ;
    }
    }
    }

  • 相关阅读:
    Java实现 LeetCode 382 链表随机节点
    Java实现 LeetCode 382 链表随机节点
    Java实现 LeetCode 381 O(1) 时间插入、删除和获取随机元素
    Java实现 LeetCode 381 O(1) 时间插入、删除和获取随机元素
    Java实现 LeetCode 381 O(1) 时间插入、删除和获取随机元素
    Java实现 LeetCode 380 常数时间插入、删除和获取随机元素
    Java实现 LeetCode 380 常数时间插入、删除和获取随机元素
    Linux下的iwpriv(iwlist、iwconfig)的简单应用
    OCX控件的注册卸载,以及判断是否注册
    .OCX、.dll文件注册命令Regsvr32的使用
  • 原文地址:https://www.cnblogs.com/qigaohua/p/5299674.html
Copyright © 2011-2022 走看看