STM32学习路线

随笔

停更了好久啊,有偷懒,但不是完全偷懒,主要还是意识到,自己太菜了,需要补很多东西,以下算是学习中的一些体会吧。

关关难过关关过,成为专家可能需要天赋,成为顶尖可能也需要天赋,但是对于很多人都能做,大多数人都会的东西,真的没有这么神秘,只要愿意花功夫,有什么难的呢,有什么学不会的,大家都是人,两个肩膀扛一个脑袋,万事开头难,会者不难,一路走来啊,从仰望点灯到花式电灯,这是我最大的感悟

最早最早的时候,我最大的愿望是点灯,明白到底怎么点灯的,什么是中断啊,什么是GPIO,什么叫外设,这些好难啊,会这些的人好厉害,都是底层高端人才,真的很难理解这些,后来学完51,初步把这些搞明白了,然后觉得也就那样,51这么简单,大家都会了,还是得玩主流的32

后来把32也学的差不多了,能做许多东西了,然后我又觉得,基于标准库的开发怎么这么简单,这不是是个人,个把月就会的,都是搬运修改就能实现功能,这水平出去找工作也不值钱啊,然后觉得rtOS好高大上,会rtOS的话,应该算有很高的技术含量了吧,后来会用rtOS内核了,明白原理了,又觉得也就那样,也没有想象中高大上

我学STM32的起因是因为我第一份工作做的上位机,做数据采集,而采集用的板子是STM32,那会我是一点不会,什么是DC/AC,什么是模拟什么是数字,什么是GND都分不清楚那种,我就学啊,买了正点原子的板子,跟着原子的视频看,看一段学不下去了,后来搁置了很久,偶然的机会发现了一套真的是0基础的详细系统的讲51的课程,然后我就去跟着这个51单片机的课程学了2个月,每一集都仔细看,看不懂的看几遍,终于算是入门单片机,51啊,课程实际全长71小时,终于入门了,真的是很难坚持,总结一下就是,32学不明白,退回去从51开始。此处告一段落。

51学完了,学32,到处找资料,不知道哪个资料好,完全一点概念都没有啊,然后当时跟我们合作的外包,我们的板子程序包括板子都是一个外包给做的,我师傅走后就由我来跟他对接,然后打交道多了,得知我在学这个,向我推荐了野火的标准库开发指南,然后买了本书,跟着b站的配套视频,把基础篇,中级篇都刷完并且都学会了(例程源码全都明白,能仿写能修改能搬运)。又告一段落。大概也用了3个月吧,因为期间我还在做Qt的上位机项目,在学一些其他的。

接上一段落,32基础和中级学完的时候,我可以在裸机的基础上做数据采集啊,SPI/IIC读写eeprom,flash,PWM输出控制一个步进电机啊,这些都会做了,我就想着用自己的板子复现公司的项目,实现指令下发采集数据,控制继电器开关,控制步进电机,做一个综合的小项目,但是在做的过程中呢,我发现单个功能测试都很简单,但是多个功能组合,涉及指令接收需要做指令队列,不然上位机发送太快,指令就会错误,会不识别,然后还有步进电机是开环控制,我不知道什么时候指令执行完等等一系列问题,因为之前学过linux,想着做成多任务并行的,开始了解RTOS,然后经过各种考量和请教,最终选择了rtthread,基于对野火的信任,买了野火的rtthread内核实现,然后啃书,用了半个月,把rtthread的实现原理和内核使用基本理解,会使用内核,此时又高一段落。

接上一段落,接触到RTOS,就引出一个问题,启动文件,然后思考,32的keil裸机启动文件呢?本着知其然知其所以然的原则,就开始从32的裸机启动文件开始学,好家伙,不学不知道,一深入了解,才发现,自己有多菜,承认自己的有限和无知,确实是非常重要。下面就来讲一讲一些比较重要的感悟和收获:

  1. C语言对RAM的管理策略,比如堆、栈,全局区、等的深刻理解,堆栈的实质
  2. 硬件的一些差异,比如SRAM,DRAM,norFlash,nandFlash等等,由于硬件差异导致的启动方式不同
  3. ARM寄存器,PC、SP、LR等等,总的来说就是ARM体系结构与一些简单的汇编
  4. 多任务系统和裸机的差异,多任务系统的实现策略,如何进行任务切换,任务切换的时候,ARM寄存器的调用规则,什么是保存现场,恢复现场,如何保存如何恢复,深刻理解任务切换,CPU分时复用的本质
  5. 编译器,keil用的是ARMCC,可以尝试用ARM-GCC-eabi编译,搭建属于自己的diy开发环境,但是这涉及到,makefile的知识,ARM-GCC编译器使用,链接脚本(这块目前还没学,只能使用别人提供的,教程也非常少,据说是要看一些重定位啊,代码分区之类的,最近准备学,真的资料非常少,更别说教程)

