本来想介绍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. JS+Jquery自定义格式导出HTML为Word(下列插件同样可以用于Excel导出)

    这里的word导出主要采用了jquery.wordexport.js.FileSaver.js,做功能之前我也是找了很多网上的资料,里面涉及到js导出word的用的都是这个插件,只是在自定义样式这一块 ...

  2. 解密Kafka吞吐量高的原因

    众所周知kafka的吞吐量比一般的消息队列要高,号称the fastest,那他是如何做到的,让我们从以下几个方面分析一下原因. 生产者(写入数据) 生产者(producer)是负责向Kafka提交数 ...

  3. linux初学者-pxe装机篇

    linux初学者-pxe装机篇 PXE的网络装机是客户机从自己的网卡启动,向本网络中的DHCP服务器索取ip,并从本网络的TFTP服务器中索取启动文件进行装机.此装机需要kickstart.tftp. ...

  4. Android的简述4

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

  5. TestNG中@Factory的用法一:简单的数据驱动

    为什么要使用@Factory注解呢,先来看下面这个例子 被测试类Person package ngtest; import org.testng.annotations.Parameters; imp ...

  6. Lexical or preprocessor 'XXX/XXX.h' issue file not found

    最近做第三方登录,引入了第三库,结果就出来个这个问题.如下图所示: 刚开始编译运行都没问题,可下次再打开时就报这个错误…… 一个比较弱智的解决办法: 1. 删除第三方库文件(删除到垃圾箱,而且还要在文 ...

  7. Gridea+GitHub搭建个人博客

    某日闲余时间看到一篇介绍Gridea博客平台的文章,大概看了一下觉得此平台还不错,随即自己进入Gridea官网瞅了瞅.哇,这搭建过程也太简单了吧,比Hexo博客搭建要容易很多,而且还有后台管理客户端, ...

  8. kubernetes对接第三方认证

    kubernetes对接第三方认证 kubernetes离线安装包地址 概述 本文介绍如何使用github账户去关联自己kubernetes账户.达到如下效果: 使用github用户email作为ku ...

  9. ProcessBuilder waitFor 调用外部应用

    小程序项目最初使用ffmpeg转换微信录音文件为wav格式,再交给阿里云asr识别成文字.视频音频转换最常用是ffmpeg. 1 ffmpeg -i a.mp3 b.wav 相关文章: 小程序实现语音 ...

  10. HC-08 BLE资料

    1.1 特点简介 HC-08蓝牙串口通信模块是新一代的基于Bluetooth Specification V4.0 BLE蓝牙协议的数传模块.无线工作频段为 2.4GHz ISM,调制方式是 GFSK ...