王某人从0开始学习lorawan的笔记_1:最底层!IO驱动层,Gpio_t类
本来想介绍SX1276(与SX1278的操作完全相同,只是需要处理频段)的,但是这款芯片内容还是很丰富的,三言两语介绍不清,而且资料也很多就算了。
直接正面怼lorawan吧,怼到高地去,打爆lorawan的水晶,虐它的泉。
https://github.com/Lora-net/LoRaMac-node/tree/master,这是lorawan节点的官方源码。我选型的MCU平台是STM32L051C8。
一个单片机项目不管多复杂,肯定与GPIO有关系,lorawan同样也是如此。但一个优秀的程序,必须具有良好的可移植性。在源码中,官方为了减少与硬件层的联系,做了如下抽象:
在gpio.h中定义了一个Gpio_t类(PS:这是面向对象编程思想中的一个定义,反正就是一个抽象,理解成结构体或状态机都可以),里面有7个变量。
- PinNames类型的pin
gpio.h中把PinNames定义为一个枚举类型,里面有三个元素:MCU_PINS表示单片机上的GPIO引脚,IOE_PINS表示扩展的GPIO引脚(你要是觉得看着碍眼可以删),NC表示引脚没使用。我们只需要关心MCU_PINS与NC就可以了。
MCU_PINS被官方定义成了一个宏,在pinName-board.h文件中
把MCU_PINNS这个宏扩展到PinNames这个枚举类型中,我们可以发现,官方给PA_0到PH_15依次赋值为0到111,那反过来,只要指定pin变量的值在0到111这一区间,那我们就可以找到对应的引脚,并确定对应的引脚号和端口!!!给劲儿嗷。
2.uint16_t类型的pinIndex
pinIndex这个变量用来指示当前Gpio的引脚号,在源码中根据pin变量的值计算pinIndex的方式如下
比如PA_2则pinIndex=0x04,PB_3则pinIndex=0x08。
3指向空类型的指针变量port:void *port
需要啰嗦一句的是,若一个指针变量是空类型,则任意类型的指针变量都可以赋值给这个变量,但空类型的指针不能其他已确定类型的指针变量
port变量用来指示端口当前引脚端口,同样是根据pin变量的值确定,在函数中的处理如下:
例如,pin变量的值为PA_x,则 0 < pin < 15 , 与 0xF0 进行 & 运算,值为0 ,则确认端口号为GPIOA。
4.portIndex,现在用不着,留着以后用,未处理。
5.PinTypes类型的pull变量
这个对应引脚的上拉下拉类型,需要我们在初始化的时候指定。
6.指向空类型的指针变量Context
这个变量可以作为中断服务函数中的回调函数的函数参数。
7.指向中断服务函数的回调函数的指针变量IrqHandler
源码中预先声明好了中断服务函数的回调函数的函数类型,如下:
以上语句 声明了一种GpioIrqHandler的函数类型,该函数返回值为空,函数参数为空指针,即可以传递一个任一类型的指针。
而在Gpio_t类中,GpioIrqHandler* IrqHandler则定义IrqHandler是指向这种函数类型的指针。就相当于IrqHandler所指向的函数必须拥有同样的返回值和函数参数。
以上就是Gpio_t类的全部变量解析,所有对于GPIO的操作都是基于这个类进行的。
王某人从0开始学习lorawan的笔记_1:最底层!IO驱动层,Gpio_t类的更多相关文章
- 王某人从0开始学习lorawan的笔记_0
最近老板想做lorawan的项目,交给我了,我也应承下来了,但是!!!我TM连lorawan是啥子我都不知道啊啊啊啊啊! 真希望我女朋友可以看穿我的倔强,给我1千万,让我专心当舔狗,等等,我的女朋友? ...
- 自己从0开始学习Unity的笔记 I (C#字符串转换为数字)
我基本上从0开始学习编程,运算符基本上跳过,因为知道了 “=”这个符号相当于赋值,然后“==”才是等于,其他和普通运算符号差不都,也就跳过了. 最基础的赋值那种,我看了下代码,似乎没什么难度,估计新手 ...
- 0基础学习ios开发笔记第一天
Ios操作 界面操作 快捷键 command + c 复制 command+v 粘贴 command +a 全选 command +s 保存 command +z 撤销 command +x 剪切 ...
- 0基础学习ios开发笔记第二天
C语言的基本结构 c语言的入口函数是main函数. main函数的返回值行业标准是int return 数字:返回值 每条语句最后以分号结尾 注释:行注释.块注释 int main(void) { / ...
- 自己从0开始学习Unity的笔记 VII (C#中类继承练习)
好久都没有写了.今天做了类继承的练习,做了一个小队,进行简单的判定. namespace 兵团建立练习 { class ServantBasics { public string name; //pr ...
- 自己从0开始学习Unity的笔记 VI (C#的for循环练习)
最近学到了for循环,我觉得其实看情况吧,和while挺像的,不过适合于累加或者累减这类的,for循环要更好用一点 for循环首先格式是 ; i < length; i++) { } 意思很简单 ...
- 自己从0开始学习Unity的笔记 V (C#的数组练习)
今天练习了数组输入,先从最简单的开始,因为我输入完这些之后,觉得应该有更简单的方法,先来介绍一下我做的练习代码 //做一个最多能容纳10个数字的,用户可以输入任意1-10个数字,判断长度,输出数字 ] ...
- 自己从0开始学习Unity的笔记 IV (C#循环练习-数字猜谜游戏)
想起来现在基础的已经学了不少了,那么这次试一下用while写一个数字猜谜的. Random roll = new Random(); //建立一个骰子 , ); //让骰子在1-100内随机一个数 ; ...
- 自己从0开始学习Unity的笔记 IV (C#循环练习输出素数)
来测试一下循环....刚刚学了while循环,测试一下输出1-100的素数 我想了一下,素数就是只能被1和本身整除,那就是只能被整除2次,我是顺着这个思路写的代码,如果被整除超过2次,那么肯定不是素数 ...
随机推荐
- 程序员的长安十二时辰:Java实现从Google oauth2.0认证调用谷歌内部api
最近公司在做一个app购买的功能,主要思路就是客户在app上购买套餐以后,Google自动推送消息到Java后端,然后Java后端通过订单的token获取订单信息,保存到数据库. Java后端要获取订 ...
- jmeter环境变量
jmeter环境变量配置jmeter环境变量时,同时也需要配置Java变量(jdk最好使用1.7及1.7以上的版本)1.配置jdk环境变量安装jdk正常安装,一路默认就好,记住安装路径,配置环境变量时 ...
- ubuntu防火墙规则之ufw
前言 因公司项目的需求,需要对客户端机器简便使用防火墙的功能,所以可在页面进行简便设置防护墙规则,当然,这个功能需求放到我手上我才有机会学到.因为客户端机器都是ubuntu的,所以当然用了ubuntu ...
- 跟着阿里p7一起学java高并发 - 第19天:JUC中的Executor框架详解1,全面掌握java并发核心技术
这是java高并发系列第19篇文章. 本文主要内容 介绍Executor框架相关内容 介绍Executor 介绍ExecutorService 介绍线程池ThreadPoolExecutor及案例 介 ...
- 并发栅栏CyclicBarrier---简单问2
并发栅栏CyclicBarrier---简单问 背景:前几天在网上看到关于Java并发包java.concurrent中一个连环炮的面试题,整理下以备不时之需. CyclicBarrier简介: 栅栏 ...
- Python实现批量处理扫描特定目录
## 简述在渗透测试中遇到相同CMS站点时,搞定一个站点,相当于拿了一个站群的通用漏洞,所以我们首先需要标注站点的CMS类型,根据要求编写如下脚本 ## 要求1.访问特定目录,如:站点特定 /cmsa ...
- Zabbix-agentd错误整理
一.无法启动 (一).当时环境 Firewalld与Selinux,Iptables都为关闭 配置环境 OS:CentOS Zabbix-server IP:10.18.43.71 Hostname: ...
- 10.Go-goroutine,waitgroup,互斥锁和channel
10.1.goroutine goroutine的使用 //Learn_Go/main.go package main import ( "fmt" "time" ...
- 前端登录jq图形验证码
<!DOCTYPE html><html lang="zh"><head> <meta charset="UTF-8" ...
- JVM运行时数据区--深入理解Java虚拟机 读后感
程序计数器 程序计数器是线程私有的区域,很好理解嘛~,每个线程当然得有个计数器记录当前执行到那个指令.占用的内存空间小,可以把它看成是当前线程所执行的字节码的行号指示器.如果线程在执行Java方法,这 ...