果果小师弟

其他

一位嵌入式工程师,硬核单片机编程思想

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!摘要:没有思想的裸程序就如一副人体骨架,有个人形,但没有人样,骨骼之间的关节都是靠胶水或拉线连接起来的,生硬而呆板。如果给骨架包上皮肉,加上灵魂,我们就会惊叹:啊!这是帅哥,这是美女!因为骨架活了。一、裸编程是什么?先声明一个概念,裸编程,指的是在裸机上编写程序,裸机,在单片机领域就是指带着硬件的单片机控制系统,不要想歪咯。在裸机上编程,就犹如在一片荒地上开垦,任何一锄头下去,都会碰到硬生生的石头,要说做这有什么味?拓荒者追求的是来年的绿洲。而我们这些开垦裸机的所谓的工程师们追求的是什么?我们当然追求的是完成一个任务。我们一般都自称是高级知识分子,那么我们在拓荒的过程中应该想些什么?当然不是想着如何把任务完成,而应该首先想着我们在想些什么。绕了是不?绕了就对了,这一绕就绕出了思想。思想是一个简单的人在一个复杂的环境里做任何事情的统帅,它影响着一个拓荒者人生的每一个细节,当然也包括裸编程本身。当一个人拿着锄头,一锄又一锄,汗滴脚下土的时候,我们能知道他们在想什么吗?当然这不好说,如果自己去锄就知道了。但是大抵也差不多,随便举几个吧:这太阳他娘的怎么这么毒?这石头他娘的咋这么多?这地种什么最好?这还有多少天能搞完?这样干太慢了,要是有台机械搞多好。当然这只是一部分,任何人可以想出很多想法来。那么当我们在裸机上拓荒的时候,我们该想些什么?也许我们一般的想法是:先把一个简单的功能做了,先把一个重要的功能做了,今天终于把这个功能调试好了明天可以做下一个功能了,这个为什么不是我想象的那样的结果?真是莫名其妙!也等等一下吧。如果拿来一个任务,搭好测试平台就开始做程序,想着一个功能一个功能的凑完,然后就自我陶醉着成功的喜悦,那这样做程序,基本就叫做没思想。有思想的做程序,是不能一下去就堆积源码的,因为那样只会让一堆生硬的数字怯生生的挤在一起,不管他们有没有多余,有没有矛盾。所以写源码之前,是要想想如何写的。也许很多人在写之前都想过类似的问题,比如把任务模块化后再组织程序。但是这样的想法只是任务上的事情,而并不是裸编程时的思想,裸编程的思想,应该是在组织任务模块过程中及编写裸程序时影响源码组织的指导思想,它直接决定着源码的质量。一个数据结构,一个模块形成,一个单片机的指令,一个硬指令的运行机制,一个口线的驱动方式,一个中断的顺序,一个跳变的延迟,一个代码的位置,一个逻辑的组织,一个模块与模块之间的生(运行时的状态)死(不运行时的状态)关系等等,都是裸程序思想的组成部分。这似乎很琐碎,但是裸程序原本就如此,它不同于上位机程序,有一个强大完善的操作系统支持。单片机里不可能植入操作系统,那样做就变味了,可不要有人跳出来说,某某某单片机就有操作系统了。裸程序就应该是建立在赤裸裸的硬件基础上的程序,只有有用的功能才有代码,裸程序的质量也许经常在应用中感觉不出来,也许你做和他做都能实现功能,但是好的裸程序有良好的可扩充性、可维护性,系统具有高稳定性和高性能。而追求这种高品位的技术境界,就必须要有好的思想来指导。是不是看着有些迷糊?别说看得迷糊,我说都说迷糊了,总的来说,就是把一个优秀的灵魂,植入你的源码中,让你的源码具有一个优良的思想。二、裸编程具体做法前文说到裸编程要有思想,也许还不够具体,接下来就是要具体说裸编程的思想的具体做法。没有思想的裸程序就如一副人体骨架,有个人形,但没有人样,骨骼之间的关节都是靠胶水或拉线连接起来的,生硬而呆板。如果给骨架包上皮肉,加上灵魂,我们就会惊叹:啊!这是帅哥,这是美女!因为骨架活了。裸程序也一样,如果按传统的思维方式说这样就足够了,那么裸程序就形如骨架,通常只是一些功能的粗糙堆砌,也只会叫后人看了说这程序垃圾,而后人再做也未必能跳出这个圈子,那么后后人看了又叫这程序垃圾,如此下去,代代相传,传了什么?传了一个总被叫垃圾的东西:无思想的裸程序。我做了程序好多年,也思考了编程好多年,不断的经验积累告诉我:写好的程序不是如何去完成代码,而是如何去组织代码。上位机中面向对象的编程思想,就是一个非常可取的思想。面向对象的编程思想在上位机中是有一个非常丰富的开发包和功能强大的操作系统支持的,裸编程如何引入这样的思想呢?也许很多人会觉得不可能。其实,没有什么是不可能的。再复杂的思想,最终都会归结到汇编,归结到裸程序,我们的单片机程序,正是一种裸程序。只是在单片机编程时和微机编程时我们站在开发平台上的高度不一样,而已!对这个高度的理解,也许很多人很困惑,因为我们平时很少注意它们,那么这里我就举个其他的例子来说明,尽管和裸编程好象不很相关,但是这个例子里的高度概念十分清晰。我们知道网络传输标准层次有七层:应用层、表示层、会话层、传输层、网络层、链路层、物理层,这么多层做什么用?也许理解这样分层的概念也十分辛苦,但是理解这样分层的思想,就容易多了,而且这也是我们硬件工程师们最应该借鉴的思想,让我们的硬件设计更具有标准性和前瞻性。这个七层的思想从根本上讲就是将一个网络传输产品细化,让不同的制造商选择一个适合自己的层次开发自己的产品,层次不一样,他们所选择的开发基础和开发内容就不一样,高一层开发者继承低层开发者的成果,从而节省社会资源,提高社会生产力。对这个指导思想我就不赘述了,各位自己去理解,这里要说的是,微机上的面向对象编程思想就是如同在应用层上实现的思想,而裸程序的面向对象思想则如同在链路层上实现的思想,他下面没有软件开发包,只有物理构架。但是在应用层上实现的思想,最终都要翻译到物理构架上。看懂了上面的例子,就一定明白,裸程序的面向对象思想,是可以实现的,只是难度要大得多,理解要难得多。但是这不要紧,这正是软件水平的表现,你喜欢技术,又何惧之?其实也不会难到哪里去,只是把做事情的方式稍微改变一下而已。传统上我们都喜欢用功能来划分模块,细分任务,面向对象思想不这样。面向对象思想则是先从一个任务中找出对象,在对象中搀杂些模块等来实现功能的。这就是两种风格截然不同的地方。比如我们要让我们的单片机把显示信息输出到显示器,那么传统的分析方法是信息格式化、格式化数据送显示器显示,似乎这样也就足够了,不同的显示器用不同的送显示程序或者程序段,配置不同的变量,能共的共起来,不能共的分开。但是面向对象的思想不是这样做的,而是首先把显示器当作一个对象,该对象具有一些功能和一些变量属性,不同的显示器在对象中使用相同的代码标识,如函数指针(C语言中),这样对于任何一个不同的显示器,在调用时都使用同样的代码。也许有人说,传统的做法这样也可以做呀,为什么要弄得罗里吧唆的呢?其实不然,使用了正确的思想的好处在前头已经说了好多了,如果还模糊就上去再看一次。说了那么多理论,现在就说些具体的做法吧。以KeilC为编译环境来说说一个对象具体组织的一些做法。首先是找出对象,如显示器,这就是一个典型的对象。其次是分析一个活对象所应具有的基本特征,即属性与动作。显示器的属性如:类型代号、亮度、对比度、显存等,动作如:初始化、内容刷新和显示、开启和关闭、内容闪烁等花样显示等。这样分也比较容易理解,下面是对于代码的组织上,要注意对象的独立性与完整性,首先把显示器对象单独放在一个文档上,属于对象特有的变量与对象的定义放在一起,要区分公有变量与私有变量的定义方式,对于私有变量要考虑临时变量与永久变量的安排,这些安排都是对变量生命期的严格确定,这样可以节省内存,避免混乱。如某一个函数要使用一个变量,函数在调用完了就退出了,而有一个变量只有它使用,却要保存每一次调用函数所产生的结果,这样的变量怎么定义呢?很多人会直接定义一个全局变量,但是一个好的做法是把这个变量定义成该函数的局部变量,但是定义成静态的,那么这样这个变量对其他代码就是透明的,完全不可能会被误修改,而且代码分类性好,便于将来的维护。用函数指针来统一不同类型的显示器不同的处理方式,也是一个很好的处理办法,那样可以让具体处理方式千差万别的显示器都能用一个统一的对象,但是函数指针要慎重使用。好了,说长了我就头晕,不说了,思想的精华,不必有一样的形态,不同的人会有不同的理解,我只希望能给大家的程序生涯抛砖引玉,我就觉得很有成就感了。三、准备工作本文在此引用一个例子。在引入例子之前,我们要做一些准备工作,然后一步一步地走向例子里去。就以前面帖子提到过的显示器控制为例。显示器就是一个对象。无论它是功能多么复杂的显示器,或者功能多么简单的显示器,对于需要显示信息的调用者来说,都并不重要,也就是说对于需要使用显示器的主体来讲,他只管显示信息,不管显示器的千差万别,只要显示器提供了某功能,它可以调用就行,调用前当然要遵守显示器的数据传递规则,但是不必考虑不同的显示器所产生的传递规则的差异。也就是说,对于调用者来说,永远不会希望有多条规则来让自己的调用代码变复杂。因此,我们首先需要构造一个相对独立的代码段,也就是显示器对象,以下都以KeilC作为裸程序的编译环境。正如很多人说的,KeilC并不是OOP语言,那怎么做?正是因为我们认为KeilC不能做,所以我才把这种思想拿出来与大家探讨,让我们的程序变得更精彩,更有技术含量。形成一个独立代码段,最好的办法就是在主工程目录下建立一个子目录,如DISPLAY,然后再在DISPLAY目录下建立一个文档,如DISPLAY.H,然后把DISPLAYDISPLAY.H文档#include到一个恰当的位置上,这样,一个独立的面向对象的代码段就初步形成了,以后维护代码的时候,你永远不要考虑调用者是什么感受,只要维护这个文档,就可以保证你对显示器的不断更新了。很多人也许会说,这算什么OOP?大家先别着急,这才是个开始,下面才是组织代码的具体过程。对于一个显示器,我们必须要有显示要求,我们才会去定制它,如果连使用要求都提不出来,就不要去让人为你做显示器。所以我们首先要明确我们要的显示器必须要做什么。由于是单片机控制的显示器,我们不能想象成微机显示器那样,一个大的显存,可以显示多少页,显示多少色,满屏满屏的传递数据,如果这样想了,就是犯了盲目例比的错误,说明对问题没研究透。对于单片机控制的显示器,我们考虑能显示单个字符、单行显示,就基本足够了。所以我们可以定义下列两个对象功能:dispShowAChar();//显示一个字符dispShowALine();//显示一行字符由于是单片机的裸系统,所以我们作为一个软件设计者,我们一定要清楚,我们所面对的显示器,经常是没有CPU的,所以我们一定要明白,我们这两个函数,实质上都做些什么。很显然,这两个函数是不能长期占有CPU的,否则我们的程序将什么都不能做,专去显示了,成了显示器的一个处理芯片,所以这两个函数运行完后是肯定要退出来的,而显示不能中断呀,所以必须要有一个代码段一直存在于活动代码中而且不能影响其他的功能。做过上位机程序的人应该能看出来,这段代码就是线程。裸编程中我们也用这个概念。我们的显示器对象正需要一个一直活动的线程,来完成单片机系统对显示功能的解释和执行,因此dispShowAChar()和dispShowALine()实质上是不能直接去做显示工作的,它俩最合适的工作,就是去按指定的格式去设置显示内容,这样我们在使用的时候就不必在这两个函数里设置复杂的代码和嵌套调用关系,因为那样一定会浪费很多的代码,调用多了也会让单片机运行效率降低,硬件资源消耗增加,严重的可能会造成堆栈溢出最后还不晓得为什么。让我们也为这个活动线程也先命个名吧:dispMainThread();//按指定的要求执行显示功能//指定的要求包括颜色信息、闪烁、游动等等程序分析下去,引出的概念也就会越来越多,这里所说的多线程概念以后有机会再说,单片机里的多线程也是一个复杂罗嗦的处理问题,现在介绍还为时过早。只是我感觉一不小心又说长了,具体下文继续展开。四、展开思想对于对象能力的定义,我们一般可以从重要的入手,然后慢慢地展开,把所需要的其他能力逐渐归纳为函数,从而把面向对象的思想发展下去。上文我们提到了三个函数是怎么来的,还没有涉及到函数的任何实质,那么本帖就探讨一下这三个函数的实质性规划与设计。有了功能要求,我们就要实现它,在裸程序中,实现它的一个首要任务,就是要进行数据传递方式的设计。很显然我们必须要有一个显示区域,来存放我们所要显示的内容,以及显示内容的显示属性,我们还要规划这个显示区域到底要显示多少多少字符或者是点阵。但是由于我们事先并不知道我们的显示设备一次会提供多少显示量,所以我们可以把显示区域的内存,也就是显存,定义得大一点,以至任何一款符合设计要求的显示器都能得到满足,这样的做法在裸编程中其实还是比较实用的,因为裸编程中我们很少去申请动态的空间,程序设计完,所有的变量位置皆已确定,行就行,不行编译就过不去,所以我们可以通常选择一些内存资源比较丰富的新款单片机。但是这样的做法也有一个弊端,比如当我们预先估计不足而导致数据空间不够的时候,我们就得从头来改这个显存的大小,从而导致整个显示程序都要相应的产生一些变动,这还不是最糟糕的,最糟糕的是当一款新的显示器因为新的功能需求而导致数据结构需要发生变化的时候,我们就崩溃了,前期的工作可能改动就非常大,甚至于都要重新过一遍,也就是重写重调,这么痛苦的事情,我是最讨厌的了。所以我们要尽量避免这类事情发生,这里对面向对象的思想,就颇为需求了。这个时候,我们就要引入一个新的概念,那就是对象的儿子,子对象。前面讨论的,其实都只是一个抽象的对象,没有任何具体的样子,而只是笼统的规划了所有的显示器必须具有什么能力,而对于每一个具体的显示器来说,还没有任何具体的设计,在这里,每一个具体的显示器,就是显示器对象的子对象,他们形态各异,但是都必须能完成规定的功能。以传统的OOP语言理论来说,这里就产生了一个继承的关系,但是在裸程序思想里,我并不赞成引入这个概念,因为传统的OOP语言里的继承,纯粹是一个语法上的逻辑关系,继承关系明确,而裸程序中的这个思想,并没有任何语法支持,继承关系就非常微弱了,还不如说是归类与概括。但无论是什么关系,我还是不想就这种一目了然的关系弄个新名词来,让看的人费解。既然引入了子对象,我们能看出这种做法有什么实际意义吗?也许有经验的资深程序员能看出来。我们在做父对象数据设计的时候,我们并不规定具体的数据格式和显存大小,而是一股脑儿地全推给子对象自己去搞,父对象什么都不管。哈哈!这样做事情真是很简单吧?不是我的事情我不管,不要说我偷懒,因为站在父对象的角度讲,这是最明智的做法,因为管不了,所以不管。到这里也许就会产生更多的疑问了,一个对象什么都不管,那作为调用者怎么使用这个对象呢?你想用它,它什么都不管,这怎么行呀?别着急,父对象不管的,是那些具体的事情,抽象的事情,还是管的,要不然它就没有理由存在了。你抱怨了,说明你在思考,既然思考了,就把思考的问题提出来,提出来的,就是我们设计父对象的依据。提问题,我想这比搞程序要简单得多,比如:显示器能显示多少乘多少的字符?颜色是多色还是单色?显示模式是否支持预定的方式(如移动、闪烁等)?工作模式是图像还是字符?等等,这里附加说明一下,对于显示模式,我们这里都以字符显示为例,既然是面向对象的思想,相信扩充出图像显示模式,还是很容易的事情。有问题出来了,我们就继续为它添加代码好了。dispGetMaxCol();//取一行最多有多少列dispGetMaxRow();//取显示器一共有多少行dispGetMaxColors();//取显示器最多有多少色dispSetShowMode();//设置显示的方式,对于不支持的显示方式就自动转为正常显示dispSetWorkMode();//设置工作模式,如果没有的模式就返回0,支持的就返回1
2022年1月15日
其他