大概都了解这些,明白这些之后,话题回到为什么选择rtthread,因为rtthread不只有一个内核,还有驱动程序框架,在框架之上提供丰富的软件包,比如mqtt、lwip协议栈、文件系统等等,我深知,这些东西如果是依靠裸机自己移植bsp使用的话,难度会有多大,工作量和学习量都是不简单的,因为比如你在f103想使用以太网的话,给你配一块以太网芯片和网口,但是写bsp的以太网驱动程序大家可以去了解一下,资料都非常少,更别说教程。

so,标准库玩明白,能用裸机做一些东西,通过常规芯片型号,基于keil+标准库的移植和开发,这个时候,实际上,只是学习的起点,这才算是真的入门,想要进阶,必须ARM,最为直观的感受就是,当你开发的时候使用的文档,从最初的中文参考手册+数据手册,进阶到M3权威指南,然ARM体系结构与编程。

上面的东西不是要全部背,就是理解,实际上工作中很少用那些东西,可以说基本用不到,但是如果不理解的话,永远都只是知其然不知其所以然,永远只会照葫芦画瓢,换块板子换个平台就玩不明白了。

当达到上面的东西基本都理解后,就可以开始着手阅读rtthread的源码了,先看野火的书,了解内核的大概构成和实现原理,然后学会内核使用,然后开始尝试看驱动框架和驱动程序,这部分比较难,不是逻辑难,而是操作系统本身为了更多的兼容和更容易移植,使用了很多宏定义、宏函数、还有很多冗余臃肿的代码,但是没办法,最好的学习资料就是源码,有空看一点,说不定哪天就看明白了呢,都是精髓啊。

也在学linux的知识,目前是应用层编程撸完了,裸机的差不多了,就差uboot和驱动,算是简单的知识框架版图就完整了,后续就是选择某个方面精进了,其实目前主要的工作是上位机开发,用的Qt,比较擅长的也是QT,但是时间长了,QT做起来很没劲,成长路线第一年很陡峭,后面就非常缓慢了,还是希望在板子方向长远走,工作也忙,学的很慢,加油加油

还有的话就是,从学习的角度来说肯定是STM32最为合适,资料多,教程多,但是由于这两年芯片涨价的原因很贵,快要接近linux的板子了,这价格算是很不合理,大家如果自己做东西的话可以关注一下ESP32,20块就能买板子,模块可能就几块钱,我认为这个价格很香,然后功能也足够强大,就是开发需要一定基础,使用的话比STM32会要求高一些

1 前述

对于什么是单片机什么是外设什么是时钟之类的基础问题就不在赘述,按照常规的学习路线,当然也是最容易上手的路线,就是学习标准库,基于库函数来开发,然后再学习片上系统,我自己就是,毕竟标准库这么方便,对于工作中如果你用到了STM32,那么这是最棒的选择,我将32学习理解路线分为以下几个块,如果你都理解了说明你已经入坑,但是对于学习来说,对于有追求的技术佬来说,这才刚刚开始……

本系列从GPIO开始,一篇一个外设,学习标准库的源码和寄存器

2 时钟树

时钟树是什么树?我的理解是,时钟树其实就是一个抽象出来的电源管理框架,在实际物理中所有的外设都有一个电源开关,当你想使用一个外设的时候,就去使能,也就是打开这个外设对应的电源开关,我们从逻辑上将所有的开关抽象为一棵树,就变成了时钟树,为什么搞这么复杂呢?51单片机就没有,这主要是跟功耗有关,因为嵌入式设备在很多场合都对功耗较为敏感

在这里插入图片描述

3 标准库

  • 什么是标准库结构,简单来说就是熟练理解标准库各个文件的作用,我说的不是背下来,而是能够在用的过程中对标准库的框架有明确的认识,如果没有这个标准库,让你自己建立一个简单的库封装,你能做到吗,能够不使用例程模板,自己从0开始下载标准库源码过来,自己建立一个标准库的工程,能够查阅数据手册,通过数据手册的地址映射表,然后将外设实际地址使用库的方式封装起来。

  • 能够使用标准库玩起来,基于标准库写各种外设的bsp(板级支持包)

4 启动文件详解

这是理解STM32质变的一步,我们使用C语言开发单片机,C语言有其独特的内存管理方式,对于单片机的RAM,使用汇编语言创建C语言的运行基础,堆、栈初始化,中断向量表、以及系统时钟初始化等等,最后才转到main,进入C的世界,当然这里只是简单的叙述。

5 ARM体系结构

因为STM32本身是ARM内核的,其遵循ARM的结构和编程方式,比如ARM的寄存器,我们通过调试仿真就能看到这些寄存器的值,把这部分玩明白,然后学习一下片上系统,能够通过上面几个部分的知识移植一个简单的系统,估计就差不多成老油条了,从32的角度来说,到这的话,做什么就看以后工作相关了,对了还有MDK的编译过程和各种编译文件详解,尝试自己去使用命令行编译

纯原创手撸,力求通俗易懂,精炼,更新比较慢,大家见谅!

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值