重学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 ;
}
}
}
重学STM32----(一)的更多相关文章
- 重学hadoop技术
最近因为做了些和hadoop相关的项目(虽然主要是运维),但是这段经历让我对hadoop的实际运用有了更加深入的理解. 相比以前自学hadoop,因为没有实战场景以及良好的大数据学习氛围,现在回顾下的 ...
- Java集合类简单总结(重学)
java集合类简介(重学) 一.Collection(集合).Map接口两者应该是平行关系吧. 1.Map介绍 Map是以键值(key-value)对来存放的,2个值.通过key来找到value(例: ...
- 重学OpenGL(一)----工具篇
最近想开发一个小工具,需要用到3D,果断上OpenGL,借这个过程把OpenGL重学一遍. 工欲善其事,必先利其器,先把工具都搞好. [开发语言] 果断C+OpenGL,不解释. [开发环境] Min ...
- 重学C++ (1)
写在开头的话:这学期没有写太多的代码,终于把中英文两篇论文弄完了,趁着中间的空隙,想想找工作的处境.自己也定了自己的方向.不管学什么语言吧,每个语言都有自己的优势和使用的群体.只要自己是良马,终会有伯 ...
- 推翻自己和过往,重学自定义View
http://blog.csdn.net/lfdfhl/article/details/51671038 深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 A ...
- 重学C语言---01概述
1.什么是C语言 C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点.计算机语言是从第二次世界大战以后,经历了戏剧性的发展过程.从机器语言到汇编语言和高级语言.C语言是与硬件 ...
- 【重学计算机】操作系统D3章:存储管理
1. 存储管理的基本概念 逻辑地址:用户地址,从零开始编号 一维逻辑地址:(地址) 二维逻辑地址:(段号: 段内地址) 主存储器的复用方式 按分区:主存划分为多个固定/可变分区,一个程序占一个分区 按 ...
- 【重学计算机】操作系统D1章:计算机操作系统概述
1. 计算机软硬件系统 冯诺伊曼结构 以运算单元为核心,控制流由指令流产生 程序和数据存储在主存中 主存是按地址访问,线性编址 指令由操作码和地址码组成 数据以二进制编码 其他:参考<重学计算机 ...
- 重学前端 --- Promise里的代码为什么比setTimeout先执行?
首先通过一段代码进入讨论的主题 var r = new Promise(function(resolve, reject){ console.log("a"); resolve() ...
- 重学Java(一):与《Java编程思想》的不解之缘
说起来非常惭愧,我在 2008 年的时候就接触了 Java,但一直到现在(2018 年 10 月 10 日),基础知识依然非常薄弱.用一句话自嘲就是:十年 IT 老兵,Java 菜鸡一枚. 于是,我想 ...
随机推荐
- override和overload的区别
override(重写,覆盖) 1.方法名.参数.返回值相同. 2.子类方法不能缩小父类方法的访问权限. 3.子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常). 4.存在于父类和子类之 ...
- Div CSS absolute与relative的区别小结
absolute:绝对定位,CSS 写法“ position: absolute; ”,它的定位分两种情况,如下: 1. 没有设定 Top.Right.Bottom.Left 的情况,默认依据父级的“ ...
- css改变图片的颜色
参考大神张鑫旭:http://www.zhangxinxu.com/wordpress/2016/06/png-icon-change-color-by-css/ 主要知识点:border-right ...
- 在vim中执行外部命令
11.7.5 在Vim编辑器中执行Shell命令 有时需要在Vim编辑器中执行Shell命令,例如需要验证一个Shell命令是否正确,以便写入脚本中:需要在文件中引用某个Shell命令的输入等.本小 ...
- 从客户端中检测到有潜在危险的Request.Form值的解决方法
描述:从客户端中检测到有潜在危险的Request.Form值的解决方法asp.net 2.0 通常解决办法将.aspx文件中的page项添加ValidateRequest="false&qu ...
- 3D MAX在立方体的使用
3D MAX不会“复用”立方体的顶点-----它直接计算该立方体需要12个三角面,每个三角面需要3个顶点,这样一共是36个顶点-----其实有大量顶点的位置是相同的,但3D MAX不管这些.它认为 ...
- iframe子页面与父页面通信
同域下父子页面的通信 父页面: <!DOCTYPE html> <html> <head lang="en"> <meta charset ...
- 佳佳的魔杖 (vijos 1283)
题目大意: 一根树枝有N段,每一段有一个分数,可以选取一些不完全包含(可以相交)的区间,每次选取可以得到区间里所有数之和的分数. 求最大得分. 解题过程: 1.很明显的dp,默认选取区间的顺序是从左往 ...
- 二模 (5) day2
第一题: 有 N 个人顺时针围在一圆桌上开会,他们对身高很敏感. 因此决定想使得任意相邻的两人的身高差距最大值最小. 如果答案不唯一,输出字典序最小的排列,指的是身高的排列.N<=50 解题过程 ...
- matlab函数调用及数据传递
http://www.cnblogs.com/duanp/archive/2008/11/29/Matlab-GUIDE.html函数调用 在一个m文件中,可以定义多个函数,但是文件名一定要与第一个函 ...