令人惊叹的焊接艺术品,这脑洞,大开眼界

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!小立方体卫星一个基于ATtiny45微控制器的小立方体由超级电容供电,并由几个太阳能电池充电。原理图非常简单。使用ATtiny85微控制器的内部1MHz振荡器,因此无需任何外部振荡器电路。太阳能电池串联连接,并通过反向电流阻断二极管馈送到系统。二极管还有助于降低电压,为超级电容器安全充电。在明亮的阳光下,太阳能电池产生足够的电流来为电容器充电并为系统供电。一个充满电的超级电容器应该能够保持系统运行几天。通过测量太阳能电池两端的电压,仅在LED超过低阈值时闪烁,使行为在夜间活动。使系统运行时间长的关键是利用ATtiny微控制器的低功耗模式。可以禁用所有不必要的内部外围设备,并在闪烁之间将设备置于深度睡眠模式。您可以将平均电流消耗从10mA降至230uA。该器件在睡眠时仅消耗约4.84uA(3.8VDC时)的电流!可以通过在闪烁之间使用更长的时间段、修改闪烁模式以及增加LED的限流电阻值来进一步降低平均电流。Arduino
2022年1月10日
其他

元旦节!我把博客网站部署到了树莓派上面

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!摘要:同学手头有一块树莓派4B,为了不让他的树莓派闲着,元旦节晚上,我把它拿了过来做一个网页服务器,挂载上了我自己的个人网页,很nice!树莓派4B开发板1.服务器框架配置树莓派网页服务器前首先要了解一下整体的框架,然后按照框架的内容进行服务器配置,这里我做了一个框图方便大家理解搭建树莓派网页服务器需要的步骤。具体框架主要是以下几个部分:本地PC端:首先要在本地PC端建立一个Git仓库,安装Hexo相关依赖,使用Hexo生成静态网页代码,然后通过Git上次传到远程仓库。Hexo是一个基于nodejs
2022年1月4日
其他

2022第一篇文,全能终端神器MobaXterm

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!摘要:现今软件市场上有很多终端工具,比如:secureCRT、Putty等等。secureCRT其实也是一款很强大的终端工具,但它是收费软件,一般公司不允许使用。Putty,非常小巧,免费软件,但是不支持标签,开多个会话的话就需要开多个窗口,窗口切换不方便。这两个软件的界面都不太美观。今天介绍的是一款集万千于一身的全能型终端神器—MobaXterm!这款神器的优点:支持SSH,FTP,串口,VNC,X
2022年1月1日
其他

双核A7+单核M4的STM32MP157到底值不值得入手?开箱~

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!摘要:2007年6月,ST在北京发布了全球第一款基于ARM-Cortex-M3内核的32位通用微控制器芯片STM32F103。2019年ST推出了STM32家族首款Cortex-A内核、可运行Linux系统的STM32MP1系列MPU,将STM32家族推向了一个新的高度!作为初学者我该不该入手STM32MP157开发板呢?STM32的优异性体现在如下几个方面:1、超低的价格。2、超多的外设。3、丰富的型号。STM32仅M3内核就拥有
2021年12月30日
其他

