本来想介绍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. python 爬取豆瓣电影评论,并进行词云展示及出现的问题解决办法

    本文旨在提供爬取豆瓣电影<我不是药神>评论和词云展示的代码样例 1.分析URL 2.爬取前10页评论 3.进行词云展示 1.分析URL 我不是药神 短评 第一页url https://mo ...

  2. python编码问题——解决python3 UnicodeEncodeError: 'gbk' codec can't encode character '\xXX' in position XX

    python实现爬虫遇到编码问题: error:UnicodeEncodeError: 'gbk' codec can't encode character '\xXX' in position XX ...

  3. Android 开发使用自定义字体

    有时候,系统自带的字体并不能满足我们特殊的需求,这时候就需要引用其他的字体了,可以把下载的字体文件放在 assets 目录下. 自定义字体文件不能使用xml代码读取而应该使用java代码: publi ...

  4. Flink状态专题:keyed state和Operator state

            众所周知,flink是有状态的计算.所以学习flink不可不知状态.         正好最近公司有个需求,要用到flink的状态计算,需求是这样的,收集数据库新增的数据.       ...

  5. MemCached的telnet命令行参数

    1.启动Memcache 常用参数 -p <num>      设置TCP端口号(默认不设置为: 11211) -U <num>      UDP监听端口(默认: 11211, ...

  6. 在.NET CORE中使用配置文件:对 ConfigurationBuilder 的使用说明

    示例:ASP.NET MVC 使用示例: 如何覆写默认行为?如取消热更新支持,方法如下: 示例:控制台 使用应用程序参数 使用键值对枚举(这里以字典来说明) 使用JSON文件 注册配置文件中的某一个段 ...

  7. dubbo文档笔记

    配置覆盖关系 以 timeout 为例,显示了配置的查找顺序,其它 retries, loadbalance, actives 等类似: 方法级优先,接口级次之,全局配置再次之. 如果级别一样,则消费 ...

  8. 【POJ - 2236】Wireless Network (并查集)

    Wireless Network 这接翻译了 Descriptions 地震发生在东南亚.ACM(亚洲合作医疗团队)已经与膝上电脑建立了无线网络,但是一次意外的余震袭击,网络中的所有计算机都被打破了. ...

  9. java并发编程(十八)----(线程池)java线程池框架Fork-Join

    还记得我们在初始介绍线程池的时候提到了Executor框架的体系,到现在为止我们只有一个没有介绍,与ThreadPoolExecutor一样继承与AbstractExecutorService的For ...

  10. IntelliJ IDEA + Maven + Jetty + Jersey搭建RESTful服务

    这次参考的是这个博客,完全按照这个我这里会出一些问题,一会再说就是了. https://www.cnblogs.com/puyangsky/p/5368132.html 一.首先新建一个项目,选择Ja ...