前言

这一年经历了很多第一次,体验和学习了很多新的东西。我其实从大二下学期才真正地摆脱高中的学习思维和方式,其他人可能在大一的时候就已经接触了51、32或者其他类型的单片机,我是从大二上的寒假才开始接触这些。不过现在回想起来大一和大二上学习过的基本电路、模电也帮助到了我看一些电路原理图、电路的理解也更轻松、更顺利一些。我在大一下学期考过了四级,大二上考过了六级,我也没有当什么班委、参加一些社团。所以说在整个2022年除了学校里的考试就没有什么其他的考试或其他事会打扰我,可以专心只弄硬件方面的东西、做我自己想做的事。学习过嵌入式Linux相关的知识之后再去看招聘网站上的一些岗位要求,发现之前没见过的知识或技能现在都熟悉甚至掌握了,自身也越来越贴近招聘岗位的要求了。接下来就介绍一下我这一年学了些啥、做了些什么事。

一月:51单片机

51我买的是普中科技的开发板,因为从来没有接触过单片机有点新奇,跟着教程一点点构建环境、点亮第一个LED、流水灯、蜂鸣器、按键、数码管、点阵、矩阵键盘、到了后面更高级一些的外部中断、定时器、串口、ds18b20、lcd、oled、dht11、pwm等。51真正让我走进了嵌入式,再也不是单单死磕书本上的知识了,增加了更多的实践操作和代码的编写。

图 1 点亮第一个LED

二月:51小车

其实我最初学51的时候就是想做一辆小车、我大一的时候看到人家拿到一辆小车去参加比赛就好羡慕,我也想做一辆。小车对于我来说可以算是脱离开发板的第一个比较完整的小项目。从淘宝买回来的元件都是散装的,主控板和传感器板上的元器件都是需要自己焊的,车身自己组装,对我这种之前只知道抱着书啃的也是一个小挑战。我还买了一个电烙铁和一个类似于装一些小工具的包,然后买了51的最小系统加上面包板、杜邦线和一些电阻、电容元器件,有了这些终于有点像一个电子人了。

图 2 安装好车轮和电机

图 3 小车最终形态

图 4 买的一些工具

其实在焊接电路板的时候有一个元件有两排引脚要焊,一排焊到主控板上,一排是焊到自身这个模块的板上。我先将一排焊到主控板上、然后由于主控板上的元件太密集使得我另一排引脚根本焊不了,最后还是烧焦了一些旁边的电容才成功焊上去、太惊险了。最后实现了一个超声波配合舵机实现避障功能、红外巡线,蓝牙远程遥控小车(两个工程)。

图 5 有避障功能的工程代码结构

图 6 蓝牙远程控制小车代码结构

图 7 测试小车避障功能

图 8 测试小车避障功能

三月:用51来控制一些外围的小电路

三月基本上就是离开了最初学习的51开发板、自己通过51最小系统加上面包板来构建一些小电路、有些通过proteus进行仿真测试。也用了蓝牙、wifi模块来控制舵机和步进电机,相关图片好像没有拍,就找到了一张555产生脉冲的图片代替一下了。

图 9 51、面包板控制舵机和步进电机

图 10 555产生一定频率的脉冲

图 11 Proteus进行仿真的项目

图 12 酒精浓度报警系统

温湿度报警(因为我是在ds18b20温度报警基础上增加的dht11,我舍不得删ds18b20就用按键进行切换LCD来显示两个传感器的数据)

图 13 dht11、ds18b20温湿度声光报警系统

四月-五月:学习stm32、五一抽空跟舍友(陶)一起参加了华中杯数学建模大赛

32我买的也是普中的板子,因为我觉得51录视频的那个老师讲得风格我比较喜欢,所以32我也选择了普中。说句实打实的,我学32的时候没有注重32相关外设的基本知识,只看重开发板上的结果,代码也没有自己独立写过,基本上都是使用开发板出厂对应实验的源代码,也没有注重相关知识点的联系。学得时候一直在“赶”,学得一点也不扎实,“赶”的原因也有在7月的电赛我想多认识一些32的外设,看到时候参加比赛的时候能不能用得上。整个过程其实就是没怎么动脑子,基本上都是看完对应的教程视频,把代码烧到开发板里看看结果就结束了一个实验。以至于我走完全部的实验,我面对32的时候心里都是发虚的,还是无法自己独立完成项目。而且我也没有像51那样做一些小的项目或者独立于开发板的实验,以至于现在那块32的板都是好新的。对SDK里的函数也不太熟悉,对我来说没有参考,独立写出一个实验的代码来几乎是做不到的。