我在STM32单片机上跑神经网络算法

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!摘要:为什么可以在STM32上面跑神经网络?简而言之就是使用STM32CubeMX中的X-Cube-AI扩展包将当前比较热门的AI框架进行C代码的转化,以支持在嵌入式设备上使用,目前使用X-Cube-AI需要在STM32CubeMX版本5.0以上,支持转化的模型有Keras、TFlite、ONNX、Lasagne、Caffe、ConvNetJS。Cube-AI把模型转化为一堆数组,而后将这些数组内容解析成模型,和Tensorflow里的模型转数组后使用原理是一样的。一、环境安装和配置STM32CubeMXMDK/IAR/STM32CubeIDEF4/H7/MP157开发板二、AI神经网络模型搭建这里使用官方提供的模型进行测试,用keras框架训练:https://github.com/Shahnawax/HAR-CNN-Keras模型介绍在Keras中使用CNN进行人类活动识别:此存储库包含小型项目的代码。该项目的目的是创建一个简单的基于卷积神经网络(CNN)的人类活动识别(HAR)系统。该系统使用来自3D加速度计的传感器数据,并识别用户的活动,例如:前进或后退。HAR意为Human
2021年12月19日
其他

手把手教你写函数指针与回调函数

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!摘要:前面分享了关于指针和结构体使用过程,今天是同系列的函数指针和回调函数。函数指针是指向函数的指针变量。通过函数指针C语言可以实现各种强大的功能与设计方法。而回调函数是函数指针最常见的用途,是C语言的重中之重,也是C语言面试当中的必考知识点和难点。在我们平时开发STM32或者其它单片机时,我们经常都会用到原厂提供的固件库函数,固件库函数中有非常多回调函数。那么什么是回调函数呢?回调函数是作为参数传递给另一个函数的函数。接受回调作为参数的函数预计会在某个时间点执行它。回调机制允许下层软件层调用上层软件层定义的函数。应用程序代码和硬件驱动程序之间的交互硬件驱动程序是一个独立的可重用驱动程序,它不了解上面的层(用户应用程序)。硬件驱动程序提供API函数,允许用户应用程序将函数注册为回调。然后,此回调函数由硬件驱动程序作为执行的一部分进行调用。如果不使用回调,就会被编码为直接调用。这将使硬件驱动程序特定于特定的高级软件级别,并降低其可重用性。回调机制的另一个好处是,在程序执行期间可以动态更改被调用的回调函数。一、函数指针函数指针,顾名思义它就是一个指针,只不过它是一个函数指针,所以指向的是一个函数。类比一般的变量指针,指针变量,实质上是一个变量,只不过这个变量存放的是一个地址,在32位单片机中,任何类型的指针变量都存放的是一个大小为4字节的地址。int
2021年12月15日
其他

为了帮助学生学习计算机架构和工作原理,布里斯托大学制作了一台16位计算机

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!摘要:国外一大学制作16位计算机平台,100多个逻辑电路板组成,只是为了为了帮助学生学习计算机架构和工作原理。它是由布里斯托尔大学计算机科学系的学生和工作人员设计和建造的。这台巨型机器位于Merchant
2021年12月10日
其他

高质量代码是怎么写出来的?串口环形队列

}4、将数据压入FIFO什么时候要将数据压入FIFO?当然是在向串口发送数据的时候将数据压入FIFO去啦,这里面的逻辑也很简单就是将要发送的数据压入FIFO缓冲区,之后打开发送中断就可以了。void
2021年10月17日
其他

一个人,一条龙,一台“达芬奇”机械臂

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!摘要:前几天野生钢铁侠、B站科技区顶流UP、栈溢出工程师稚晖君更新了视频,四个月时间一个人做了一台类似达芬奇的机械臂。朋友圈也几乎被稚晖君的视频刷屏了。其实视频已发布就第一时间看完了(特别关心),直到今天准备写这个的时候又看了一遍,做为一个搞嵌入式的小小UP佩服的五体投地。不管内行人还是外行人看完都很佩服!任总在今年华为中央研究院创新先锋座谈会上与部分科学家、专家、实习生的讲话中关于对90后、95后的人才来说,兴趣带来的内在驱动力超过外在激励的驱动力。能不能在工作当中给他们更多自主权,让他们基于自己的兴趣发挥出更多的创造力,可能会产生意想不到的创新和价值?提问回答道:对于2012实验室,公司从未给过你们过多约束。比如,有人研究自行车的自动驾驶,公司没有约束过他。我们要生产自行车吗?没有啊。这是他掌握的一把“手术刀”,或许以后会发挥什么作用,产生什么巨大的商业价值。(现在知道说的是谁了吧)对嵌入式有点了解的,会觉得恐怖和不可思议。以下就是本次稚晖君这个业余项目,所用到的技术,整理了一下,除了其中关于单片机主控部分有一点了解之外,其他的真的是看不懂啊,太菜了!Dummy机械臂建模,算法,电路设计,驱动设计,APP开发等等,这每一个细节都是一个人完成的,每一个技术都需要学习和实践很久很久。电子基础,电子元器件选型,电路原理图设计,高速电路PCB设计,电子元器件焊接技术,电路板调试,启动程序UBOOT裁剪移植,linux内核裁剪移植,文件系统,底层驱动程序(C语言,ARM架构汇编,linux内核架构),上层应用程序(C++、Qt、JAVA、Python等,深度学习,机器学习,OpenCV,神经网络,自然语言处理),静态博客服务器搭建,高等数学,线性代数,概率论,离散数学,3D建模,3D打印,雕刻机,视频拍摄后期制作,防脱发技术。欣赏一波无水印美图,全部来自B站稚晖君视频截图。AD用过好像看到了NRF24L01。科技感十足!关于作品的本身就不过多介绍了,点击文末阅读原文可移步至B站。这台小型高精度
2021年10月10日
其他

一个学妹写的按键检测函数把我秀翻了!

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!摘要:今年实验室来了三个学妹,其中一个学妹以前是物联网专业的,进了实验室老师二话没说:先把STM32单片机过一遍,有啥问题就找小师弟。还好单片机小师弟会玩一点点,玩的也不好,所以一起学习吧!上来第一个例程就是使用按键点亮一个LED灯,好家伙。点灯小师弟比较在行,毕竟32、FPGA、Linux的小灯都被小师弟点了一遍。哈哈哈!所以今天还是来说一说按键检测吧!一、如何进行按键检测检测按键有中断方式和GPIO查询方式两种。推荐大家用GPIO查询方式。1.从裸机的角度分析中断方式:中断方式可以快速地检测到按键按下,并执行相应的按键程序,但实际情况是由于按键的机械抖动特性,在程序进入中断后必须进行滤波处理才能判定是否有效的按键事件。如果每个按键都是独立的接一个
2021年10月4日
其他

干货|教你使用Doxygen制作漂亮的程序文档

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!摘要:不知道大家有没有把自己的代码整理成文档的习惯,有没有给自己的代码一个非常漂亮的注释,就像下图这样。8051-ELL库如果你写了一个结构体或者枚举是否也是这样注释的?8051-ELL库如果每个人的注释都是这样写的话,被人怎么可能看不懂你的代码?如果你不是这样的话,你就必须要看这篇文章了。等等,别走!还有~你是不是也看过很多说明文档,比如下面这样的关于STM32标准外设驱动文档。你有没有想象过自己的代码也是可以这样打包成这样一个非常漂亮的文档的?STM32F10x_StdPeriph_Driver_3.5.0(中文版).chmSTM32F10x_StdPeriph_Driver_3.5.0(中文版).chm今天就教大家如何给写注释,如何写出漂亮规范的注释,让人看着心旷神怡,透人心脾。如何写出规范的说明文档,让人看了直呼内行,给你点赞!Doxygen能将程序中的特定批注转换成为说明文件。它可以依据程序本身的结构,将程序中按规范注释的批注经过处理生成一个纯粹的参考手册,通过提取代码结构或借助自动生成的包含依赖图、继承图)以及协作图来可视化文档之间的关系,Doxygen生成的帮助文档的格式可以是CHM、RTF、PostScript、PDF、HTML等。微软出品的HTML
2021年8月18日
其他

精选|公众号原创图文汇总

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!摘要:公众号到现在已经陆续更新100多篇原创图文了。今天汇总一下原创图文,一来方便自己查看,有些知识一旦很长时间不用,会很容易忘掉。二是希望能帮助到更多的小伙伴,祝大家学有所成,学的开心。手把手系列干货|手把手教你做一辆迷你平衡摩托车干货|手把手教你制作炫酷的PCB板3D爆炸图干货|手把手教你VSCode搭建STM32开发环境干货|手把手带你搞懂Modbus通信协议干货|手把手教你写一个串口调试助手干货|手把手教你制作一个示波器干货|手把手教你自制轮式机器人干货|手把手教你自制六足仿生机器人工具|手把手教你在VSCode中使用Git干货|手把手教你写单片机的结构体干货|手把手教你写单片机的指针干货|手把手教你写一个安卓app干货|手把手教你在显示设备上制作一个菜单干货|手把手教你用蓝牙模块开源|手把手教你造一个火星车开源|Qt
2021年8月6日
自由知乎 自由微博
其他

干货|STM32基础知识—内存映射

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!摘要:要想把STM32单片机学好,芯片的内部结构就要必须搞清楚。所谓基础不牢,地动山摇。今天带大家来看看STM32F429的Memory
2021年7月28日
其他

