单片机的学习——嵌入式篇

准备——工欲善其事,必先利其器

如果你想学习单片机,一块开发板是不可或缺的,刚开始学习的时候,我用的板子是正点原子 的STM32F103RCT6这块开发板,板子功能不多,但是用于初步学习是刚好够的。单片机的学习——嵌入式篇_第1张图片

下单这块板的同时时, 你可以得到一个资料包,里面的东西基本会陪伴你的整个学习阶段。
单片机的学习——嵌入式篇_第2张图片
得到板子后,首先要做的就是将编辑程序的keil软件安装好,安装好之后要对软件进行处理,安装包就在上面链接中的资料包里面
1,破解这个 软件,下载keil 注册机破 解软件(破解之后才能正常使用)
单片机的学习——嵌入式篇_第3张图片

2,安装J-LINK或ST-LINK的驱动程序(用于软 件一键下 载功能,而不是使用flyMCU)

单片机的学习——嵌入式篇_第4张图片
在这里插入图片描述
(load可实现一键下载功能)
补充:下载方式分为两种:SWD和JTAG,一般都会推荐使用SWD,因为占用IO口数量少,而推荐大家购买的板子配套的烧录器是JTAG的,大家可以自己购买SWD方式的烧录器,只会占用4个IO口,使用起来也很方便

3,安装CH340串口驱动 程序(用于串口打印)
单片机的学习——嵌入式篇_第5张图片

入门——程序下载

正点原子给的资料包里面有程序源码,用keil软件打开后可以进入程序编辑,程序是已经设计好了的,这里值得说明的一点是程序分为库函数版本和寄存器版本,学习的时候基本都是解压库函数版本,二者的区别就是库函数版本是为了让学习者更方便学习从而对寄存器版本进行封装后便于理解的一个版本。刚开始看这些代码的时候你会发现和C语言有些许不同,但是别担心,这些都是基于C语言开发的,本质没变。

例如:定义变量常用的u8,u16,u32都是通过typedef分别对char,short,int定义新的类型名,u表示无符号unsighnt,8表示8位(1字节),然后你就会开始了解串口,中断,按键,看门狗,LCD,延时,时钟,端口复用与重映像,定时器,IIC协议,SPI协议等等,学习这些东西的时候不要埋头就开始去理解它的库函数API为什么这么写,也不要埋头扎进视频开始无休止的视频学习,过程中我也不建议做笔记。而是学习很重要的一点,知道这个库函数要实现什么功能,然后尝试去修改参数,将程序编译后烧进板子里面观察变化。例如:你最开始学的跑马灯程序,这个程序实现的功能就是让红灯和黄灯交替不停地闪动,而你就可以修改延时函数的参数从而改变闪烁频率,在这个程序中你也会发现里面会有延时函数delay_init();LED_init();等等,而这两个函数功能是对延时函数和LED所使用的IO口的初始化,这里不初始化,调用就不生效。然后回到宏观视角,你会发现程序的框架是由主函数main+while(1)死循环构成,1在这里只是一个条件,我们也可以按需修改。而你的整个程序执行完成变量定义以及函数初始化之后,便进入while循环中,并且你的底层最后也是停留在while循环中不断地从上往下依次执行

进阶——设计程序完成小功能

在对前面部分的充分了解后,你就可以开始自主学习设计程序完成一些小功能。我开始的学习的时候完成了一些小功能
1,通过上位机(串口调试助手)下发命令到单片机,让单片机的LED闪烁频率产生变化,如:发送1到单片机就是1秒闪一次,发送2就是1秒闪两次。发送数据就是闪烁的频率(这个小功能你得对串口和LED灵活把握才能实现)
2,实现对EEPROM的存取,存储指定数据,如电话号码后,发送指令就能读取这个电话号码,并且这个部分你得掌握数据存储函数的库函数
3,通过LCD显示时间的动态变化,和手表一样
4,利用CAN通讯和发动机电脑版产生交互(这个部分已经涉及专业领域,需要相关的数据资源才能实现)
5,通过按键实现LED的开关
…………等等
当你能够自主完成以上功能之后,你就已经能够把握住对于单片机学习,这个时候你需要开始学习做项目。

过程中希望你能自己创建一个文件去完成这些功能,其实库函数都是已经写好的,你只需要将其移植过来自己使用就好,值得一提的是
1,在这个位置包含程序路径在这里插入图片描述
2,在这里添加程序源码单片机的学习——嵌入式篇_第6张图片

正式入门——自主完成项目

你要真正入门单片机的学习,一定要自主完成一个项目,这个过程中你的收获是最多的,同时你也会发现各种各样的难题等着你去克服
这里分享一个自己做过的小项目——山体滑坡检测,实现过程就是,多个子节点发送传感器采集的角度加速度数据到一个主控节点,主控节点通过4G模块发送到后台服务器,进行数据分析处理。过程中,子节点和主控节点的板子是我自己设计的
单片机的学习——嵌入式篇_第7张图片
这个是板子的硬件仿真图,看起来觉得复杂,其实非常的简单,在另一篇文章中我会介绍怎么做简单的双层板硬件。