图 14 普中的32玄武板

劳动节的时候我的舍友带着我参加了华中杯的数学建模大赛,这也是我第一次参加数学建模大赛,小白一个。基本上都是我那个舍友带着我走,最后分工也是我写论文,他建模和用matlab来算结果。说句实话结束后我也不太清楚做了什么,没什么概念,模模糊糊就这样过了三天。但是还好队友强,带飞得了个三等奖,我也非常感谢他,这可能是我唯一一个数学建模的奖了。

 图 15 证书

六月:基本上都是在准备期末考试、实验报告、数字电路的课程设计等,单片机也摸得比较少,相当于这个月我也没怎么做自己的事,完成的都是学校里布置的任务。

图 16 数电课程设计-电子时钟

七月初:跟舍友(邱)一起准备电赛初赛

这也是我上大学第一次参加自己专业的相关比赛,时间有限我和舍友只有七天的时间完成作品,电赛的题目是开放的。我和舍友就做了一个基于openmv、stm32的智能分拣小车。Openmv上有一个32来处理摄像头传回来的数据、物体颜色的识别和小车的运动,通过2节1.5V的干电池进行供电(没有买官方的锂电池,openmv也是二手淘的);我们又用了一个32最小系统板(stm32f103c8t6)拿来控制机械臂,两个32通过串口进行通信。当openmv上的32识别到对应的颜色后,通过串口发送对应的数据到32最小系统板上,然后控制机械臂完成相应的抓取和释放动作,并通过oled显示像素的中心点。车身的主体用的还是51小车,稳压模块是自己在嘉立创打板制作的。

图 17 舍友组装机械臂

图 18 舍友在焊接

图 20 调试oled显示的像素中心点

图 19调试串口相关代码

图 21 小车最终形态

图 22小车夹取物体

图 23散热没做好,两个风扇给稳压模块散热

这个是我入门嵌入式第一个可以搬得上台面的项目了,虽然说没有什么太多的这新意,比赛的时候也被刷了下来。但这个项目和这段经历对我来说有着不小的意义。这也是我第一次和队友一起完成一个项目,以前做事我总想着一肩挑,但回过头来想一想我一个人的话是真的完成不了。像硬件的组装、画PCB、整个小车的布局和一些线的连接、电源的选取这些偏硬件方面的都是我舍友完成的。我就是偏软一点,把各个模块的功能的代码编写并调试好最后整合起来。出现bug的时候我们两个人一起找,有时候一个上午或一个下午只能解决一个问题,但解决完一个问题后恍然大悟,总结起来就是日后的开发经验。其次这段经历稍微弥补了一下我32项目开发的欠缺,与此同时我们两个之前也没有搞过摄像头之类的硬件,借此机会体验了一下,并巩固了一下Python的基础语法(openmv上的32芯片使用Python编程的)。总的来说这7天的收获是挺多的,这段经历挺宝贵的。还有一点就是我32的学习到这也先告一段落,之后的学习和展开围绕的基本上都是Linux。

七月中旬-八月中旬:自己定制第一块PCB板、学习韩顺平老师Linux的教程、走进Linux

我对打板这一流程不太熟悉,趁着电赛刚结束我试着自己画画PCB,在嘉立创自己下单,熟悉一下整个制板的流程,电路图我是用官方的,PCB就自己画,板子被画的是“千疮百孔”。好在最后检查电器属性之类的没有报错,也是可以成功下单打板。

图 24 下单界面

图 25 PCB图

图 26 实物图

结束完打板体验之后,我就开始了Linux的学习。我一开始的想法是走嵌入式Linux,但是那个时候我了解的也不太多,对虚拟机、Linux也没有一个很清晰的认识。我就这样想不管学什么,总归要先学Linux下的一些基本命令、熟悉这个操作系统之类的。所以我也就没有先直接去看嵌入式Linux相关的教程和买对应的Linux的开发板,而直接找了个通用的Linux教程。最后选择了尚硅谷韩顺平老师录制的Linux教程。(韩老师现在是自己办公司)

图 27 Linux教程文档

图 28 B站视频

学完之后我发现韩老师还发了一个独立于尚硅谷,自己做的一个Linux教程。我看了看这个教程大体和之前的教程差不多,就是在后期添加了一些其他高级的应用和面试题,类似于对之前所学的命令的总结和灵活运用

