今天的分享第一个就是看见了 发现自己不知道 来贴贴 没什么用 其他还是嵌入式

一、常见的开源协议

1、GPL通用公共许可协议

GPL全称“GNU General Public License”,也叫 GNU GPL,其中典型的就是 Linux 采用了 GPL 开源协议。

只要软件中包含了遵循 GPL 协议的产品或代码,该软件就必须也遵循 GPL 许可协议,也就是必须开源免费,不能闭源收费,因此这个协议并不适合商用软件。

遵循 GPL 协议的开源软件数量极其庞大,包括 Linux 系统在内的大多数的开源软件都是基于这个协议的。

GPL 开源协议的主要特点:

  • 复制自由:允许把软件复制到任何人的电脑中,并且不限制复制的数量。
  • 传播自由:允许软件以各种形式进行传播。
  • 收费传播:允许在各种媒介上出售该软件,但必须提前让买家知道这个软件是可以免费获得的;因此,一般来讲,开源软件都是通过为用户提供有偿服务的形式来盈利的。
  • 修改自由:允许开发人员增加或删除软件的功能,但软件修改后必须依然基于GPL许可协议授权。

2、BSD伯克利软件发行版协议

BSD全称"Berkeley Software Distribution"。

BSD 协议基本上允许用户“为所欲为”,用户可以使用、修改和重新发布遵循该许可的软件,并且可以将软件作为商业软件发布和销售,前提是需要满足下面三个条件:

  • 如果再发布的软件中包含源代码,则源代码必须继续遵循 BSD 许可协议。
  • 如果再发布的软件中只有二进制程序,则需要在相关文档或版权文件中声明原始代码遵循了 BSD 协议。
  • 不允许用原始软件的名字、作者名字或机构名称进行市场推广。

BSD 对商业比较友好,很多公司在选用开源产品的时候都首选 BSD 协议,因为可以完全控制这些第三方的代码,甚至在必要的时候可以修改或者二次开发。 

3、Apache许可证协议

Apache Licence,是Apache软件基金会发布的一个自由软件许可证。

Apache许可证是著名的非盈利开源组织Apache采用的协议。该协议和BSD类似,同样鼓励代码共享和最终原作者的著作权,同样允许源代码修改和再发布。但是也需要遵循以下条件:

  • 需要给代码的用户一份Apache Licence。
  • 如果修改了代码,需要再被修改的文件中说明。
  • 在衍生的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议,商标,专利声明和其他原来作者规定需要包含的说明。
  • 如果再发布的产品中包含一个Notice文件,则在Notice文件中需要带有Apache Licence。你可以再Notice中增加自己的许可,但是不可以表现为对Apache Licence构成更改。
  • Apache Licence也是对商业应用友好的许可。使用者也可以再需要的时候修改代码来满足并作为开源或商业产品发布/销售。

使用这个协议的好处是:

  • 永久权利 一旦被授权,永久拥有。
  • 全球范围的权利 在一个国家获得授权,适用于所有国家。假如你在美国,许可是从印度授权的,也没有问题。
  • 授权免费 无版税, 前期、后期均无任何费用。
  • 授权无排他性 任何人都可以获得授权
  • 授权不可撤消 一旦获得授权,没有任何人可以取消。比如,你基于该产品代码开发了衍生产品,你不用担心会在某一天被禁止使用该代码

4、MIT麻省理工学院协议

MIT是和BSD一样宽范的许可协议,源自麻省理工学院(Massachusetts Institute of Technology, MIT),又称X11协议。。

作者只想保留版权,而无任何其他了限制。MIT与BSD类似,但是比BSD协议更加宽松,它是目前限制最少的开源许可协议之一(比 BSD 和 Apache 的限制都少),只要程序的开发者在修改后的源代码中保留原作者的许可信息即可,因此普遍被商业软件所使用。

使用 MIT 协议的软件有 PuTTY、X Window System、Ruby on Rails、Lua 5.0 onwards、Mono 等。

