本来想介绍SX1276(与SX1278的操作完全相同,只是需要处理频段)的,但是这款芯片内容还是很丰富的,三言两语介绍不清,而且资料也很多就算了。

  直接正面怼lorawan吧,怼到高地去,打爆lorawan的水晶,虐它的泉。

  https://github.com/Lora-net/LoRaMac-node/tree/master,这是lorawan节点的官方源码。我选型的MCU平台是STM32L051C8。

  一个单片机项目不管多复杂,肯定与GPIO有关系,lorawan同样也是如此。但一个优秀的程序,必须具有良好的可移植性。在源码中,官方为了减少与硬件层的联系,做了如下抽象:

  

  在gpio.h中定义了一个Gpio_t类(PS:这是面向对象编程思想中的一个定义,反正就是一个抽象,理解成结构体或状态机都可以),里面有7个变量。

  1. 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类的更多相关文章

  1. 王某人从0开始学习lorawan的笔记_0

    最近老板想做lorawan的项目,交给我了,我也应承下来了,但是!!!我TM连lorawan是啥子我都不知道啊啊啊啊啊! 真希望我女朋友可以看穿我的倔强,给我1千万,让我专心当舔狗,等等,我的女朋友? ...

  2. 自己从0开始学习Unity的笔记 I (C#字符串转换为数字)

    我基本上从0开始学习编程,运算符基本上跳过,因为知道了 “=”这个符号相当于赋值,然后“==”才是等于,其他和普通运算符号差不都,也就跳过了. 最基础的赋值那种,我看了下代码,似乎没什么难度,估计新手 ...

  3. 0基础学习ios开发笔记第一天

    Ios操作 界面操作 快捷键 command + c 复制 command+v 粘贴 command +a 全选 command +s 保存 command +z 撤销 command +x  剪切 ...

  4. 0基础学习ios开发笔记第二天

    C语言的基本结构 c语言的入口函数是main函数. main函数的返回值行业标准是int return 数字:返回值 每条语句最后以分号结尾 注释:行注释.块注释 int main(void) { / ...

  5. 自己从0开始学习Unity的笔记 VII (C#中类继承练习)

    好久都没有写了.今天做了类继承的练习,做了一个小队,进行简单的判定. namespace 兵团建立练习 { class ServantBasics { public string name; //pr ...

  6. 自己从0开始学习Unity的笔记 VI (C#的for循环练习)

    最近学到了for循环,我觉得其实看情况吧,和while挺像的,不过适合于累加或者累减这类的,for循环要更好用一点 for循环首先格式是 ; i < length; i++) { } 意思很简单 ...

  7. 自己从0开始学习Unity的笔记 V (C#的数组练习)

    今天练习了数组输入,先从最简单的开始,因为我输入完这些之后,觉得应该有更简单的方法,先来介绍一下我做的练习代码 //做一个最多能容纳10个数字的,用户可以输入任意1-10个数字,判断长度,输出数字 ] ...

  8. 自己从0开始学习Unity的笔记 IV (C#循环练习-数字猜谜游戏)

    想起来现在基础的已经学了不少了,那么这次试一下用while写一个数字猜谜的. Random roll = new Random(); //建立一个骰子 , ); //让骰子在1-100内随机一个数 ; ...

  9. 自己从0开始学习Unity的笔记 IV (C#循环练习输出素数)

    来测试一下循环....刚刚学了while循环,测试一下输出1-100的素数 我想了一下,素数就是只能被1和本身整除,那就是只能被整除2次,我是顺着这个思路写的代码,如果被整除超过2次,那么肯定不是素数 ...

随机推荐

  1. Java--UTF-8

    UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码.由Ken Thompson于1992年创建.现在已经标准化为 ...

  2. linux初学者-普通磁盘分区篇

    linux初学者-普通磁盘分区篇 磁盘是计算机的重要组成部分,是记录数据的场所.在使用磁盘时,经常需要对其进行分区来实现不同的用途.下文将介绍在linux系统中普通磁盘分区的方法. "fdi ...

  3. java练习---14

    abstract class A{ private String name; public A(String name) { this.name = name; } public String get ...

  4. Android的简述4

    NoteEditor深入分析 首先来弄清楚“日志编辑“的状态转换,通过上篇文章的方法来做下面这样一个实验,首先进入“日志编辑“时会触发onCreate和onResume,然后用户通过Option Me ...

  5. python post接口测试第一个用例日记

    如下是我自己公司的一个请求,学习过程顺便记录下,都是白话语言,不那么专业,不喜勿喷! 首先看下图,post请求一般需要填写参数url, data(一般是表格类型的参数,如我们智联驾驶APP登录的参数) ...

  6. TCP加速机制是如何加速的?

    一.什么是TCP加速?   TCP加速就是在高时延链路提高吞吐量的一系列解决方案.   二.为什么需要对TCP进行加速?   1.传统的TCP拥塞控制算法并不适用于高时延.高误码的链路. 2.随着we ...

  7. cookie池的维护

    存储形式: 存储在redis中,“spider_name:username–password":cookie 建立py文件及包含方法: initcookies() 初始化所有账号的cooki ...

  8. S2:ArrayList

    1.ArrayList   ArrayList非常类似于数组,也有人称它为数组列表,ArrayList可以动态维护. 因为数组的长度是固定的,而SArrayList的容量可以根据需要自动扩充. Arr ...

  9. Windbg程序调试系列-索引篇

    最近整理了一下Windbg程序调试系列的文章,做个了索引贴,方便大家查询.搜索: Windbg程序调试系列1-常用命令说明&示例 Windbg程序调试系列1-Mex扩展使用总结 Windbg程 ...

  10. JAVA基础知识(八)值传递与引用传递

    值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响 ...