VOFA+|一款最直观、灵活、强大的插件驱动高自由度的上位机(文末有福利)

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!摘要:今天给大家安利一款最直观、灵活、强大的插件驱动高自由度的上位机VOFA+,作者想向大家传达VOFA+的愿景:在与电气打交道的领域里,如自动化、嵌入式、物联网、机器人等,都能看到VOFA+的身影。同时寓意每一位使用VOFA+的工程师,都可以站在巨人的肩膀上不断创新和探索。为什么叫VOFA+?Volt/伏特、Ohm/欧姆、Fala/法拉、Ampere/安培,是电气领域的基础单位,与他们的发明者——4位电子物理学领域的科学巨人,分别同名。他们的首字母共同构成了VOFA+的名字。设计理念在嵌入式硬件的调试中,尽管效率低下,工程师们还是十年如一日地使用着串口助手、超级终端这种命令行风格的数据收发工具,对硬件进行调试。以下几个原因限制了硬件工程师在调试中使用图形界面:对于硬件IO,直接输出字节流,编程难度最低;如果使用功能相近的行业专用上位机来进行图形化,需要处理复杂的协议;为了一个临时的调试需求,开发专用上位机,工作量大,得不偿失;工程师同时懂硬件、又懂软件,可遇不可求。VOFA+特点概览平台支持:Windows、Linux、MacOS;接口支持:串口(超高波特率,稳定支持)、网口(TCP客户端/服务端,UDP);协议支持:协议为插件,已开源,人人可编写。目前已支持CSV风格的字符串协议,和十六进制浮点数组形式的字节流协议;控件支持:控件为插件,已开源,人人可编写。目前已支持波形图、按钮、状态灯、图片、滑动条、3D立方控件(可更换模型)等;2维度与3维,一个也不能拉下;自主研发的波形控件,支持每通道百万采样点的绘制,性能强劲;自主研发的波形控件,无缝嵌入了实时直方统计和点数可设置的傅里叶变换,可以使用VOFA+进行数据分析。传统字节流收发调试功能依然支持;拖拽方式添加控件,交互流畅自然;快捷的命令、参数绑定系统,发送指令同样优雅。1、串口调试如果只是想将本软件当成串口助手使用,选择RawData协议,可以保证接收到什么打印什么;RawData模式1、选择调试方式、irewater协议引擎,并设置好参数。2、打开串口,点击右上方的按钮。3、单纯的发送数据RawData协议适用于不需要解析数据,仅仅查看字节流的需求,做采样数据解析,RawData不做采样数据解析,接收到什么字节,便一五一十打印什么数据。Firewater模式本协议是CSV风格的字符串流,直观简洁,编程像printf简单。但由于字符串解析消耗更多的运算资源(无论在上位机还是下位机),建议仅在通道数量不多、发送频率不高的时候使用。1、选择调试方式、irewater协议引擎,并设置好参数。2、打开串口,点击右上方的按钮。3、数据格式解析如果想要显示波形图,发送给上位机的格式需要按照特定的格式来写。":ch0,ch1,ch2,...,chN\n"any和冒号可以为空,但换行(\n)不可省略;any不可以为"image",这个前缀用于解析图片数据;此处\n为换行,并非指字符斜杠+字符n;\n也可以为\n\r,或\r\n。发送2个曲线的数据长这个样子"zhiguoxin:
2021年7月24日
其他

一位业余爱好者花两年时间完成的STM32H7掌上电脑(软硬件开源)

1、项目背景幼儿时期,还记得一个孩子用泡沫、马达和电池做了一艘电动快艇在河里转着圈圈,泛起的淡淡涟漪让我心潮起伏,驻足河边流连忘返。童年时期,一盒四驱车,让我体验到了毫不起眼的小零件可以组装出这么一台强劲的四驱车。再后来,小霸王学习机风靡时期,经常赖在大孩子家看着别人打游戏自己也感到无比兴奋。初中时期,受风靡一时的文曲星、步步高电子词典中“英雄坛说”、“伏魔记”、“魔塔”带来的深深痴迷,孩提时代就梦想着自己有一天能亲手打造一台硬件软件全自主设计的掌机。这个梦伴随着我的成长,让我在大学时代选择了研究电子电路设计、PCB
2021年7月22日
其他

手把手教你使用QT绘图控件QCustomPlot绘制波形图

摘要:很多小伙伴问如何把串口接受到的数据通过曲线显示出来,其实这是用一个叫做QCustomPlot的控件,这个控件不是QT自带的,需要自己下载加入,今天介绍一下这个控件的使用方法,并附源码。QCustomPlot简介QCustomPlot是开源的Qt的第三方绘图库,QCustomPlot的源码只有两个文件,可以很方便的添加到自己的工程中。QCustomPlot库很强大,利用他可以轻松实现柱状图、折线图、多轴、日期轴、金融图等,在其基础上,可以轻松实现曲线的平移、放大、取值、标记等功能,利用其预留的接口,自己可以派生类,随意定制自己的功能。QCustomPlot库效率高、移植方便,可轻松实现二次开发,推荐使用。控件源码获取QCustomPlot下载地址:https://www.qcustomplot.com/index.php/download获取的压缩文件解压之后内容如下:里面包括文档、示例程序、更改日志、GPL授权及该绘图类的源文件。添加帮助文档Qt
2021年7月20日
其他

手把手教你做一辆迷你平衡摩托车

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!摘要:平衡小车大家应该见到过很多了,比如最有名的要数野生钢铁侠稚晖君的自行车平衡小车了。那个玩意太高级一般人做不出来,作为学生或者DIY爱好者做一辆小型的mini平衡小车还是可以实现的。随着16届恩智浦杯全国大学生智能汽车大赛新增单车拉力组,平衡小车的实现正在成为电子爱好者最受欢迎的项目,如果你是电子专业爱好嵌入式开发,平衡小车你一定要做一辆。今天给大家带来的是一个博主老倪制作的迷你的平衡自行车项目,虽然时间有点久远,不过相信我们仍然能从中学到一些新东西。下面两张图是龙邱科技为16届智能车竞赛生产的电单车K车模高配版摩托车图片下图是本项目要说的简易mini版平衡小车自行车平衡DIY分为3部分介绍:第一部分介绍自行车平衡基本物理原理;第二部分理论篇,对平衡自行车的算法进行理论分析,包括模型分析、姿态检测方法、PID算法,控制算法;第三部分实践篇,具体介绍平衡自行车用到的元器件,动力、转向、电路及代码分析。一、自行车平衡原理自行车是怎么平衡的,老外做过一个非常好的视频,这个视频很好地证明了常见的”角动量守恒”的说法是错误的,并且正确的说明了自行车平衡原理是和转向相关的,但没有具体指出平衡和转向的关系。在这里我们就先来讨论一下”角动量守恒”这种最常见的猜测为什么是错误的,大致讨论一下转向是如何使自行车保持平衡的。1、角动量守恒说角动量守恒说的意思就是:轮子跑的时候在转动,此时轮子就类似于陀螺,角动量守恒使自行车保持不倒。小时候也有过这样的疑问,如果把自行车车轮固定从下坡推下,自行车能不能一直往前走?到底能不能呢?老外的视频做了这个试验:固定之后就会倒下,可见轮子的陀螺仪效应并不是维持自行车不倒的原因。另外还有老外做了一个没有陀螺仪效应的自行车,该自行车也可以稳定平衡:以上足以说明陀螺仪效应不是维持自行车平衡的根本原因。2、离心力是自行车平衡的根本原因那么什么才是维持自行车平衡的原因呢?自行车可以看做是一个倒立摆(左右方向不稳定),这个倒立摆受重力作用是一个不稳定系统,需要额外的回复力维持平衡,而提供回复力的正是自行车转向时的”离心力”。离心力是速度和把手转向角的函数,在一个固定的速度下,可以认为控制把手转向角度就是控制回复力。我们先记住这一点:维持自行车平衡,需要通过一种合适的算法控制把手角度才能使自行车稳定平衡。机械自平衡或许有人会奇怪,有些自行车只要推起来就可以自己平衡,如下面视频:我自己也买过一个如下面这样的遥控摩托车想要研究一下:拆开后发现里面并没有精确的转向控制结构,仿佛在行驶时根本没有转向控制,就类似于上面自行车一样自己就可以平衡了。这到底是怎么回事呢?其实这就是结构设计者的牛逼之处,设计的机械结构自带回复功能,机械结构使得转向会根据车身倾斜而改变,这种改变的幅度正好可以使自行车稳定平衡。如果我们改变车身结构,可能就会破坏原有的参数,使得自行车无法稳定平衡。如在前轮绑一个重物:在老外的视频中,分析了车身倾斜对转向的三个影响因素:前轮转轴后倾,导致倾斜时前轮转向。把手安装在前面,导致倾斜时前轮转向。前轮转动时的陀螺仪效应,车身倾斜,陀螺仪效应使得前轮转向。以上是所谓”机械自平衡”,平衡根本原因还是转向,只不过巧妙的机械设计使得前轮转向特性恰好很容易维持平衡。手动自平衡手动自平衡的意思就是我们自己手动控制让它平衡。我们既然分析平衡原理,还要做一个平衡自行车出来,这一部分要好好研究一下,将会在后面理论篇重点讨论一下控制方法。二、平衡自行车-理论篇一、模型分析1、倒立摆很显然我们知道自行车在左右方向上不稳定,这是一个很常见的物理模型——倒立摆。顾名思义,倒立摆的意思就是倒着的摆,比如一个倒着的杆,倒立摆的特性:不稳定,只要偏离平衡位置,就会有一个力(重力的分力)使系统更加偏离平衡位置,这样偏差就会越来越大。一般倒立的杆在前后左右方向都有可能倒下,在二维的平面上不稳定;而自行车仅在左右方向上可能倒下,是一维的倒立摆,这要简单一些。以下是几个生活中常见的倒立摆例子:2、自行车的平衡控制自行车属于倒立摆模型,倒立摆是不稳定的,那么倒立摆应该如何控制才能平衡呢?我们把问题拆分一下:怎样的状态才叫平衡?我们能控制的是什么?如何控制才能稳定平衡?2.1
2021年7月18日
其他