5、LGPL宽通用公共许可协议

LGPL全称“GNU Lesser General Public License”。

LGPL 是 GPL 的一个衍生版本,也被称为 GPL V2,该协议主要是为类库设计的开源协议。

LGPL 允许商业软件通过类库引用(link)的方式使用 LGPL 类库,而不需要开源商业软件的代码。这使得采用 LGPL 协议的开源代码可以被商业软件作为类库引用并发布和销售。

但是如果修改 LGPL 协议的代码或者衍生品,则所有修改的代码,涉及修改部分的额外代码和衍生的代码都必须采用 LGPL 协议。因此LGPL协议的开源代码很适合作为第三方类库被商业软件引用,但不适合希望以 LGPL 协议代码为基础,通过修改和衍生的方式做二次开发的商业软件采用。

世界上的开源许可证有上百种,还有很多,比如:MPL、 EPL、 Mozilla、 Creative Commons等,这里就不一一列举了,感兴趣的小伙伴可以自行上网了解。

这可以参看:

 https://www.gnu.org/licenses/license-list.html

如何选择开源协议

世界上的开源协议有上百种,很少有人能彻底搞清它们之间的区别,即使在最流行的六种开源协议【GPL、BSD、MIT、Mozilla、Apache 和 LGPL】之中做选择,也很复杂。

一张分析图说明应该怎么选择开源协议

嵌入式分享合集52_运维

嵌入式分享合集52_陀螺仪_02

二、CAN滤波器的设置

在CAN协议里,报文的标识符不代表节点的地址,而是跟报文的内容相关的。因此,发送者以广播的形式把报文发送给所有的接收者。节点在接收报文时,根据标识符的值决定软件是否需要该报文;如果需要,就拷贝到RAM里;如果不需要,报文就被丢弃且无需软件的干预。为满足这一需求,beCAN为应用程序提供了个可配置的、位宽可变的6个(0-5)过滤器组,用于只接收那些软件需要的报文。硬件过滤的做法节省了CPU开销,否则就必须由软件进行过滤,从而占用一定的CPU资源。

滤波器设置包括下面几个寄存器:CAN滤波模式寄存器1 (CAN_FMR1)和CAN滤波模式寄存器2(CAN_FMR2)、CAN滤波配置寄存器1 (CAN_FCR1)、CAN滤波配置寄存器2 (CAN_FCR2)和CAN滤波配置寄存器3 (CAN_FCR3),CAN滤波组i寄存器x (CAN_FiRx) (i = 0 .. 5, x = 1 .. 8)。

滤波模式寄存器用于设置滤波器为标识符列表模式和掩码模式,滤波配置寄存器用于开启或关闭滤波器和滤波器的宽度设置,滤波组用于具体滤波设置。

6个可配置的位宽可变的过滤器组,通过FSCx0(x=1..6)和FSCx1(x=1..6)设置滤波宽度,

嵌入式分享合集52_linux_03

就32位滤波器设置进行解读,CAN报文分为标准帧和扩展帧,标准帧ID11位,扩展帧29位,ID与滤波配置映射关系如上表所示,如滤波模式设置可知可以分为两个ID或者一个ID+Mask。当需要过滤某一段ID时,使用ID+Mask模式,当过滤具体ID时直接使用ID模式即可。

如果我的扩展id是0x12345678 ;想只接收0x12xxxxxx的标识符号,该如何设置滤波器,

此处采用32位滤波器0进行滤波配置,因此FSC00 = 1;FSC01 = 1;FMH0 = 0;FML0 = 0;

扩展id为0x12345678 (0001,0010,0011,0100,0101,0110,0111,1000)

将扩展帧ID填入CAN帧ID格式中

 

嵌入式分享合集52_linux_04

 RTR位我们设置为0表示数据帧,IDE位设置为1表示扩展ID,因为我们的ID是29位的,所以RTR = 0;IDE = 1;

