本来想介绍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 开发记录与分享

    目录 最新版表白墙博客地址 1.微信小程序前台展示 2.功能介绍 3.后台管理 4.后端语言采用 JAVA 开发 5.体验此微信小程序 扫描下方二维码 6.如何联系我或需要源码进行联系 最新版表白墙博 ...

  2. MyEclipse 2016 Stable 1.0破解教程

    一.下载所需文件 1. Windows最新版: MyEclipse 2016 Stable 1.0离线安装包(文件大小:1.52GB)--完整安装包,无需在线下载http://pan.baidu.co ...

  3. fuel 9.0完全离线配置+升级fule 9.1+bootstrap制作

    2017-08-23 fuel 完全离线配置 完全离线适用于部署在内网,无Internet的环境当中,且需要升级fuel版本的情况.理论上,我的办法适用所有版本. 以下所有操作全部在fuel节点上. ...

  4. 最短代码实现包含100个key的字典,且每个value值不同

    最短代码实现包含100个key的字典,且每个value值不同 {x:x*2 for x in range(100)}

  5. Centos7安装mysql8教程

    网上的教程很多,我也参考了很多,以下是我实践的步骤,真实有效. 1.配置Mysql 8.0安装源: sudo rpm -Uvh https://dev.mysql.com/get/mysql80-co ...

  6. 微信小程序设计总结

    微信小程序是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的使用体验. 小程序提供了一个简单.高效的应用开发框架和丰富的组件及API,帮助开发者在微信中开发具有原生 A ...

  7. Python识别璇玑图中诗的数量

    一.璇玑图简介 璇玑图的读法有很多,这里我使用七七棋盘格的读法,在璇玑图中分离出一个七七棋盘格,如下表 吏 官 同 流 污 合 玩 痞 悍 蒙 骗 造 假 蛋 鸡 宴 请 客 友 朋 远 戚 偏 正 ...

  8. CSS开启硬件加速来提高网站性能

    原文永久链接 CSS animations, transforms 以及 transitions 不会自动开启GPU加速,而是由浏览器的缓慢的软件渲染引擎来执行. 那我们怎样才可以切换到GPU模式呢, ...

  9. OOM和JVM配置优化

    OOM这个缩写就是Java程序开发过程中让人最头痛的问题:Out of Memory.在很多开发人员的开发过程中,或多或少的都会遇到这类问题,这类问题定位比较困难,往往需要根据经验来判断可能出现问题的 ...

  10. 对于HTTP过程中POST内容加密的解决方案

    0x00前言 前几天我师傅和我提及了这件事情 正常情况下 抓包过程中遇到加密情况会很迷茫 昨天把这个都弄了一下 也感谢大佬中间的指导 我一开始看到密码的类型下意识的是base64 但是去解密发现不对 ...