2-STM32带你入坑系列(点亮一个灯--Keil)

首先建一个stm32f103x.h的文件,然后 #include "stm32f103x.h"

还记得上一节

现在呢就是做一个库,我就是想控制IO的时候方便一点,列如

PA 通过某种方式  CRL/CRH/IDR/ODR/BSRR/BRR/LCKR

PB 通过某种方式  CRL/CRH/IDR/ODR/BSRR/BRR/LCKR

PC  ;  PD  ; PE ......

额,直接进入正题

要是可以这样就好了  PA->CRL = XXXXXXXX    PB->CRL = XXXXXXXX   PC->CRL = XXXXXXXX   PD ->CRL = XXXXXXXX

那就引入结构体(其实可以这样做主要还是因为寄存器地址是连续的)

typedef struct
{
unsigned int CRL;
unsigned int CRH;
unsigned int IDR;
unsigned int ODR;
unsigned int BSRR;
unsigned int BRR;
unsigned int LCKR;
} GPIO_TypeDef;

在32位处理器上 unsigned int 是32位的

假设要控制PA口哈

如果咱定义一个 GPIO_TypeDef的变量(指针),然后让这个变量(指针)的地址是  0x40010800 就好了

结构体指针是这个结构体的首地址,也是里面第一个变量的首地址

这样的话 CRL的地址就是0x40010800    CRH的地址就是  0x40010804    IDR的地址就是0x40010808

如果C语言不好......自己去百度哈,自己测试打印打印

先说一个强制转换的问题

可以测试看一下

不知道还有没有什么疑问,根据上一节哈,有人会想   为什么不是这样    ss = (int *)point;  或者 ss = (unsigned int *)point;

(int *)point   就把后面的point(0x40010800) 当成了一个地址,然后把这个地址赋值给ss不行吗?

记住哈,指针也是有类型的   ss是一个什么呀

那 ss = 这边也应该是一个结构体类型的指针    所以才需要  

所谓:   鱼找鱼虾找虾乌龟找王八

但是那样写有点麻烦

要是直接代替掉

就好了

,可以这样

#define  GPIOA  (GPIO_TypeDef *)point

就是用GPIOA  替换掉后面的指针

现在GPIOA  所指向的就是GPIO_TypeDef  这个结构体了

写的好点就是

可是感觉这样写还是有点麻烦,我想再封装一下

咱就咱建一个stm32f10x_gpio.c   和  stm32f10x_gpio.h 的文件,对函数进行进一步的封装

先写设置输出高电平的 (注意哈,我写的函数是根据ST写的库写的,不是按照自己的想法写的,主要是在下一节学习库的时候,让大家感觉亲切)

这样多个文件大家应该懂吧???  改天我再写一篇关于文件编译和多文件编译的文章.

定义成,结构体指针变量,这样就可以直接传进来

因为GPIOA,GPIOB,GPIOC 就是结构体指针变量

咱控制PA0输出高电平

GPIO_SetBits(GPIOA,0)

控制PA1输出高电平

GPIO_SetBits(GPIOA,1)

咱想要的是这样

然后按照咱想的设计一下里面的内容(咱还是用ODR实现哈哈)

GPIOx->ODR = (unsigned int)1<<GPIO_Pin;

假设传进来的是0

GPIOx->ODR = (unsigned int)1<<0;        (unsigned int)1左移0位(0000 0000 0000 0001);

GPIOx->ODR = 0x0001

假设传进来的是1

GPIOx->ODR =(unsigned int)1<<1;       (unsigned int)1左移1位(0000 0000 0000 0010);

GPIOx->ODR = 0x0002

貌似是可以但是有件事就是每次都会清除原来的

这事情简单

GPIOx->ODR |= (unsigned int)1<<GPIO_Pin;

加个 |  或  就可以了

咱现在测试测试

    

还可以哈

现在设置模式,由于引脚的模式的有好几个,还有设置引脚的速率,所以呢就用一个结构体配置引脚的模式和速率