在滤波器中填充如下:

嵌入式分享合集52_寄存器_05

 如果要关心到具体的某一个比特位置;如果要过滤让它只接收0x12xxxxxx的表示符号;

这时候要根据它实际在identify中的位置去修改idmask ; 前八个比特,对应的就是黄色和绿色的部分,所以其他的颜色,可以都填0表示不需要关心,则这里填入:1 1 1 1 ,1 x x x,我们这里填0xF8 ;

CAN_F0R1 = 0x91; CAN_F0R2 = 0x00; CAN_F0R3 = 0x00; CAN_F0R4 = 0x00;

CAN_F0R5 = 0x91; CAN_F0R6 = 0x00; CAN_F0R7 = 0x00; CAN_F0R8 = 0x00;

同理,对于下面的配置是只接收标准id= 0x321(0011,0010,0001)的ID(也是32位过滤器),

因为也是数据帧,所以RTR = 0,标准的id,所以IDE = 0 ;所以填入到:

 

嵌入式分享合集52_运维_06

 CAN_F0R1 = 0x64; CAN_F0R2 = 0x20; CAN_F0R3 = 0x00; CAN_F0R4 = 0x00;

CAN_F0R5 = 0xFF; CAN_F0R6 = 0xE0; CAN_F0R7 = 0x00; CAN_F0R8 = 0x00;

设置过滤器0只接收ID为0x1828A0EF和0x1828A0EE的数据帧。(工作在标识符列表模式)

首先我们把这两个ID写成二进制:

0x1828A0EF:0001 1000 0010 1000 1010 0000 1110 1111

0x1828A0EE:0001 1000 0010 1000 1010 0000 1110 1110

然后我们将0x1828A0EF二进制的格数据组成如上图mapping所示的格式

Can_fxr1:1100 0001 0xc1

Can _fxr2:0100 1001 0x49 //这里有个RTR位我们设置为0表示数据帧,IDE位设置为1表示扩展ID,

Can _fxr3:0100 0001 0x41

Can _fxr4:1101 1110 0xDE

这时我们工作在标识符列表模式,identifier/Mask的寄存器相当于identifier使用。

再将0x1828A0EE二进制的格数据组成如上图mapping所示的格式

Can _fxr5:1100 0001 0xc1

Can _fxr6:0100 1001 0x49 //这里有个RTR位我们设置为零表示数据帧,IDE设置为1表示扩展ID

Can _fxr7:0100 0001 0x41

Can _fxr8:1101 1100 0xDC

 

嵌入式分享合集52_陀螺仪_07

 16位配置模式也经常使用,如CAN网络管理中往往涉及到网络管理ID-0x4xx,因此需要利用ID和Mask模式,其余的采用ID模式,可以建立滤波器设置寄存器数组.

0x400网段,0x330,0x320
0x400: 展开 0000 0100 0000 0000,采用标准帧数据帧格式
0x330: 展开 0000 0011 0011 0000
0x320: 展开 0000 0011 0010 0000
CAN_F0R1: 100 0000 0  0x80
CAN_F0R2: 000 00 000  0x00
CAN_F0R3: 111 0000 0  0xE0
CAN_F0R4: 00000000   0x00
CAN_F0R5: 011 0011 0  0x66
CAN_F0R6: 00000000    0x00
CAN_F0R7: 011 0010 0   0x64CAN_F0R8: 00000000    0x00FSC00 = 0; FSC01 = 1; FMH0 = 1; FML0 = 0; FACT0 = 1;
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

 在以往的项目中用过多个品牌的单片机,包括国产的,一直感觉ST的滤波器设置比较麻烦,每次用到的时候都要花较长时间去回忆。

三、陀螺仪工作原理

陀螺仪,又叫角速度传感器,是用高速回转体的动量矩敏感壳体相对惯性空间绕正交于自转轴的一个或二个轴的角运动检测装置。

    同时,利用其他原理制成的角运动检测装置起同样功能的装置也称陀螺仪。