一文搞懂0.1UF和10UF电容并联使用技巧

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!摘要:搞电子的不知道小伙伴有没有被问到过,芯片附近放置的电容是多少?当你回答说是0.1uF,当你心里暗自庆幸还好自己知道的时候,面试官突然又问道为什么选取0.1uF?想必此时不少小伙伴都会想到,我看别人都是这么画的,官方推荐也是这么干的,如果你是这么回答,那面试官是不会满意的。怎么回答才算是牛X呢?电路设计的每一个器件可以说是都不是没有根据的随便选型,只是可能到你手里之后,已经经过多方验证,是成型的原理图,参数不需要修改,所以关注的也少。回归正题,接下来分析分析,上面提到的,为什么是0.1uF电容,而不是1uF、10uF......一、电容模型本质先来看看电容,电容的作用简单的说就是存储电荷。我们都知道在电源中要加电容滤波,在每个芯片的电源脚放置一个0.1uF的电容去耦。等等,怎么我看到有些板子芯片的电源脚旁边的电容是0.1uF的或者0.01uF的,有什么讲究吗。要搞懂这个道道就要了解电容的实际特性。理想的电容它只是一个电荷的存储器,即C。而实际制造出来的电容却不是那么简单,分析电源完整性的时候我们常用的电容模型如下图所示。果果小师弟original图中ESR是电容的串联等效电阻,ESL是电容的串联等效电感,C才是真正的理想电容。ESR和ESL是由电容的制造工艺和材料决定的,没法消除。那这两个东西对电路有什么影响。ESR影响电源的纹波,ESL影响电容的滤波频率特性。电容的容抗电感的感抗实际电容的复阻抗为可见当频率很低的时候是电容起作用,
2021年7月16日
其他

手把手教你制作炫酷的PCB板3D爆炸图

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!摘要:现在很多互联网+硬件的产品,都喜欢在官网放上产品的3D爆炸图,以展示自己产品的组成结构,并标注自己产品哪些哪些地方用了多么牛X的技术或者元件,以凸显产品的逼格。其中便少不了电路板。下面和大家讲解用AD+keyshot软件制作高逼格的3D电路板效果图。1、制作贴图1、打开AD软件,进入PCB的3D视图。2、在3D视图下,按下B键调出视图配置文件,关闭3D视图显示。由于在渲染软件中只是渲染出效果图,并不会有丝印,所以要制作贴图,也就是现在AD软件中把图片截图下来。3、使用截图软件将图片截图下来并保存。2、导出step文件1、依次点击文件—导出—STEP
2021年7月14日
其他

小师妹和小师弟一起交流学习!

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!摘要:这两天小师妹要做一个小项目,需要给自己小板子设计一个电源管理电路。于是我就给她远程讲解一遍,但是她还是不太明白。非要当面给她讲,我说可以啊!讲可以,但是你必须给咱家的粉丝打个招呼哟。小师妹的需求!需求:板子上有一个MCU和一个传感器还有一个无线模块,它们的供电都是3.3V,要给这个小板子上一块电池,电池必须要能充电。这个需求能简单啊!就是一个电源管理电路。里面肯定要用到电源管理芯片和MOS管,所以要搞懂这个电路,先来了解一下MOS和电源管理芯片吧!1、MOS管MOS管,一般又叫做开关管,是一种电压控制器件。三极管也叫作开关管,但是三极管是电流控制器件。P-MOS管导通和截止的条件是:当P-MOS管的G极与S极中间的电压差低于阈值时,P-MOS管的S极和D极就会导通;反之,P-MOS管的S极和D极就会截止。根据P-MOS管的工作原理是:当STM32的GPIO口输出低电平时,P-MOS管GS电压差为VGS=-3.3V,此时,P-MOS管处于导通状态。当STM32的GPIO口输出高电平时,P-MOS管GS电压差为VGS=0V,此时,P-MOS管处于截止状态。2、锂电池充电电路锂电池充电管理电路采用的是“单节锂电池充放电管理”的芯片TC4056A,它是一款完整的单节锂电池采用恒定电流/恒定电压线性充电器,这款芯片的主要特点包括电池温度检测、欠压闭锁、自动再充电和两个用于指示充电、结束的LED状态引脚,可编程充电电流可达1000mA。锂电池的充电管理电路如下图锂电池的充电管理电路上图中,D2主要是用来指示锂电池的充电状态。插入USB时,在TC4056A的作用下,开始给锂电池充电,LED常亮,当锂电池充满时,LED常灭。R2是用来限定TC4056A的最大充电电流,根据公式:,其中,
2021年7月12日
其他

Keil MDK中使用AStyle插件对代码格式美化处理

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!摘要:通常我们写代码的时候,尤其是缩进和{}的使用,很多都需要自己手动去调整,如果有一个自动格式化代码的工具,每次编辑完代码,然后一键给将代码格式化,即省时又美观。为了解决这个问题,给大家推荐一个MDK插件—Astyle。一、下载AstyleAstyle全称Artistic
2021年7月7日
其他

史上最全的LED点灯程序,你都掌握了吗?

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!摘要:你点亮过多少板子的LED灯呢?有很多小伙伴留言说讲一下STM32、FPGA、Liunx他们之间有什么不同。不同点很多,口说无凭,今天就来点亮一下STM32、FPGA和Liunx板子的LED灯,大家大致看一下点灯流程和点灯环境以及点灯流程,就能大概的了解一下三者的区别,可以有选择的去学习!一、使用STM32点亮LED灯STM32从字面上来理解ST是意法半导体,M是Microelectronics的缩写,32
2021年7月5日
其他

软件神器TortoiseGit,果子哥手把手教你使用图形化方式管理单片机程序版本!

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!摘要:大家肯定都写过毕业论文,写毕业论文的时候,每次修改之前,都会先把当前最新的版本复制一份,然后再重新命名一个标题,但是,之前的旧版本又不会删掉,为了保险起见,感觉万一新的文档没改好还能有个旧的版本可以用。于是,就有了下面的一幕大家别笑,这都是真实发生的案例,更有甚者,自己笔记本拷贝毕业论文到U盘,在其它电脑修改了,又忘记更新回自己电脑,或者,时间长了,想找到之前文档中的一些文字,但是又忘记在那个版本来。是不是非常苦恼,你可能觉得,那我找回之前的版本一个个查看不就可以了,又没删,但是你这才几个文件,如果文件数量翻几倍呢?那么,有没有什么软件可以帮助我们对文件进行版本控制呢?今天,果子哥教大家用Git来进行版本控制。听到Git,一些单片机或者是软件开发的初学者又打算停止看下去了,好麻烦啊,又得记一堆命令,每次改完我也懒得命令提交,我还是通过日期来记录好了,于是又出现下面一幕:项目完成初期,还大致记得每个版本改了什么,1个月后,需要某个旧版本的信息,或者新的版本出了什么问题,需要追溯查找改动的代码部分,这时候,麻烦就来了,工程师喃喃自语道
2021年7月3日
其他

推荐五款你从未见过的嵌入式电子电路仿真APP

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!摘要:在这个人人一部甚至多部智能手机的年代,各种APP充斥在各种应用市场作为一名电子爱好者或者电子工程师,你在为如何选择APP而头痛吗?哪些你正在使用的APP使你在工作、生活、学习中如虎添翼呢?现在,果子哥特意整理了一些电子爱好者和电子工程师能用到的手机APP和你没见过的电脑仿真软件。ElectroDroid电路专家ElectroDroid是一款电路电子器件的学习软件,比较专业化,它能够为你提供各种电路方面的信息查询和计算服务,是电子相关行业人士的必备工具之一。它包括:电阻色码计算器贴片电阻代码电感色码计算器欧姆定律计算器电抗计算器分压器计算器电阻值/电阻串联/电阻并联计算器电容充电计算器运算放大器计算器LED
2021年7月2日
其他

手把手教你VSCode搭建STM32开发环境

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!摘要:作为一个51单片机或STM32单片机的使用者,keil一直是我们的必备的一款工具之一。但keil的一些问题也一直存在,当然也有人用其他的,比如STM32CubeIDE。但是今天推荐的是VScode+Keil
2021年6月30日
其他

干货|手把手带你搞懂Modbus通信协议

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!摘要:昨天有小伙伴在群里问关于Modbus通信协议的,大家都比较积极地解答,所以今天果子哥总结一下关于Modbus相关的知识,适合正在入门的小伙伴“食用”。同样还是理论+实战的方式,欢迎留言区评论。1.什么是Modbus?顾名思义,它是一个Bus,即总线协议。比如串口协议、IIC协议、SPI都是通信协议。你接触到这种协议,相信你所处的行业是工业电子方面或者你的产品用于工业。好了,现在知道了大概知道了,这是一个总线协议,是一个Mod什么的公司发表的一个通信协议。那为什么要用这个呢?
2021年6月26日
其他

FPGA的Veilog HDL语法、框架总结

HDL硬件描述语言是在用途最广泛的C语言的基础上发展起来的一种硬件描述语言,具有灵活性高、易学易用等特点。Verilog
2021年6月24日
其他

干货|手把手教你写一个串口调试助手

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!摘要:前段时间发布了一个用QT写的串口调试助手,很多小伙伴在后台留言要源码。其实网上有很多免费开源好用的上位机,大家搜一下就能找到,为了大家方便学习QT以及如何写一个上位机,今天推荐一下学习资源,顺带带大家写一个非常简单的串口调试助手。相信很多小伙伴还没有接触过QT,如果想用QT写一个调试助手,首先是会一点C++语法。了解即可,也就是看得懂C++的代码。只要能看懂简单的C+++语法,就能很快的写一个串口调试助手。先推荐两个视频教程,感兴趣可以看看!1、B站Jomse工B站Jomse工看完你基本知道串口调试助手大概是个啥样了,有了大致的了解然后再去看和修改别人的代码。2、B站lililanglangB站lililanglang把这两个视频看完后,基本你就能够自己写一个串口调试助手了,视频很短没有废话,全程都是干货。而且别人也给出了源码。为了大家方便理解,果子哥还是写一篇手把手教你学QT串口调试助手吧!3、新建工程1、首先你要安装QT的开发工具Qt
2021年6月19日
其他