3-STM32带你入坑系列(自己封装点亮一个灯的库--Keil)的更多相关文章

  1. 2-STM32带你入坑系列(点亮一个灯--Keil)

    1-STM32带你入坑系列(STM32介绍) 首先是安装软件 这一节用Kei来实现,需要安装MDK4.7这个软件,怎么安装,自己百度哈.都学习32的人了,不会连个软件都不会安装吧....还是那句话 没 ...

  2. 1-STM32带你入坑系列(STM32介绍)

    由于自己的物联网开发板上的单片机是用的STM32,但是有些朋友没有用过,所以我将用这块开发板,带着大家入门STM32 先介绍一下STM32,我是在大三下学期的时候开始接触STM32,当时是想做一个小车 ...

  3. gulp入坑系列(2)——初试JS代码合并与压缩

    在上一篇里成功安装了gulp到项目中,现在来测试一下gulp的合并与压缩功能 gulp入坑系列(1)--安装gulp(传送门):http://www.cnblogs.com/YuuyaRin/p/61 ...

  4. 入坑第二式 golang入坑系列

    史前必读: 这是入坑系列的第二式,如果错过了第一式,可以去gitbook( https://andy-zhangtao.gitbooks.io/golang/content/ )点个回放,看个重播.因 ...

  5. Docker入坑系列(二)

    Docker入坑系列(二) 上一篇我们为Docker创造了一个良好的生活环境,这一篇我们就开始让Docker活起来. 安装Docker ok,原文地址在这里. 当然,我只是自己翻译了一下而已- -跟着 ...

  6. Docker入坑系列(一)

    Docker入坑系列(一) 引用嘛,当然是来引用别人说的东西啦. Docker 是一个开源项目,诞生于 2013 年初,它基于 Google 公司推出的 Go 语言实现. 项目后来加入了 Linux ...

  7. 初生牛犊不怕虎 golang入坑系列

    读前必读,下面所有内容都是来自这里. 放到这里的目的,就是为了比对一下,哪里的读者多.平心而论,同样的Markdown,博客园排版真心X看,怎么瞅怎么X看.(X := '难' || X :='耐' | ...

  8. 维多利亚的秘密 golang入坑系列

    原文在gitbook,字字原创,版权没有,转载随意. 在写本文的前一天,2017维密在上海开始了. 为了纪念屌丝界的盛世,特为本节起名维多利亚的秘密.现在的社会,要想出名只有抓眼球.所以写份技术文章, ...

  9. UVM入坑系列笔记(一)

    最近本人在做毕业设计,需要用到UVM搭建验证平台,故在网上查找相关资料,看了一些博客和科普,多少有些收获,记录在这里,以便以后复习查看.以下是本人根据网上学习资料整理的笔记,如果有什么不对的地方欢迎指 ...

随机推荐

  1. 日志服务Python消费组实战(三):实时跨域监测多日志库数据

    解决问题 使用日志服务进行数据处理与传递的过程中,你是否遇到如下监测场景不能很好的解决: 特定数据上传到日志服务中需要检查数据内的异常情况,而没有现成监控工具? 需要检索数据里面的关键字,但数据没有建 ...

  2. Shell从入门到精通进阶之三:表达式与运算符

    3.1 条件表达式 表达式 示例 [ expression ] [ 1 -eq 1 ]  ` expression ` ` 1 -eq 1 ` test expression test 1 -eq 1 ...

  3. 解读经典《C#高级编程》第七版 Page100-107.继承.Chapter4

    前言 本章节继续讲实现继承. 实现继承 密封类和密封方法 密封类和方法的概念很简单,就是为了不允许类和方法被继承和扩展.不允许扩展一般的原因有: 如果类或者方法被扩展,可能会导致类库执行错误 因为版权 ...

  4. springboot(五)过滤器和拦截器

    前言 过滤器和拦截器二者都是AOP编程思想的提现,都能实现诸如权限检查.日志记录等.二者有一定的相似之处,不同的地方在于: Filter是servlet规范,只能用在Web程序中,而拦截器是Sprin ...

  5. asp.net mvc Html.BeginForm()及Html.Action用法

    Html.BeginForm    Add:操作方法的名称,Activities:控制器的名称,FormMethod.Post:定义from的method的值,,new { id = "fo ...

  6. C#/VB.NET 操作Word批注(二)——如何插入图片、读取、回复Word批注内容

    序 在前面的文章C# 如何插入.修改.删除Word批注一文中介绍了如何操作Word批注的一些方法,在本篇文章中继续介绍操作Word批注的方法.分以下三种情况来介绍: 1. 插入图片到Word批注 2. ...

  7. js之正则的坑

    首先给一个神奇的图: 我的反应,精分吧!一会儿true一会儿false的... 后来发现,把g去掉后就正常了,那这是为什么呢??lastIndex惹得鬼! 正文: lastIndex 全局正则表达是, ...

  8. vue px转换为rem

    前端开发中还原设计图的重要性毋庸置疑,目前来说应用最多的应该也还是使用rem.然而很多人依然还是处于刀耕火种的时代,要么自己去计算rem值,要么依靠编辑器安装插件转换. 而本文的目标就是通过一系列的配 ...

  9. js 动态添加class封装(es6语法)

    export function hasClass(el, className) { let reg = new RegExp('(^|\\s)' + className + '(\\s|$)') re ...

  10. CSS3图片翻转动画技术详解

    CSS动画非常的有趣:这种技术的美就在于,通过使用很多简单的属性,你能创建出漂亮的消隐效果.其中代表性的一种就是CSS图片翻转效果,能让你看到一张卡片的正反两面上的内容.本文就是要用最简单的方法向大家 ...