陀螺仪的名字由来

    陀螺仪名字的来源具有悠久的历史。

    据考证,1850年法国的物理学家莱昂·傅科(J.Foucault)为了研究地球自转,首先发现高速转动中地的转子(rotor),由于它具有惯性,它的旋转轴永远指向一固定方向,因此傅科用希腊字 gyro(旋转)和skopein(看)两字合为“gyro scopei ”一字来命名该仪器仪表。

    最早的陀螺仪的简易制作方式如下:即将一个高速旋转的陀螺放到一个万向支架上,靠陀螺的方向来计算角速度,简易图如下图所示。

嵌入式分享合集52_寄存器_08

 

    其中,中间金色的转子即为陀螺,它因为惯性作用是不会受到影响的,周边的三个“钢圈”则会因为设备的改变姿态而跟着改变。

    通过这样来检测设备当前的状态,而这三个“钢圈”所在的轴,也就是三轴陀螺仪里面的“三轴”,即X轴、y轴、Z轴

    三个轴围成的立体空间联合检测各种动作,然后用多种方法读取轴所指示的方向,并自动将数据信号传给控制系统。

    因此一开始,陀螺仪的最主要的作用在于可以测量角速度。

陀螺仪的基本组成

    当前,从力学的观点近似的分析陀螺的运动时,可以把它看成是一个刚体,刚体上有一个万向支点,而陀螺可以绕着这个支点作三个自由度的转动。

    所以陀螺的运动是属于刚体绕一个定点的转动运动,更确切地说,一个绕对称轴高速旋转的飞轮转子叫陀螺。

    将陀螺安装在框架装置上,使陀螺的自转轴有角转动的自由度,这种装置的总体叫做陀螺仪。

嵌入式分享合集52_运维_09

陀螺仪的基本部件有:

  • 陀螺转子(常采用同步电机、磁滞电机、三相交流电机等拖动方法来使陀螺转子绕自转轴高速旋转,并见其转速近似为常值);
  • 内、外框架(或称内、外环,它是使陀螺自转轴获得所需角转动自由度的结构);
  • 附件(是指力矩马达、信号传感器等)。

陀螺仪的工作原理

    陀螺仪侦测的是角速度。

    其工作原理基于科里奥利力的原理:

    当一个物体在坐标系中直线移动时,假设坐标系做一个旋转,那么在旋转的过程中,物体会感受到一个垂直的力和垂直方向的加速度。

    台风的形成就是基于这个原理,地球转动带动大气转动,如果大气转动时受到一个切向力,便容易形成台风,而北半球和南半球台风转动的方向是不一样的。

    用一个形象的比喻解释了科里奥利力的原理。

嵌入式分享合集52_陀螺仪_10

    具体来说,陀螺仪,是一个圆形的中轴的结合体。

    而事实上,静止与运动的陀螺仪本身并无区别,如果静止的陀螺仪本身绝对平衡的话,抛除外在因素陀螺仪是可以不依靠旋转便能立定的。

    而如果陀螺仪本身尺寸不平衡的话,在静止下就会造成陀螺仪模型倾斜跌倒,因此不均衡的陀螺仪必然依靠旋转来维持平衡。

    陀螺仪本身与引力有关,因为引力的影响,不均衡的陀螺仪,重的一端将向下运行,而轻的一端向上。

    而在旋转中,陀螺仪如果遇到外力导致,陀螺仪转轮某点受力。

    陀螺仪会立刻倾斜,而陀螺仪受力点的势能如果低于陀螺仪旋转时速,这时受力点,会因为陀螺仪倾斜,在旋转的推动下,陀螺仪受力点将从斜下角,滑向斜上角。

    而在向斜上角运行时,陀螺仪受力点的势能还在向下运行。

    这就导致陀螺仪到达斜上角时,受力点的剩余势能将会将在位于斜上角时,势能向下推动。

