STM32学习路线

2023-05-16

随笔

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

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

最早最早的时候,我最大的愿望是点灯,明白到底怎么点灯的,什么是中断啊,什么是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的编译过程和各种编译文件详解,尝试自己去使用命令行编译

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32学习路线 的相关文章

随机推荐

  • 金融机构如何应对核心系统分布式智能化升级大潮?

    过去40多年 xff0c 中国金融业实现了技术上的引进 借鉴 xff0c 并逐渐开始进行原创性创新 比如 xff0c 在 支付系统建设方面 xff0c 我国现在就走在了世界的前列 从二代大小额支付系统CNAPS到跨境人民币支付系统CIPS再
  • ajax请求中session无效的问题

    遇到一个问题 xff0c 发现网站中的所有ajax在某个服务器中的session总是无效 xff0c 后来同事查了资料 xff0c 原来php的配置文件中有个选项 xff1a Whether or not to add the httpOn
  • 解决seesion在二级域名下无效的问题

    开发中遇到了一个问题 xff0c 当用户在www aa com登陆了 xff0c 在二级域名下的登陆无效 例如 aa com 后来检查了很久 xff0c 终于知道了问题所在 xff0c 在www aa com下生成的cookie不适用于 a
  • 提供全球商家信息的网站

    做LBS的应用 xff0c 商家信息的获取和维护是个很重要的问题 xff0c 在中国的某些大型网站是雇佣了兼职人员去维护这些数据 xff0c 但对于小公司来说这种方法是不现实的 现在发现了一个网站 xff0c 提供了全球的商家信息 xff0
  • 使用web端连接xmpp

    在apache的配置文件中加入下面3句 xff1a ProxyRequests Off ProxyPass xmpp httpbind http 127 0 0 1 7070 http bind ProxyPassReverse xmpp
  • ubuntu apache开启重写模块

    http www iblue cc 2011 09 ubuntu apache E5 BC 80 E5 90 AF E9 87 8D E5 86 99 E6 A8 A1 E5 9D 97 Ubuntu下apache2的rewrite模块默认
  • openfire xmpp 如何判断用户是否在线

    http iammr 7 blog 163 com blog static 49102699201041961613109 想象中如此简单的功能 xff0c 想不到却这般大费周折 如要实现 xff0c 必须先确保 xff1a 1 openf
  • sql 分组统计

    原始的数据结构是这样的 xff1a 这是一个信息表 xff0c 记录下每个app每天对应什么等级 现在需求是 xff1a 统计每天每个等级有多少个app xff1f 实现的sql如下 xff1a select count as num le
  • Errors running builder JavaScript Validator的问题

    http jc dreaming iteye com blog 1038995 最近使用eclipse时 xff0c 在编译项目总是出现问题 Errors occurred during the build Errors running b
  • coreseek索引更新机制

    k索引更新机制 版权声明 xff1a 转载时请以超链接形式标明文章原始出处和作者信息及本声明 http fatal blogbus com logs 45153968 html 61 61 xff0c 昨晚太晚睡觉 xff0c 所以日记又没
  • golang生成自定义标签名(带CDATA标识)的xml

    在golang中 xff0c 有时候需要生成带CDATA标识的xml值 xff0c 例如这种 xff1a lt xml version 61 34 1 0 34 gt lt xml gt lt to User gt lt CDATA use
  • 有人痴狂,有人跑路,开源软件新一年的冰火两重天

    最近有关开源软件的话题始终占领着IT界的新闻头条 xff0c Log4j开源软件的惊天漏洞 xff0c 才刚刚出现不久 xff0c Fake js的作者也惊天删库跑路了 xff0c CurL的作者怒怼苹果只会白嫖开源却不出力 xff0c L
  • linux下通过ssh用户名密码的rsync传输文件方法

    一般用rsync传输文件都会使用密钥的方式实现免密码验证 xff0c 但有些机器由于特殊的原因 xff0c 不能配置密钥 xff0c 这时就要用ssh的用户名和密码方式使用rsync 1 首先 xff0c 通过ssh 命令登录一次远程的主机
  • codeigniter验证码类库

    http hi baidu com mediumgirl item c734b8f5a1cacfc3a835a2ae 折腾了我四五个小时 xff0c 终于 xff0c ci的验证码类库成功的整出来了 下面请看源码 xff1a 在applic
  • golang json.Marshal 特殊html字符被转义解决方案

    pages goods goods gid 61 56 amp code 61 1 会在转json中变成pages goods goods gid 61 56 u0026code 61 1 解决方案 xff1a content 61 str
  • mongodb 错误src/mongo/db/query/plan_enumerator.cpp的修复

    某个mongodb 3 2的库执行下面的查询就报错 xff1a db 34 xxxx 34 find 34 createdAt 34 34 gte 34 34 2019 04 23T00 00 00 43 08 00 34 34 lte 3
  • MySQL新建用户,授权,删除用户,修改密码

    http www cnblogs com analyzer articles 1045072 html grant all privileges on test to test 64 96 96 identified by 39 1234
  • HTTP/HTTPS, without index.php, using htaccess, plus XHR

    http ellislab com forums viewthread 86113 Removing index php and forcing HTTP HTTPS I have read many posts about people
  • 解决mysql返回的字段值全变成string型的问题

    使用php的CI框架的时候 xff0c 发现在数据库中是int型的数据 xff0c 返回的时候全变成了string了 对于弱类型的语言来说 xff0c 这个没多大关系 xff0c 但是 xff0c 如果是用于其它语言 xff0c 例如obj
  • STM32学习路线

    随笔 停更了好久啊 xff0c 有偷懒 xff0c 但不是完全偷懒 xff0c 主要还是意识到 xff0c 自己太菜了 xff0c 需要补很多东西 xff0c 以下算是学习中的一些体会吧 关关难过关关过 xff0c 成为专家可能需要天赋 x