然后就是底层的程序,程序设计这部分曾让我花费了大量的时间
单片机的学习——嵌入式篇_第8张图片
上面是我项目的部分源码,这个程序是带了freertos实时操作系统的,前面所说的while循环是一个前后端系统,所谓前后端,就是程序只能依次执行,不管后面的函数有多着急需要执行,也只能等前面的函数执行完成之后才能执行。而freertos则相反,你的每个重要函数可以写作一个任务,这些任务最终在程序运行的时候可以同时被执行(操作系统,本质上并不是同时,不延申),就不会存在前面的情况
过程中你一定要坚持,每天给自己定一个小目标
单片机的学习——嵌入式篇_第9张图片
这里我每天都会将完成和未完成的写下,并写下今天需要完成的部分。不断的解决这些小问题,最后就能解决所有的问题。

整个项目我负责的部分是底层硬件的设计以及嵌入式程序,这个过程中收获很多,克服很多困难,但最大的收获莫过于收获对于学习这一块知识的自信

深入学习——了解底层原理

学习一定要结合生活中的硬件产品,尝试去了解这个硬件产品怎么实现这个功能的,例如我们都知道很多硬件产品都会又长按某个按钮实现重启的功能,这个时候就需要思考这个功能是怎么实现的,其实很简单,方法之一就是:通过看门狗的功能,让按钮长按时实现延时,只要延时超过看门狗的设置的时间,就会重启设备。

作为一个嵌入式程序员,如果不能了解底层原理是无法走远的,我们在学习嵌入式程序的时候也要去了解底层实现的原理,例如三极管,MOS管,电容,电阻等等模块的原理以及他们如何搭配PCB板子实现相应功能。如果有条件,希望大家能够自己买烙铁,热风枪,焊锡,助焊膏等等,尝试自己焊接硬件,焊接芯片,这个过程中你对于硬件的掌握会更上一层楼

对于嵌入式学习的个人感受

学习技术这一块,最重要的就是认清自己的能力,那样你才能走得更远,不管做了多少项目,一定要戒骄戒躁。韩寒说过一句话:“这世界没有毫无道理的横空出世,如果没有大量的积累,是不可能把事情做好的,搞不好,你以为的极限只是别人的起点”。学习的最高境界就是自学,这是我们初中老师告诉我的,这也是一个做技术的所必须掌握的,前面介绍的时候,我并没有把很多东西讲清楚,因为做技术,你必须要有解决问题的能力,从网上获取有用信息的能力,一昧地依靠别人给的资料是不可能做好事情的。同时你要学习获取知识的方式,正点原子有自己的论坛——开源电子网,我们可以在上面发帖子和大家交流学习
单片机的学习——嵌入式篇_第10张图片
这是我发的帖子,大部分问题都已经被解决,这也是学习的方式之一。
同时我们地熟练地掌握CSDN上的资料,有些博主写的东西非常好,这里我也推荐一个博主给大家,我本人也在通过他的文章学习单片机,同时大家一定要有收藏好文章的习惯,不懂的时候就反复的看
单片机的学习——嵌入式篇_第11张图片
做技术就是敏而好学,不耻下问,你永远都会有不懂的地方,永远都会有需要帮助的时候,只有真正掌握了这些技术,你才能弥补一点点自己的知识盲区。

还有很重要的一点就是学习环境,我的专业是软件工程,学校根本没有教如何写嵌入式程序和设计硬件。我学习单片机和硬件的整个过程也不是在学校完成的,而是在长辈的公司里面自主学习。我也尝试在宿舍学习,可是最终发现根本无从下手,于是我就放弃了宿舍这个环境,所以大家一定要尝试找一个适合自己学习的环境。大学里面,如果你不考研,不考公务员,父母没有给你安排好工作,总之,就是你需要依靠自己的能力去找工作,那我希望不论你从什么时候开始,一定要知道自己需要的是什么,要得到什么,要放弃什么。我学的是单片机和硬件,那我的前端和后端的学习课程都是及格就好,如果你没有多余的时间,就不要考虑奖学金这些,埋头好好学习这些以后工作需要的技术才是你的选择。过程中,一定要去参加学校的比赛,如互联网+,挑战杯等等,把技术做好再去参加,才能有收获

上面的文章中,我没有给大家阐述如何在基于不同的芯片设计的开发板中移植程序,如何调试程序,如何优化程序,这些部分就是需要你去获取的

最后,如果可以,希望能找一个人带你学习,那样你会少走很多弯路。如果没有,我们也可以交流学习,写下这篇文章,也是写下我大学三年的经历,我的知识盲区也还有很大很大一块,或许在和大家的交流中,又会学习到一些新的东西。还是那句话,做技术的就是要有自主学习的能力,不管什么方式,只要是自己去获取的,希望你能收获属于自己的那份精彩,初次写博客,希望能给你一些帮助,有不对的地方也望谅解。

你可能感兴趣的:(单片机的学习分享,嵌入式,单片机)