3-STM32带你入坑系列(自己封装点亮一个灯的库--Keil)
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)的更多相关文章
- 2-STM32带你入坑系列(点亮一个灯--Keil)
1-STM32带你入坑系列(STM32介绍) 首先是安装软件 这一节用Kei来实现,需要安装MDK4.7这个软件,怎么安装,自己百度哈.都学习32的人了,不会连个软件都不会安装吧....还是那句话 没 ...
- 1-STM32带你入坑系列(STM32介绍)
由于自己的物联网开发板上的单片机是用的STM32,但是有些朋友没有用过,所以我将用这块开发板,带着大家入门STM32 先介绍一下STM32,我是在大三下学期的时候开始接触STM32,当时是想做一个小车 ...
- gulp入坑系列(2)——初试JS代码合并与压缩
在上一篇里成功安装了gulp到项目中,现在来测试一下gulp的合并与压缩功能 gulp入坑系列(1)--安装gulp(传送门):http://www.cnblogs.com/YuuyaRin/p/61 ...
- 入坑第二式 golang入坑系列
史前必读: 这是入坑系列的第二式,如果错过了第一式,可以去gitbook( https://andy-zhangtao.gitbooks.io/golang/content/ )点个回放,看个重播.因 ...
- Docker入坑系列(二)
Docker入坑系列(二) 上一篇我们为Docker创造了一个良好的生活环境,这一篇我们就开始让Docker活起来. 安装Docker ok,原文地址在这里. 当然,我只是自己翻译了一下而已- -跟着 ...
- Docker入坑系列(一)
Docker入坑系列(一) 引用嘛,当然是来引用别人说的东西啦. Docker 是一个开源项目,诞生于 2013 年初,它基于 Google 公司推出的 Go 语言实现. 项目后来加入了 Linux ...
- 初生牛犊不怕虎 golang入坑系列
读前必读,下面所有内容都是来自这里. 放到这里的目的,就是为了比对一下,哪里的读者多.平心而论,同样的Markdown,博客园排版真心X看,怎么瞅怎么X看.(X := '难' || X :='耐' | ...
- 维多利亚的秘密 golang入坑系列
原文在gitbook,字字原创,版权没有,转载随意. 在写本文的前一天,2017维密在上海开始了. 为了纪念屌丝界的盛世,特为本节起名维多利亚的秘密.现在的社会,要想出名只有抓眼球.所以写份技术文章, ...
- UVM入坑系列笔记(一)
最近本人在做毕业设计,需要用到UVM搭建验证平台,故在网上查找相关资料,看了一些博客和科普,多少有些收获,记录在这里,以便以后复习查看.以下是本人根据网上学习资料整理的笔记,如果有什么不对的地方欢迎指 ...
随机推荐
- Linux svn checkout时候总报设备上没有空间
详细报错信息:svn: 不能打开文件“weibosearch2.0.0/.svn/lock”: 设备上没有空间 但是df -h查看磁盘[root@picdata-1-2 data]# df -h文件系 ...
- 2.计算机组成-数字逻辑电路 门电路与半加器 异或运算半加器 全加器组成 全加器结构 反馈电路 振荡器 存储 D T 触发器 循环移位 计数器 寄存器 传输门电路 译码器 晶体管 sram rom 微处理 计算机
现代计算机的各个部件到底是如何通过逻辑电路构成的呢 半加器 我们说过了门电路 看似简单的三种门电路却是组成了整个逻辑电路的根基 真值表--其实就是根据输入输出状态枚举罗列出来的所有可能 比如有一台 ...
- Linux之部署前后端分离项目
首先得看我前两个博客,把python3,虚拟环境,mariadb数据库,redis数据库,nginx安装好. 一.创建一个虚拟环境 1,创建虚拟环境 mkvirtualenv zijin #创建了一个 ...
- webpack4.0各个击破(5)—— Module篇
webpack4.0各个击破(5)-- Module篇 webpack作为前端最火的构建工具,是前端自动化工具链最重要的部分,使用门槛较高.本系列是笔者自己的学习记录,比较基础,希望通过问题 + 解决 ...
- 使用微软PinYinConverter查询汉字拼音
通过汉字,如何查询拼音? 微软有相应的DLL可直接使用 引用方式 Nuget包管理安装 DLL下载后,引用 可以从微软的网站上下载相关文字处理的类库,下载地址如下: http://download.m ...
- c# 扩展方法初见理解
个人理解扩展方法是对某些类在不改变源码的基础上添加其他的方法.扩展方法必须是在非泛型的静态类里定义,且第一个参数是要使用this 指定需要扩展的类型. class Program { static v ...
- 记一次servlet项目启动
前言 tomcat 和 jetty 都属于 web 容器. mac安装tomcat brew install tomcat 安装之后,输入 catalina -h,可以看到各种命令,如run.star ...
- jsp基础语言-jsp声明
jsp声明的语法格式:<%! 声明代码 %> jsp声明的意义:用来定义在程序中使用到的变量.方法等.最后要以“:”结尾. jsp声明举例: <%! int a=100,b=200; ...
- vue项目利用apicloud打包成apk过程
最近公司要求我们用apicloud做一个app,正好利用这个机会学习下app的制作过程~ 页面的开发过程跟我们平时开发一样,利用vue把页面全部完成,最后进行npm run build将项目打包. 接 ...
- 环境设置——pyCharm环境下导入MySQLdb遇到的一系列问题
本文转自http://blog.sina.com.cn/s/blog_135031dae0102yc8l.html 安装好pyCharm后想要import MySQL,结果发现了一系列问题,像推到了塔 ...