图 29 Linux新增内容文档

图 30 Linux新增内容视频

大二上学期之前我不太了解Linux这样的操作系统,有时候看见其他人在黑框(终端)里面敲命令就感觉特别帅。在学习完韩老师的课程后也能做到通过命令在Linux中实现一些基本的功能和操作。韩老师不仅带我走进了Linux,更重要的是告诉了我“我亦无他,惟手熟尔”、“老黄牛”这些学习的道理。

图 31 卖油翁、老黄牛

八月中旬:趁热打铁学习了MYSQL数据库,可以写出一些基本的SQL语句、学习了一些网络相关的基础和计算机硬件方面的知识。

图 32 韩老师Mysql教程文档(Java教程中的一章节)

图 33 Mysql教程视频

我也知道我对网络相关的知识比较欠缺,我就看看了韩老师讲Java教程中网络的相关部分,也解决了许多之前的疑惑和不解。

图 34 网络基础视频

图 35 网络基础文档

我对计算机硬件方面的知识不太了解,而且快9月份开学了,我就当了解常识一样看看了Micro_Frank的计算机硬件基础教程,这教程讲得通俗易懂,收获也是挺多的,补了补一些常识。

图 36 计算机硬件基础教程视频

九月:买了正点原子的Alpha开发板、正式走进嵌入式Linux的领域

首先花了一个月的时间学习IMX6ULL对应的裸机教程、这一阶段基本没有用官方的SDK包,都是直接看参考手册直接配置相关外设的寄存器,这一个月相当于补了学习stm32偷得懒、开始写博客来记录、总结出现过的问题。

图 37 点亮第一个LED

在学习裸机的这段时间内,让我头大、印象比较深的就有两个实验。一个是外部中断,另一个是LCD驱动。外部中断的那个实验我特地写了篇博客来回顾整个实验代码编写的思路,多了哪些关键性的文件。之前在学习stm32的时候没有涉及中断向量表、中断向量偏移等相关内容,这些都是ST公司帮我们事先写好的。学习完本章后,我对I.MX6ULL的GIC控制服务、中断处理流程、GPIO关于中断的寄存器都有了一个更深的理解,对C语言中的函数指针、结构体数组的知识也进行了复习、巩固。在这期间我更注重I.MX6ULL外设的基础知识,翻参考手册也更勤快,没有像学32那样只注重一个实验结果而草草了事,真正学到东西,好像再学了一遍32。

图 38 博客总结外部中断实验

然后还有一个就是LCD的驱动实验,左盟主手把手带着写,最后还是理清了整个编写的思路和流程,也是第一次写完整的LCD驱动。但最让我纠结的是LCD内的画线函数,我不是很喜欢正点官方提供的画线函数,不能控制线的粗细,然后我就自己想写一个,结果一个函数写和调试就差不多花了一天。

