快捷搜索:  汽车  科技

嵌入式开发知识更新慢(嵌入式开发实际理解到汇编这一层代码即可)

嵌入式开发知识更新慢(嵌入式开发实际理解到汇编这一层代码即可)若是对读者有益,那是极好,若是无益,权当督促自己思考学习!笔者希望督促自己一周写一篇类似的文章,分享自己的思考.文章相对比较长,字数比较多,大家可以先打开头像关注我,之后慢慢看,///插播一条:我自己在今年年初录制了一套还比较系统的入门单片机教程,想要的同学找我拿就行了免費的,私信我就可以哦~点我头像左下角黑色字体加我也能领取哦。最近比较闲,带做毕设,带学生参加省级或以上比赛///对于供电方案中的先升压再降压的方案,这是我做第一款四轴飞行器的时候发现的,这种1S的锂离子电池,在四个空心杯进行供电的时候,如果四个空心杯电机不带桨叶,也就是说没有负载,那启动是没有问题的。但是如果四个空心杯都带上负载,瞬间提速到满速,就会瞬间把电池输出电压拉低到3V以下,经过我测试甚至低到了2.8V,这时候如果不升压,直接用电池给LDO供电,那LDO就会失效。所以通过升压再降压后给单片机系统供电是一个可行的方案

STM32F103C8T6是ST在2007年发布的一款MCU,截止目前ST已经发布了速度高达400MHz的STM32H7 (这时候一定有人会说600MHz的事,我知道,不用提醒),我自己也是用STM32F1 STM32F4 STN32F7都做过各种各样的四轴,但是这个开源的四轴我还是选择了STM32F103C8T6,主要从三点考虑,一是封装比较大,方便初学者焊接,二是价格低廉,学习成本比较低,三是网上有大量的资料供初学者学习使用。

嵌入式开发知识更新慢(嵌入式开发实际理解到汇编这一层代码即可)(1)

姿态传感器选择MPU6050,主要考虑的也是封装比较大,可以直接使用烙铁焊接,而且价格比较低,资料也很丰富。而且还自带DMP库,可以完成姿态结算后直接把姿态角输出给主控芯片。2016年我们的第一款四轴就是采用DMP库输出姿态角的。

气压计使用的是FBM320 对于这款气压计,个人认为性能一般。但是优点就是这个封装和BMP280、SPL06的引脚都是兼容的,方便更换。但是小四轴上放气压计,有一个比较麻烦的地方就是要想办法排除桨叶的风对它的干扰。可以使用海绵等其他东西进行隔离。

无线芯片用的是SI24R1,国产的,之所以用这个而不用NRF2401,是因为这个经过我测试,性能也是可以的,引脚完全兼容NRF2401,无线发射可以做到7dB,在发射和接收端都采用陶瓷天线的前提下,可以达到50m的通讯距离。如果加上AP,那达到100米应该没有问题。通过两个低成本的0欧姆电阻对电源进行了单点接地,防止电机回路的电流波动串进射频回路对射频造成干扰。

嵌入式开发知识更新慢(嵌入式开发实际理解到汇编这一层代码即可)(2)

文章相对比较长,字数比较多,大家可以先打开头像关注我,之后慢慢看,///插播一条:我自己在今年年初录制了一套还比较系统的入门单片机教程,想要的同学找我拿就行了免費的,私信我就可以哦~点我头像左下角黑色字体加我也能领取哦。最近比较闲,带做毕设,带学生参加省级或以上比赛///

对于供电方案中的先升压再降压的方案,这是我做第一款四轴飞行器的时候发现的,这种1S的锂离子电池,在四个空心杯进行供电的时候,如果四个空心杯电机不带桨叶,也就是说没有负载,那启动是没有问题的。

但是如果四个空心杯都带上负载,瞬间提速到满速,就会瞬间把电池输出电压拉低到3V以下,经过我测试甚至低到了2.8V,这时候如果不升压,直接用电池给LDO供电,那LDO就会失效。所以通过升压再降压后给单片机系统供电是一个可行的方案。另一个方案就是在电机启动的时候采用缓慢启动的方式,这样电池的电压就不会瞬间被拉低,但是这样的一个不足之处就是无法让这个小四轴非常暴力,飞起来不够爽快。

