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

  • 相关阅读:
    LeetCode 32.使数组唯一的最小增量
    LeetCode 31. 最小的k个数 快速排序+堆排序+二叉搜索树
    LeetCode 30. 最长回文串
    LeetCode 29. 矩形重叠 反向思维
    LeetCode 28. 拼写单词 HashMap赋值给另一个HashMap
    LeetCode 27. 字符串压缩
    Java SSM Spring+Spring MVC+Mybatis整合
    LeetCode 26.岛屿的最大面积 DFS深度遍历问题
    LeetCode 25.最长上升子序列 动态规划
    LeetCode 24.找出数组中出现次数大于二分之一数组长度的数
  • 原文地址:https://www.cnblogs.com/qigaohua/p/5299674.html
Copyright © 2011-2022 走看看