重学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 菜鸡一枚. 于是,我想 ...
随机推荐
- express+nodecoffee写passport登录验证实例(一)
项目中要用到passport登录验证,环境如标题样:express框架,coffee模版引擎,node后台 一:建项目 直接用express命令建,虽然默认模版为jade,可以手动换成coffee哦. ...
- Windows server2003 + sql server2005 集群配置安装
http://blog.itpub.net/29500582/viewspace-1249319/
- Windows内核对象
1. 内核对象 Windows中每个内核对象都只是一个内存块,它由操作系统内核分配,并只能由操作系统内核进行访问,应用程序不能在内存中定位这些数据结构并直接更改其内容.这个内存块是一个数据结构,其成员 ...
- linux 安装软件,卸载软件 等的几种方式
安装软件的步骤和基本原则: 1. rpm安装: 定义: rpm是由红帽公司开发的软件包管理方式,使用rpm我们可以方便的进行软件的安装.查询.卸载.升级等工作.但是rpm软件包之间的依赖性问题往往会很 ...
- uva 10491
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- 第三方开源水面波浪波形view:WaveView
一个比较有趣的Android第三方开源波形view:WaveView,这种WaveView在一些常见的APP开发中,以水面波浪波形的形象的生动展示手机还剩余多少电量,存储容量还有多少等,比较形象直观生 ...
- jq 判断输入数字
jq 判断输入数字 <input id="N_source" name="N_source" type="text" valu ...
- ZOJ 3646 Matrix Transformer 二分匹配,思路,经典 难度:2
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4836 因为要使对角线所有元素都是U,所以需要保证每行都有一个不同的列上有U,设 ...
- SAP iDoc 概念及管理
创建IDOC: 第一步:WE31 创建IDOC所包含的字段. 第二步:WE30 创建IDOC 把Segment分配给IDOC 第三步:WE81 创建信息类型 第四步:WE82 把 ...
- 使用read write 读写socket
一旦,我们建立好了tcp连接之后,我们就可以把得到的fd当作文件描述符来使用. 由此网络程序里最基本的函数就是read和write函数了. 写函数: ssize_t write(int fd, con ...