void lcd_mydrawline(unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2, unsigned int color,  unsigned int linesize)
{unsigned int xmin=0, xmax=0, xequ=0;    //两点中的最大和最小,当x1=x2时用到xequunsigned int ymin=0, ymax=0, yequ=0;unsigned int i=0, j=0;if(x1 < x2){xmax = x2;xmin = x1;}else if(x1 == x2){xequ = x1;}else{xmax = x1;xmin = x2;}if(y1 < y2){ymax = y2;ymin = y1;}else if(y1 == y2){yequ = y1;}else{ymax = y1;ymin = y2;}if(x1 == x2){for(j = ymin; j <= ymax; j++){for(i = xequ - 2; i <= xequ + 2; i++)lcd_drawpoint(i, j, color);}}if(y1 == y2){for(i = xmin; i <= xmax; i++){for(j = yequ - 2; j <= yequ + 2; j++)lcd_drawpoint(i, j, color);}}if(((x1 != x2) && (y1 != y2)) == 1){for(i = xmin; i <= xmax; i++){for(j = ymin; j <= ymax; j++){if((((j-y1)*(x2-x1)-(y2-y1)*(i-x1)) <= linesize) || (((y2-y1)*(i-x1)-(j-y1)*(x2-x1)) <= linesize)){lcd_drawpoint(i, j, color);}   }}}}

这个函数传入的参数有两个点、颜色和粗细程度,编写的主要思路就是要使用到初中学的直线方程的两点式。两点式要求的直线不能是平行X轴或平行Y轴,去除掉这两种特殊情况后就可以使用两点式方程了。因为LCD上的点都是离散的,而直线方程上的点是连续的(我到后面才回过神来,想到这个问题)。我想说的是如果直接用点在直线上来判断是否画这个点条件会太强了,在一定范围内的点,我都当做是这条直线上的点画出来,这样的话就可以控制线的粗细了。有了画线函数,其他一些简单的图形也就可以画了。

图 39 LCD画一些基本的图形

十月-十月中旬:开始了uboot、设备树、内核的移植,根文件系统的构建

在这一过程中我碰到的最大的拦路虎就是网络相关的问题,之前学习51和32的时候没有用过网络相关的功能,对我来说这是一个全新的领域。下了功夫,也吃了一些苦头,印象最深的就是uboot无法通过nfs从ubuntu下载文件。好在最后通过大佬们博客的指点和正点原子的技术客服的解答解决了问题。解决之后也写了一篇博客进行总结,也帮助了其他人解决了相似的问题,而且第一次登上了运维领域的日榜,对我来说是一个莫大的鼓励。

图 40 第一次成功移植好NXP官方的uboot

图 42 tftp成功下载内核

图 41 uboot成功通过nfs从ubuntu中下载文件

图 43 文章登上日榜

图 44 最终移植好uboot、zImage、dtb,挂载好根文件系统

十月中旬-十一月底:学习了IMX6ULL的底层驱动开发

学习了许多驱动框架、子系统(input子系统、gpio子系统、platform驱动框架、MISC驱动框架、IIC驱动框架、SPI驱动框架等)和设备树下相关设备节点的创建。对我来说这段学习经历大体可以分为两部分,以学习SPI驱动框架作为分水岭。在学习SPI驱动框架之前的实验代码都是可以自己编写的,之后的基本上都是移植第三方库、使能内核自带的驱动(触摸屏、CAN、USB、音频),更加注重内容理解和工具的使用。

随着学习的深入,我对出现过的设备文件、设备树下的节点、节点中的属性信息、一些结构体中的成员变量、一些文件的作用有点搞不清了、有点混乱。对此我也写了一篇博客进行梳理。

图 45 相关目录、文件梳理

图 46移植好Mplayer后试着播放视频

在这期间有一个FPGA的课程设计、也体验了一下FPGA的板子。因为确定以后不走这个方向,花了三天时间完成课程设计之后就继续了驱动开发的学习。

图 47 FPGA点灯

十二月:学习了嵌入式Linux的C应用开发、主要分成了三个阶段。

第一阶段就是脱离开发板、学习一些系统调用、标准的C库,文件IO的操作、进程、线程、信号等相关知识,对程序在内存中的分配有了更深的理解和感受;第二阶段就是通过C应用开发来控制板载资源,在这一阶段主要工作就是移植第三方库和学习对应的库函数tslib、libjpeg、libpng、alsa-lib、和socket的简单编程;第三阶段就是学习了cmake,解决了Makefile直接编写困难的问题,可以通过cmake来生成Makefile来管理项目。

图 48 程序在内存中的分布

图 49 移植过的一些第三方库

图 50 cmake设置交叉编译链

非常感谢你能看到这,写到这其实差不多就结束了。说句实话作为一个电子人我起步算是比较晚的,但好在这一年大方向没有错,学习的路线也比较清晰、时间也把握住了,这也可能是我大学中最重要的一年。2022快要过去了,在这定一个小目标,大三结束后能在广州找到一个嵌入式Linux方向的实习岗位。也祝CSDN的小伙伴们新的一年天天开心、身体健康、无灾无难、代码没有BUG。

2022年终总结(学习篇)相关推荐

  1. 2015年年终总结学习篇:为了梦想不服输,再苦也不能停止脚步

    程序设计语言 C++阶段(2015.02.01---2015.03.21) 这是我最先接触的高级程序设计语言,当时仅仅知道C和C++,和我同一时候进入大学的一个计科系同学,他学的是C, 而我学的是C+ ...

  2. 2022年终总结与展望

    2022年终总结 自2019年3月13日入驻CSDN,已经三年零九个月了.截至2022年12月31日,CSDN博客已发原创博文112篇,粉丝3616个,访问量超过157万次. 2019年12月31日数 ...

  3. 车载Android程序员的2022年终总结与转行建议

    不知不觉间2022年只剩下几天了,这意味着我即将迈入30岁的殿堂,作为一个搞车载的程序员,而立之年感受颇多,简单分享一下2022年的个人总结. 回顾2022 2022年对我而言,是很糟的一年,2021 ...

  4. 2022年终回顾与总结:螃蟹走路-冲,撞

    工作赚钱,养家糊口 << 2022年对地球上的人类来说,肯定是刻骨铭心的纪元.对于微小的个人而言,感受是真真切切的.固然全球疫情危害了劳苦大众,但家庭给我的触动却是直接和深刻的. 这一年的 ...

  5. 2022最新软件测试学习路线图

    2022最新软件测试学习路线图! 正在学习或者考虑学习软件测试的小伙伴们有时候是不是觉得很迷茫,学习了软件测试职业到底有哪些发展方向呢?又需要学习哪些内容,掌握到什么程度呢?学习过程中,学习路线是必不 ...

  6. 软件测试2022年终总结

    2023年即将来临,节前把2022年终总结写了 今年与往年不一样,时间紧,工作任务比较重.比以前早半个月动笔.今年的疫情管控相当严,导致很多厂顶不住关闭,大厂纷纷裁员...国内外皆如此.. 今年在中级 ...

  7. 2022年终总结【毕业总结】

    前言 这大概是我第一次写年终总结吧,从18年毕业到现在也差不多是个有4年半工作经验的程序猿了,但好像无论是从生活还是工作和毕业时似乎没有太大变化.我也焦虑过.迷茫过,但要说会不会觉得有遗憾或者后悔似乎 ...

  8. 2022年终总结、展望2023

    2022年终总结.展望2023 前言 一.2022年工作成绩 二.2022年工作不足即如何改进 三.可以传承的工作方法或者经验 四.2023年工作目标 (目标细化.可落地) <font colo ...

  9. 2022年Java学习路线图,精心整理「史上最全」

    前言: 很多老铁经常问我:哪些是适合Java零基础学习的视频?应该先学哪个后学哪个?等等问题. 那么,怎么解决这些疑问? 一个系统的Java学习路线正是你最需要的,这也是为什么很多前期自学的小白们到处 ...

  10. 2022年Java学习路线图,精心整理

    前言: 很多老铁经常问我:哪些是适合Java零基础学习的视频?应该先学哪个后学哪个?等等问题. 那么,怎么解决这些疑问? 一个系统的Java学习路线正是你最需要的,这也是为什么很多前期自学的小白们到处 ...

最新文章

  1. java执行器是什么_Java 并发编程:任务执行器 Executor 接口
  2. 00018计算机应用基础2019年4月,2019年4月自考计算机应用基础考前试题和答案00018.pdf...
  3. hadoop window 搭建
  4. System.DllNotFoundException: 无法加载 DLL“GdltaxIA.dll”: 内存位置访问无效。 (异常来自 HRESULT:0x800703E6)。 WIN7系统
  5. 【CV学习笔记】色彩空间
  6. python math库基本函数
  7. webshell及木马详解
  8. python esp8266 ssd1306_micropython esp8266+ssd1306(OLED) 显示中文(示例)
  9. mmap内存映射用法总结
  10. mysql建表语句转换成oracle,如何手动将ORACLE的sql建表语句转换为MYSQL的建表语句...
  11. 湖北广电机顶盒(九联HDC-2100K)安装第3方app保姆教程
  12. 360一键root su浅析
  13. 服务器网卡信息BIOS中设置,bios设置如何关闭网卡
  14. 使用 npm 打包项目
  15. win7网络共享连接计算机需要密码,win7系统共享打印机需要用户名和密码的解决办法...
  16. 总结:MUSTer中的keypoint matching以及利用RANSAC去除outliers
  17. MPLS 次末跳弹出配置_中东版2019款三菱帕杰罗V97配置详情介绍
  18. python中def _init_是什么意思_python3类中的def __init()__如何使用?
  19. 头条小程序 button组件 设置边框问题
  20. 网狐大联盟创建没反应修复

热门文章

  1. Google hack语法
  2. 微信团队分享:微信每日亿次实时音视频聊天背后的技术解密
  3. 如何搭建网站?第二步:购买服务器域名
  4. python敏感词过滤代码简单代码_Python 实现王者荣耀中的敏感词过滤示例
  5. Windows 平台下局域网劫持
  6. 嵌入式软件工程师面试题及答案
  7. 35、ubuntu20.04搭建瑞芯微的npu仿真环境和测试rv1126的Debain系统下的yolov5+npu检测功能以及RKNN推理部署以及RTSP视频流解码
  8. python 之 for 循环
  9. lvgl 8 中文内置字库配置
  10. 5G NR Polar码简介(一)