陀螺仪的作用

    这陀螺仪和重力传感器有什么区别呢?

    区别很多,但最大的区别就是重力传感对于空间上的位移感受维较少,能做到6个方向的感应就已经很不错了,而陀螺仪则是全方位的。

    这很重要,毫不夸张的说,这两者不是一个级别上的产品。

    可能看到这里,大家还是会觉得有些迷惑,既然陀螺仪很厉害,那么它在手机上到底有什么用呢?

第一大用途

    陀螺仪自被发明开始,就用于导航,先是德国人将其应用在V1、V2火箭上,因此,如果配合GPS,手机的导航能力将达到前所未有的水准。

    实际上,目前很多专业手持式GPS上也装了陀螺仪,如果手机上安装了相应的软件,其导航能力绝不亚于目前很多船舶、飞机上用的导航仪。

第二大用途

    可以和手机上的摄像头配合使用,比如防抖,这会让手机的拍照摄像能力得到很大的提升。

第三大用途

    各类游戏的传感器,比如飞行游戏,体育类游戏,甚至包括一些第一视角类射击游戏,陀螺仪完整监测游戏者手的位移,从而实现各种游戏操作效果。

第四大用途

    可以用作输入设备,陀螺仪相当于一个立体的鼠标,这个功能和第三大用途中的游戏传感器很类似,甚至可以认为是一种类型。

第五大用途

    未来最有前景和应用范围的用途,那就是可以帮助手机实现很多增强现实的功能。

陀螺仪的两大动力特性

    陀螺仪最主要的基本特性:

  • 定轴性(inertia or rigidity)
  • 进动性(precession)

    这两种特性都是建立在角动量守恒的原则下。

嵌入式分享合集52_服务器_11

定轴性(inertia or rigidity)

    当陀螺转子以高速旋转时,在没有任何外力矩作用在陀螺仪上时,陀螺仪的自转轴在惯性空间中的指向保持稳定不变,即指向一个固定的方向;同时反抗任何改变转子轴向的力量。

    这种物理现象称为陀螺仪的定轴性或稳定性。

    其稳定性随以下的物理量而改变:转子的转动惯量愈大,稳定性愈好;转子角速度愈大,稳定性愈好。

进动性(precession)

    当转子高速旋转时,若外力矩作用于外环轴,陀螺仪将绕内环轴转动;若外力矩作用于内环轴,陀螺仪将绕外环轴转动。

嵌入式分享合集52_运维_12

    如上图,是MEMS陀螺仪。

陀螺仪的应用

陀螺仪在航天航空中的应用

    陀螺仪器最早是用于航海导航,但随着科学技术的发展,它在航空和航天事业中也得到广泛的应用。

嵌入式分享合集52_寄存器_13

    陀螺仪器不仅可以作为指示仪表,而更重要的是它可以作为自动控制系统中的一个敏感元件,即可作为信号传感器。

    根据需要,陀螺仪器能提供准确的方位、水平、位置、速度和加速度等信号。

    以便驾驶员或用自动导航仪来控制飞机、舰船或航天飞机等航行体按一定的航线飞行。

    在导弹、卫星运载器或空间探测火箭等航行体的制导中,则直接利用这些信号完成航行体的姿态控制和轨道控制。

    作为精密测试仪器,陀螺仪器能够为地面设施、矿山隧道、地下铁路、石油钻探以及导弹发射井等提供准确的方位基准。

    由此可见,陀螺仪器的应用范围是相当广泛的,它在现代化的国防建设和国民经济建设中均占重要的地位。

陀螺仪在消费电子领域的创新应用

    陀螺仪的出现,给了消费电子很大的应用发挥空间。

    比如就设备输入的方式来说,在键盘、鼠标、触摸屏之后,陀螺仪又给我们带来了手势输入,由于它的高精度,甚至还可以实现电子签名;

    还比如让智能手机变得更智慧:除了移动上网、快速处理数据外,还能“察言观色”,并提供相应的服务。

嵌入式分享合集52_linux_14

导航

    陀螺仪自被发明开始,就用于导航,先是德国人将其应用在V1、V2火箭上,因此,如果配合GPS,手机的导航能力将达到前所未有的水准。

    实际上,目前很多专业手持式GPS上也装了陀螺仪,如果手机上安装了相应的软件,其导航能力绝不亚于目前很多船舶、飞机上用的导航仪。

相机防抖

    陀螺仪可以和手机上的摄像头配合使用,比如防抖,这会让手机的拍照摄像能力得到很大的提升。

提升游戏体验

    各类手机游戏的传感器,比如飞行游戏,体育类游戏,甚至包括一些第一视角类射击游戏,陀螺仪完整监测游戏者手的位移,从而实现各种游戏操作效果,如横屏改竖屏、赛车游戏拐弯等等。

作为输入设备

    陀螺仪还可以用作输入设备,它相当于一个立体的鼠标,这个功能和第三大用途中的游戏传感器很类似,甚至可以认为是一种类型。

    同时,除了我们熟悉的智能手机以外,汽车上也用了很多微机电陀螺仪,在高档汽车中,大约采用25至40只MEMS传感器,用来检测汽车不同部位的工作状态,给行车电脑提供信息,让用户更好的控制汽车。

四、HAL库实现自定义延时函数delay_us()

STM32程序从标准库移植到HAL库的时候,会发现HAL库中只有一个毫秒级延时函数HAL_Delay(),而没有微秒级延时delay_us(),本文就在HAL库中用定时器实现这个delay_us()。

    如下图,找到HAL_Delay()函数定义的地方,发现这个函数有__weak标识,是一个弱化函数,可以被重写。

嵌入式分享合集52_服务器_15

     由于HAL库许多地方都使用了HAL_Delay()函数,为了避免惹麻烦建议不重写,可以用定时器自己写一个延时函数。

    项目设置,勾选后每个外设的源文件.c、头文件.h分别成双出现。

嵌入式分享合集52_运维_16

     我用的是ISP编程,选择的是Serial Wire。

嵌入式分享合集52_陀螺仪_17

     配置外部高速时钟。

嵌入式分享合集52_寄存器_18

 为了观察效果,开一个LED,它在PC0管脚,低电平点亮。

嵌入式分享合集52_陀螺仪_19

    本实例用到了TIM7,它挂在APB1上,时钟为72MHz。

嵌入式分享合集52_服务器_20

     激活TIM7,设置如下:

  • 预分频PSC为71,分频后TIM7时钟为72/(71+1)=1MHz
  • 计数模式为向上
  • 计数周期为1,就是说定时器一个周期后就溢出了,而定时器一个周期的时间是定时器时钟频率的倒数,1/1M,也就是1us。
  • 嵌入式分享合集52_运维_21

  •  生成代码。
  • 嵌入式分享合集52_linux_22

  •  在tim.c的用户代码区添加如下代码。
  • 嵌入式分享合集52_运维_23

  •    在tim.h的user code处添加如下引用代码,其中HAL_Delay_us()是微秒级延时函数,HAL_Delay_ms()是毫秒级延时函数。
  • 嵌入式分享合集52_linux_24

  •  main.c中添加如下代码,测试效果。
  • 嵌入式分享合集52_寄存器_25

  •   上面代码连续用了13个延时函数,是为了凑够1秒方便观察。另外延时函数的参数是uint16_t,无符号短整型,数值范围为0~65535,数值超限会报错,如下图。
  • 嵌入式分享合集52_服务器_26

  •  编译代码。
  • 嵌入式分享合集52_陀螺仪_27

  •  下载到开发板可以看到LED每秒亮一次,STM32CubeIDE软件生成hex文件的方式。