单片机编程技巧—状态机编程

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!摘要:不知道大家有没有这样一种感觉,就是感觉自己玩单片机还可以,各个功能模块也都会驱动,但是如果让你完整的写一套代码,却无逻辑与框架可言,上来就是开始写!东抄抄写抄抄。说明编程还处于比较低的水平,那么如何才能提高自己的编程水平呢?学会一种好的编程框架或者一种编程思想,可能会受用终生!比如模块化编程,框架式编程,状态机编程等等,都是一种好的框架。今天说的就是状态机编程,由于篇幅较长,大家慢慢欣赏。那么状态机是一个这样的东东?状态机(state
2021年6月17日
其他

超硬核|手把手教你制作一个示波器

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!摘要:此示波器的主控是STC8A8K64S4A12,是在B站老刘示波器基础上的升级版,扩展了测量负电压的功能,更新了UI设计,屏幕升级为1.3寸OLED屏。原理图3D效果图实物图视频演示系统架构Mini示波器采用了一套成本低廉但高效的硬件,配合层次化的软件框架,实现对常规低频信号波形的采集、分析、显示。硬件部分的主要工作有:电源管理(5V、2.5V、-5V);对信号的衰减、限幅、偏置。最后将处理好的电压信号送入MCU的ADC外设,进行数据采集。由于ADC外设只能采集正电压,因此我们通过增加偏置电压的方式,将负电压抬高来采集。软件部分的主要工作有:底层驱动SDK框架、ADC滤波算法、波形数据处理、人机交互界面。SDK提供基本的模块和外设驱动支持,滤波算法去除噪声和毛刺,波形处理计算电压值和频率,并为波形显示做准备;人机交互界面提供屏幕显示(OLED屏)和操作方式(旋钮和按键)。与原版老刘对比这一版本的Mini示波器-Pro,相比于原版对硬件部分做了很大扩展,使其可以测到负电压。软件部分修改了有30%,主要是在数据处理和UI显示部分。需要改进的地方1、硬件的性能还没有全部发挥出来,测量幅度还可以更高。2、MCU的性能还没有榨干,比如没有用上硬件SPI,提高屏幕刷新率。总结1、最一开始设想的方案,是想用上我写的AntOS操作系统的,但是初版操作系统,为合作式调度,实际使用的过程中,并没有达到我的预期效果,所以选择在老刘示波器的基础工程上修改和优化。2、硬件设计主要参考了B站唐老师讲电赛大佬提供的方案,实际使用的过程中,又微调了一部分,建议大家可以去阅读一下硬件电路中使用的几种芯片数据手册,这样心里更有底,不然遇到问题不好排查。3、大多数元器件,我用的都是0603的封装,这样可以让PCB板设计的更小巧更紧凑,但是不好焊接。4、下一版本,我将使用STC8AxD4作为主控(因为有DMA),软件上使用我现在编写AntOS(已支持抢占式调度),进一步提高示波器的性能。资料获取在公众号后台回复:MiniDSO,即可获取次示波器的程序源码、PCB工程文件以及说明文档。此项目来自B站UP泽文i的独家投稿,一位大三的小伙伴,自己还写了一套8051-ELL库,是根据新一代增强型8051为内核的MCU,基于keil开发的软件包。有兴趣的小伙伴可以关注一波!End推荐好文
2021年6月15日
其他

好快啊,我的研究生生涯结束了!

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!6月9号高考的最后一天,研一的最后一场考试在这一天也结束了!时间过得很快,很快啊,再也没有机会去教室上课了。回想过去的学习上课生涯还是感慨万千!16年的郧西一中不哭不累,高三无味,所有的桌子上都是这种厚厚的一沓书奋斗的高三高考结束后,在学校的最后一次晚餐,吃完就离校了~最后的晚餐高中玩的太多,最后考了个二本,母校坐落在湖北襄阳,位于全国5A级风景区古隆中的山脚下。正是在这里我开始了我的电子求学之路。新入大学,一切都是美好的!第一次穿正装!军训刚结束有点黑。猜猜哪个是小师弟?成为一名光荣的护旗手!好像都比我帅,哈哈哈这些刚高考完,进入大学时的场景还历历在目。接下来就是进入实验室学习了,才有了现在的果子哥跟大家分享一些好玩的电子知识!转眼间研一就结束了,这一年除了上课专业课程之外,做的项目不算多,做了一个arduino的小项目,也玩了一下qt,还搞了一下网络编程,最后也搞了一下FPGA。其实读研并不是我们在本科时想象的那样,以为研究生不用上课,每天就是一个项目组在实验室一起学习做东西,和导师和谐相处,跟大学一样一起吃饭一起玩。但是实际上就是:研一除了要上课还要每天呆在实验室学习,你的同门师兄弟和你做的项目可能并不是一样的,可能需要你独自完成。每周要做PPT、开组会,报告一周所学的东西和遇到的问题,然后针对问题进行讨论和安排下一周的任务。导师也不是每天都围在你的身边,如果你不主动找导师的话,基本你就见不到导师。当然如果你以为这样就行了?这样的导师也是少部分,笔者所知道的大部分导师都是放养型的,你以为研究生复试老师对你要求那么高,等进来了就会一心一意只专注你一个人?错了,如果你本科没学到啥技术,找的导师也是没有什么经验,基本你就废了。三年读完基本就相当于再读了一次本科,并且水平可能还没有本科水平高。这还真的不是打击你。所以为了不让自己毕业时像本科毕业时那样后悔,读研还是要抓住时间好好学习自身技术,耐得住寂寞,受得了打击。最后祝所有高考学子考出好成绩,高考结束了去买个手机,买个电脑,考个驾照,打一次暑假工。也希望即将读研的小伙伴能抓住研一的美好时光,没女朋友的在开学一个月之内抓紧时间。研一即将结束的小伙伴也要赶紧考虑自己的小论文和毕业论文,多做几个项目。最后也祝自己能够写出更多的好文章,加油!高歌一曲泪,
2021年6月13日
其他

史上最全的H桥电机驱动电路详解

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!摘要:智能车大赛快要开始了,小编当年电机驱动板可是做了不少,所以总结了下一关于H桥电机驱动电路的详细解读,文章字数比较多,记得慢慢看。电机:俗称“马达”,依据电磁感应定律实现电能转换或传递的一种电磁装置。包括:电动机和发电机。电动机在电路中是用字母M表示,它的主要作用是产生驱动转矩;作为用电器或各种机械的动力源,发电机在电路中用字母G表示,它的主要作用是利用机械能转化为电能。电机控制:对电机的启动、加速、运转、减速及停止进行的控制。1.直流有刷电机直流有刷电机(Brushed
2021年6月11日
其他

干货|终于把TCP/UDP协议整明白了!

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!摘要:昨天说了在嵌入式方向的Socket编程,那么今天说一说在互联网方向的网络编程,它们的通信流程都是相同的,只是在不同的环境下调用的API函数可能不同。网络编程有三个要素,分别是IP地址、端口号和通信协议。首先,我们需要了解一下IP地址、端口号、通信协议的相关知识。一、IP地址网络中的计算机使用IP地址来进行唯一标识,IP地址有IPv4和IPv6两种类型。IPv4采用十进制或二进制表示形式,十进制是一种比较常用的表示形式,如192.168.1.131,IPv6采用十六进制表示形式,一般不常用。如何查看IP地址相关信息:在Windows系统下,打开cmd,输入命令ipconfig,按回车即可查看。在Linux或Mac系统下,打开终端,使用ifconfig命令,按回车即可查看。二、端口号端口号是计算机中的应用程序的一个整数数字标号,用来区分不同的应用程序。0
2021年6月10日
其他

Socket笔记 | TCP、UDP通信总结

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!摘要:还在学校的朋友,如果感觉到很迷茫,不知道学什么的时候,可以上招聘网站上看看自己未来工作相关的职位的任职要求,这样就可以总结自己的一些不足、比较有针对性的去学习。不要觉得自己会玩个单片机就很NB,时刻提醒自己还很菜,要学的还有很多,不然想找高工资是没有门的,除非你家你有矿!今天来说说嵌入式必备技能之一Socket编程。一、什么是socket?Socket的英文原义是“孔”或“插座”。在编程中,Socket被称做
2021年6月8日
其他

稚晖君教你制作全球最迷你的自平衡机器人

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!摘要:Nano是一个小巧可爱的机器人,身高大约10公分,特点是平衡感好,长得很白以及善于卖萌。作为全球最迷你的自平衡机器人,Nano身材虽小,但配置有丰富的传感器—陀螺仪,超声波,Motion
2021年6月6日
其他

我的第一个FPGA开发项目——二选一多路器

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!摘要:最近项目中要用到FPGA,由于之前没有接触过FPGA的知识,从零开始,经过两天的学习,完成了自己的第一个小项目,二选一多路选择器。不知道有没有小伙伴也在学习FPGA啊!市面上笔者现在知道的有四家做FPGA的:黑金、小梅哥、正点原子、野火。其中黑金和小梅哥做FPGA是比较早的。正点原子和野火是这两个年开始做起来的,属于后起之秀。初学,不敢说哪一家好与不好,所以正点原子和野火和小梅哥的FPGA资料都下载了(百度网盘超级大会员)。看了一下感觉资料都不错。所以我是同时看三家的PDF文件,综合起来学习,这样感觉很不错。这里关于FPGA的简介以及历史我就不多做介绍了,学习FPGA之前当然是要搭建环境了。所需要的安装的软件1、QuartusII13.0(相当于Keil)2、ModeSim(仿真用的)3、UltraEdit(文本编辑器,在QuartusII内部编写中文会乱码)1、安装QuartusII1、双击安装包,以管理员身份运行。2、我接受协议。3、选择QuartusII的安装路径,切记安装路径不能有中文。4、选择要安装的组件。安装组件,默认全选。注:开发软件的使用离不开器件库,器件库的的安装有两种方式,一种是与开发软件一并安装,但器件库必须与安装软件存放在同一文件夹,软件安装时,组件的选择包括器件库,如图所示;选择安装组件(器件库一并安装)5、显示安装整体信息,准备软件安装。如图
2021年6月4日
其他

干货|手把手教你自制轮式机器人

Pi给当初什么都不懂的我留下了非常深刻的印象:一个信用卡大小的板子竟然可以跑带有图形界面的GNU/Linux操作系统。在强烈探索欲的驱使下,我从网上购买了两块Element14的Raspberry
2021年5月29日
其他

干货|手把手教你自制六足仿生机器人

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!摘要:经过大一那次失败之后,我决定暂时停止该项目的开发,转而先去学习那些有关嵌入式开发的基础知识,等以后有能力的时候再去独立完成这个六足机器人。很幸运的是在我大学本科即将结束的时候,我已掌握了足够的知识来完成那个曾经困扰我已久的机器人项目,于是我花了几周的时间完成了这个六足机器人,算是了却了自己的一个心愿吧。一、前言这个六足机器人是我在大四做的,是我大学本科生涯的最后一个个人项目。至于为什么我要做六足机器人,还要从高考完之后说起:当时刚考完的我一直想做一些有意思的事情,直到有一天我发现了一个叫PVCBOT的网站,里面记录了很多如何使用PVC材料来制作简单机器人的教程,其中有一款叫做PVC六足机器昆虫的机器人彻底震撼了我,当时看完教程之后我就下定决心也要做一个类似的六足机器人,于是我便从懒猫侠前辈那里购买了六足机器人套件(目前应该已经绝版了),并打算按照提供的教程完成自己的六足机器人,但无奈当时的我所掌握的知识太少,什么单片机、串口通信、舵机PWM、电源管理、传感器、舵机控制板等都不懂,特别是机械结构方面我更是一窍不通,所以大一那会儿我还闹出了笑话:用硬纸板做六足机器人的肢体,在安装好舵机并通电测试后,眼睁睁地看着自己的“纸板六足”在舵机的震动下不断地解体。。。二、概述六足仿生机器人是一个拥有十八个关节自由度的迷你多足机器人,它可以实现红外遥控、超声波避障等基本功能。机器人的硬件核心为Arduino
2021年5月26日
其他

电赛预热—电源软件如何准备?

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!摘要:PWM和SPWM在电源的备战中是很有必要的。基础的恒流源、恒压源需要使用PWM的占空比及频率来达到数控的作用,往后的逆变则需要用到SPWM。当然还有ADC、DAC、IIC、SPI、算法。一、PWM/SPWM脉冲宽度调制(PWM),是英文“Pulse
2021年5月24日
其他

用CubeMX + HAL库开发它不香吗?

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!摘要:如果你学过STC51,你一定知道STC51操作是极其方便的。如果你学过STM32的库函数,你一定知道STM32操作是极其繁琐的。传统的库函数开发方式,将太多时间花费在各种东西的初始化上。同时,如果你学过STM32F1、STM32F3、STM32F4的话,你会发现对于不同型号的STM32在使用库函数的开发方式下,他的初始化流程也是不一样的,这也是传统开发方式的一种弊端。而CubeMX
2021年5月22日
其他

干货|使用Notepad++和MinGW编译C代码

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!摘要:编译C/C++的编译器有很多,对于简单的程序编写调试,我觉得使用Notepad++和MinGW完成C语言程序的编写和编译,是最好用的方法!你觉得呢?1、Visual
2021年5月19日
其他

工具 | 手把手教你在VSCode中使用Git

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!摘要:本文教你如何在VSCode中使用Git,如果git不了解或者不会安装可以看之前发的一篇文章零基础入门Git&Github。在一个目录下clone项目:git
2021年5月18日
其他

一万粉啦!3000元大礼包相送!

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!一万粉啦!2021年5月11日,果果小师弟公众号迎来了第10000位粉丝。截止今天已经有10272位小伙伴加入了果果小师弟的大家庭中来了!很激动!看着很多做公众号的号主都已经突破万粉,我的万粉虽然到来的比较慢,但是我会继续努力,向下一个万粉冲刺,持续为大家带来优质文章,万粉了嘛,今天就跟大家说一说做公众号这一年多来的感想,与诸君共勉,顺带给大家发点福利!1、你是怎么想着要做公众号的公众号是去年1月份注册的,当时正是考研初试结束的时候,没啥事就想着做一下公众号。毕竟快毕业了,想把大学这四年所学到的知识记录下来,分享给大家。把自己知道的分享给给实验室同学们,同时也分享给广大的电子爱好者们。于是我就注册了[果果小师弟]这个公众号。最开始做公众号当时并没有很明确地目标,只想着把以前的做的项目写下来,用过markdown语法来编辑文档,在公众号上面排版的效果不是很好,之后发现mdnice这个编辑器不错,所以现在文章一般都是先在CSDN上面写好,然后复制到mdnice上面刷一遍格式,然后直接复制到公众号就可以了。另外这里做技术的公众号不推荐135编辑器,直接在CSDN上用markdown编辑器就好。大家如果想做学习笔记的话,也建议直接在CSDN上面写,不想让他人看也可以设置为私密。在做笔记的同时也能得到他人的点赞和留言支持,对你持续学习和创作是很大的激励,这样你也会慢慢的提高。2、写博客和公众号有必要吗?先说一下写博客的必要性。作为一名工科做技术的,不管是电子专业还是计算机专业,不管是学生还是在职人员或者是公司研发大佬,写博客都是非常有必要的。因为在写的过程中也是你学习的过程。只有自己搞懂了才能讲的明白,别人也才能看得懂。如果没有搞懂,在写的过程中你也会不断的查找资料将这个知识点搞懂然后记下笔记。这就在不断地锻炼你的学习能力,而本科的培养目标不就是让你成为一个会学习的人吗?只有学会了学习,那么即使在今后的工作学习中遇到你从未做过的事,你也知道如何查找资料来获取你想要的东西。另外博客是每个搞技术的人都要有的,不要认为自己是一个学生,认为自己菜、不敢写、不会写,不写就永远走不出第一步。写作的过程中也是一个分享的过程。记得以前本科时候,指导老师就告诉我们,一个人的能力有限,你有苹果,他有梨子,另外一个人有香蕉,如果都不分享,藏着掖着,那么你永远只拥有一种水果。很多人不愿意分享自己的学习心得,其实不是没有分享的意识或者懒得分享,最重要的原因可能是怕自己的劳动成果被他人窃取,总感觉凭什么自己辛辛苦苦学习到的知识点却要告诉别人,况且你又没有给我啥好处。别人的开源项目都是辛辛苦苦自己做的,代码也是自己写的,凭啥都要全部的告诉你啊?因为我们都太高估自己,也许你认为非常重要的知识点在别人看来也没那么重要,因为别人不是你。分享了别人觉得有用会从心里面感激你,不然为什么github上面有那么多开源的优秀项目!当然写公众号和写博客的目的其实都一样的,就好比有人喜欢在博客园写,有人喜欢在CSDN,还有人喜欢在知乎上写和回答问题。3、写公众号容易吗?写公众号对我来说不容易,因为我并没有什么工作经验,还在上学。所以公众号上面分享的内容还是有很大局限性,所以我尽可能的写一些对电子初学者或者对大学生有实用的一些技术和干货,自己不懂没学过,也不会不懂装懂。很羡慕别的一些号主工作经验十足,动不动就是10年以上老司机、大厂程序员、研发工程师、研发老总等。写得文章有深度,几个月就能涨粉过万,关注他们确实能学到不少,所以也要向他们多学习,不断拓宽自己的眼界。写公众号其实也非常耗时间,一篇文章看着只有三四千字,却要花费很长时间。从选题(要写什么),再到动笔写,再到修改和排版。基本一篇原创文章要花一天多时间。如果是非常硬核的干货文章就需要更长时间了,一周以上也是有可能的。所以大家看到那种浏览和点赞量多得文章,号主都是花了大精力,请大家好好保护他,多多点赞转发留言。4、写公众号的收获写公众号这一年多来收获蛮大的,第一点就是自己养成了随时记录和写文档的好习惯,养成了看他人文章的习惯。找学习资料不仅只有百度、B站还有公众号文章。会经常看大佬们的博客,甚至专门把一些优秀的文章做成文档收集起来。当然如果你正在处于学习阶段也可以跟我一起这样做。第二点就是认识了很多大佬,有公司老总、项目经理、大学老师等。他们给我的印象就是不仅技术厉害,待人也很友好、谦逊、低调。毕竟优秀的人不能仅仅是技术流弊。跟着他们我学到了很多,有技术方面的,也有公众号运营写作方面的。在分享的道路上,结识了很多良师益友,这里我要感谢他们,排名不分先后:“正点原子、嵌入式云IOT技术圈、小熊派开源社区、嵌入式大杂烩、Mculover666、txp玩Linux、哈勒昆、嵌入式从0到1、嵌入式与linux那些事、嵌入式linux系统开发、技术让梦想更伟大、涛哥依旧、羽林君、一口Linux、大鱼机器人、strongerHuang、嵌入式客栈、Rice嵌入式开发技术分享、嵌入式情报局、最后一个bug、IOT物联网小镇、嵌入式悦翔园、程序员小熊、嵌入式系统、码农爱学习、编程修养、程序员编码、C语言与CPP编程、8号线攻城狮、C语言编程、高效程序员、机械猿、嵌入式技术笔记、嵌入式基础学习、千与编程、轻松学长、微观技术、小林coding、岩语物联网、夜深人静写算法、IT创客学院、记得诚、程序瞄大人、小麦大叔、君主啊啊工作室、人人都是极客、低并发编程、wenzi嵌入式软件、物联网客栈、芯片之家、DLGG创客DIY、电子芯吧客、张小飞那些事儿、高性能服务器开发、知晓编程、TopSemic嵌入式、程序员cxuan、小夕学算法”当然也结识了一些没做公众号的朋友,那就真的太多太多了,这里就不一一列举出来了。他们也在我的奋斗道路上提供了不少帮助和建议,在此,献上我的膝盖,以表感谢。在这里也要感谢我的女朋友,他是很支持我写公众号的,每次写完后都会发给他“审核”一遍。5、如何涨粉我的涨粉方式很简单,主要是B站和知乎以及互推,在公众号申请之初我就新建了一个麦客表单,在读者关注我的公众号时候就会弹出一个链接填写一下表格,从而统计他们所需要关注和想看的内容。就目前统计的数据来看,浏览量在20%左右,有效填表率在8%左右。当然这些数据不会涉及个人隐私,只是为了方便统计大家需要哪方面的知识让我更好的、有的放矢的写文章。只有了解到了读者的需求才能更好的服务大家!下面是统计的一些数据:第一:虽然这些数据样本不算多,但是能够完整的提交数据的肯定是铁粉,而且是想通过本公众号学到更多的知识。其中B站的引流效果最好,现在做公众号的很多都有B站的账号,而年轻人的学习也大多在B站上面。第二:从表中也可以看出大家对STM32单片机和linux入门的知识需求还是蛮大的,所以我的发文也主要在这方面,再加上一些这几年很火的物联网知识点,基本来说阅读率基本都还可以。第三:还有一个很重要的方面,就是要注意公众号的排版和配图。基本我在排版和配图上面花的时间基本和我写文的时间差不多。现在做公众号的越来越多了,如果没有自己的特色,文章没有辨识度,很难留住读者。平时发文封面首图基本都是自己做的,而不是随便找一张。因为如果随便找一张,那读者就很可能认为你的文章也是随便写的一篇。第一印象就是你的图和你的标题,当然也不要做标题党。一定要让读者产生一种习惯,那就是看文章的排版风格就知道是你的文章,就是知道文章的大致流程是什么样子,如果能做到这一点,排版就基本过关了。第四:留言互动。2018年之后申请的公众号基本都没有留言功能了,如果要想获得留言功能就必须留言迁移,一般找中介2k多块大洋就可以搞定,由于最开始没有这个意识,丧失了很多与读者互动的机会,所以在今年3月份就开了留言,为了大家能够和我留言互动,花点钱还是值得的。6、粉丝福利这里要感谢正点原子的大力支持。广州市星翼电子科技有限公司(正点原子)是一家从事嵌入式开发平台、IOT物联网、四轴飞行器、仪器仪表和企业服务等软硬件研发、销售一体化的国家高新技术企业。公司成立于2012年,是国内知名度最高的嵌入式开发平台供应商,产品远销东南亚欧美各国,国内数百家高校实验室和培训机构采用正点原子开发平台作为实验教学平台。作为嵌入式开发平台行业的领导者,公司推出的STM32、Linux和FPGA等产品广受用户好评!所有要买正点原子开发板的朋友可以加果果的粉丝群,九折优惠,折扣长期有效!此次活动正点原子的黄总特地赞助了价值3000元奖品:一等奖(Mini
2021年5月14日
其他

我的19岁

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!摘要:我的19岁,很累。这一年在程序员的圈子里流行着996ICU的说法,但是这一年的我却过着8107的生活,每天早上8点到实验室,晚上10点离开,一周工作7天。并没有人强迫我这么做,但是我相信“强迫自己优秀,然后骄傲的生活”。第1章
2021年5月11日
其他

干货|手把手教你写单片机的结构体

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!摘要:听说还有好多学单片机的小伙伴不会用结构体?指针和结构体是学单片机必须要掌握的,如果你C语言掌握的不牢,单片机根本学不到精髓,只能完成一些低级的项目。看得懂结构体并且能够灵活运用结构体才能说你入门了单片机。本篇将以最通俗的方式结合STM32单片来讲讲结构体的运用。解决你学完C语言、考过了计算机二级还是看不懂单片机结构体的苦恼。宝藏文章,记得点赞转发收藏。大家知道指针和结构体是单片机的难点,所以就去学习C语言,找视频看书......这里面每一个视频的播放量都非常高。对于单纯的学习C语言,这里讲的很清楚。看完你不禁在下面评论一句:哇!讲的真的太清楚了吧!但是等你真正的学单片机的时候,你会发现我不是学过C语言吗?计算机二级我也过了啊!怎么这个指针和结构体都不懂啊?难道我学了一个假的C语言?其实这不是你的错,也不是单片机的错,而是在C语言和单片机之间需要一个过渡!这个需要过渡的点在很多单片机视频教程中并没有去讲解。因为教育机构默认你是知道的,所以在讲流水灯时他们并不会讲解GPIO初始化这个结构体,因为默认你是知道如何操作的。申明一个GPIO_InitTypeDef的结构体,然后在LED_Init(void)函数中定义一个GPIO_InitStructure的变量GPIO_InitStructure,那么这个变量就可以设置这个GPIO_InitTypeDef的结构体中的成员。这里先做了解,请接着往下看。1、为什么需要结构体这里先不说什么是结构体,说说为什么需要结构体?只有知道为什么需要,才能按照你的需要去学习,这样效率才会高。你才知道在什么情况下我们需要写一个结构体,怎么样去用结构体。这里我们以一个智能家居的项目为例。先来看一个实际的问题话说有一个项目上有4个传感器:光照传感器、烟雾传感器、酒精传感器、湿度传感器。然后这四个各个传感器还有设置报警的阈值范围。一般都是这样写#include
2021年5月9日
其他

干货|单片机的指针怎么学?

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!摘要:大家想过没有我们用keil写单片机的代码,你的函数啊、变量啊最终都放在了哪里?我们一直说的内存五区,到底是哪五区?到底放在芯片的哪个地方呢?还有为什么你学完C语言指针和结构体,32单片机里面的关于结构体指针的内容还是搞不清楚呢?如果你有这些问题,今天就带你研究研究!这张图学过STM32单片机的小伙伴应该都不陌生,我们看到的STM32芯片已经是已经封装好的成品,主要由内核和片上外设组成。若与电脑类比,内核与外设就如同电脑上的CPU与主板、内存、显卡、硬盘的关系。芯片和外设之间通过各种总线连接。连接被控总线的是FLASH,RAM和片上外设,这些功能部件共同排列在一个4GB的地址空间内。上面这些张图是STM32F40XXX系列单片机的内存地址映射图。我们的代码就是放在Flash里面(0x8000000~0x80FFFFF)。代码就是你写得各种函数,而在程序中声明的各种变量都放在RAM中,局部变量就是在函数运行完空间释放,全局变量就是程序运行完了再释放,可以这样简单的理解。CPU使用的变量是存储在RAM里面的,要问我RAM是啥,RAM就是个芯片。就是上图的Block1的SRAM区。CPU是通过导线和RAM芯片连接的,然后可以通过导线往RAM芯片里面存储数据和读数据。首先RAM需要有个一开始的地址,对于STM32单片机来说开始地址是0x20000000,要问我为啥要规定地址。只有规定了地址CPU才好对数据进行存储,要是没有地址,瞎几把存,瞎几把取......1、变量1.定义一个int型的变量,通过打印可以看到这个变量存储的地址是:0x20000000。这也证明了我们内存的首地址是0x20000000。我们定义的value变量就放在这里。2.再定义一个变量通过打印可以看到这个变量存储的地址是:0x20000004。因为int类型在内存中占据4个字节,所以第二个变量就存放在0x20000004这个地方。综上所述,定义的两个变量在内存里面是下面这样子。0x2000
2021年5月7日
其他

开源|手把手教你造一个火星车

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!摘要:大学的时候总有很多想法,觉得那些能自己设计电子作品的人特别牛。图书馆陈列这很多的书籍,但是总感觉停留在理论上离我们很遥远,我需要的是实干把东西做出来。想到还有很多小伙伴和以前我一样想造车却不知道如何开始,我特意把我所有的资料和设计全部开源。闲暇时间也可以给小伙伴们一些指导和建议,其实这些东西很简单你们觉得难是因为没有得到合适的引导。希望我的举动能给那些造车学习的小伙伴一点点借鉴和帮助,也期待有小伙伴的加入能让这个车变得更加完善智能。话不多说开始我们的造车之旅!一、目标期望阶段一:完成火星车车体的设计和制作和装配。阶段二:完成火星车控制电路安装,控制板设计集成。阶段三:实现火星车实现PS遥控、航模遥控手动遥控。终极目标:实现火星车环境感知、自动驾驶。第一阶段、制作车体段花费:1.一台3D打印机(1000-4000)2.3D打印机耗材(800左右)3.MG996R(6个
2021年4月30日
其他

干货|手把手教你写一个安卓app

Studio还是差很多。这里介绍一种快速入门的方法来制作一款app,就算你是零基础小白没有学习过java语言也没有关系,相信看完我的文章,半天时间也能做一个安卓app。本文针对初学者,大佬勿喷啊1.
2021年4月28日
其他

给你的代码升个级?—IAP

击上方“果果小师弟”,选择“置顶/星标公众号”干货福利,第一时间送达!一、什么是IAP,为什么要IAPIAP即为In
2021年4月26日