嵌入式开发知识更新慢(嵌入式开发实际理解到汇编这一层代码即可)(3)

笔者希望督促自己一周写一篇类似的文章,分享自己的思考.

若是对读者有益,那是极好,若是无益,权当督促自己思考学习!

这周思考的主题是,分享一下我对“单片机是如何执行程序的”以及“封装”的理解。

1、单片机如何执行程序?

我原先对计算机是如何执行程序的非常的痴迷,希望能够明白最底层的道理,我在单片机这个设备上找到了一点影子。

对单片机执行程序的理解,我读了《汇编语言》这本书, 然后结合自己的思考。

我认为

程序执行 = 不停的写不同的寄存器。

嵌入式开发知识更新慢(嵌入式开发实际理解到汇编这一层代码即可)(4)

上一篇文章写道,嵌入式软件开发最一般的操作就是控制类似P0OUT这样与实际底层相关的寄存器。写嵌入式软件代码,实际上就是写一系列操作底层寄存器的语句。

一般会将P0OUT这样的寄存器映射到某一个地址上,这个地址是实际的寄存器物理地址。

在单片机通用的.h文件会给出他的物理地址定义。

例如,笔者使用的MSP430系列单片机,他在中就定义了各个寄存器的物理地址,此类文件一般由厂家提供。

#define P1OUT_ (0x0021u) /* Port 1 Output */
DEFC( P1OUT P1OUT_)

此段代码,定义了P11OUT关键词与0x0021u地址的联结。

那么,希望P1口输出全是高电平的C代码则为

P1OUT=0XFF;

那么汇编如何写呢?

# mov 00 ff 00 21

//把00ff数据移动到0021物理地址上

嵌入式开发知识更新慢(嵌入式开发实际理解到汇编这一层代码即可)(5)

于是此时的底层硬件会将00 ff 放入00 21为地址的寄存器中,此时三极管动作,切换底层硬件电路,实现需求功能。

(嵌入式开发实际理解到汇编这一层代码即可。再往下,那就是非常深奥的电路原理,即电路是如何做到把 ff移动到0021地址寄存器的,以及寄存器是如何工作的,等等这样的问题)

嵌入式软件开发还有一个最一般的操作--------数值的数学运算

那么数值的数学运算是不是也是对底层寄存器的配置呢

通过数字电路的学习,我学习到了加法器等逻辑电路,其底层的运算原理已经能和寄存器的知识联结了。

在计算机中有一个叫“算术逻辑单元”的概念

算术逻辑单元_百度百科

这个单元算是把很多算术电路整合在一起了。我们可以通过操作寄存器来使用它。

例如 加法操作,a b 以及返回结果 c

定义 a 的物理地址为 0x0000

b 的物理地址为 0x0001

C的物理地址为 0x0002

那么

#mov a 0000 //把数据a放入 0000
#mov b 0001//把数据b放入0001
#read c 0002 //读取0002寄存器的数据放入c中,这里的read指令是我瞎写的,汇编一定有这样的指令

嵌入式开发知识更新慢(嵌入式开发实际理解到汇编这一层代码即可)(6)

于是c就是加法器的结果输出 得到输出,完成了计算。

嵌入式软件开发还有一个最一般的操作--------数值比较,参考数字比较器的逻辑电路原理

对应程序中的if操作,比较a与b的大小。

例如,if(a>b) 语句,或者 if(a)语句,实际都是把a和b放入数字比较器的两端,获得比较器的输出!

数字比较器

于是嵌入式软件最基础的三个操作(算术运算、硬件电路切换、数值比较

)都是对寄存器的操作。

所以我得出结论,计算机的程序执行,就是不停的写入寄存器数据,并且取出寄存器值得过程。

嵌入式开发知识更新慢(嵌入式开发实际理解到汇编这一层代码即可)(7)

对单片机感兴趣的朋友可以找我,我录制了一些关于单片机的入门教程,有需要的童鞋找我拿就行,免费的,私信我“林老师”就可以拿~点击打开我的头像就能领取

猜您喜欢: