STM32为何在诸多的单片机中脱颖而出?

1、前言

        在STM32之前,都是老大头51,带着它的“小弟们” MSP430、AVR、PIC在单片机界呼风唤雨。那个时候,市场上遍布8位机,大学教材用51入门,个人、企业学单片机基本上也都在用51。

        虽然AVR也有一些8位机市场,但与stc带领下的51单片机是完全不能相比的。当然,这个时候也有16位机的msp430,其他厂家单片机还有pic,高端嵌入式处理器等市场有arm7、arm9等。这个时期的单片机市场是百花齐放、百家争鸣,但总体来说,还是势均力敌、一片祥和的。那么,这个局势是从什么时候开始打破的呢?这还得从物联网的崛起说起。

2、原因

        当时,物联网(Internet of Things,IoT)逐步进入人们的视野范围。随着它的发展,嵌入式领域对于高性能处理器的需求呈现爆发式增长。虽然8位CISC(复杂指令)架构内核8051占据了半壁江山,但奈何其性能低下,寻址范围受限,已经难以适应更多的新兴应用领域。

        而32位架构微处理器内核凭借其极佳的执行效能,不仅能满足物联网对数据处理能力的要求,还能兼顾物联网的低功耗和高性能要求,斩获物联网市场的独家宠爱。在32位架构微处理器中,属ARM公司推出了面向各类嵌入式应用的微控制器核Cortex-M内核受到市场青睐,Cortex-M之于32位MCU就如同8051之于8位MCU。

        而正是Cortex-M的出现,让ST公司看到了这个内核的强大之处——利用该内核设计了大放光芒的STM32,打破了曾经的单片机局面。

3、崛起过程

        如今,我们往回看那段历史,会发现一切改变都由那时发生——从2007年6月11日推出第一代STM32产品——Cortex-M MCU STM32F1开始,单片机市场迎来了STM32新星,32位MCU浪潮,如期而至。

 

        此后,芝麻开花节节高,STM32成功的故事也一直在延续。ST公司陆续在每一年都基于新的内核或者新的技术领域有所突破,发布超过了19个STM32 产品系列,包括一个MPU产品线,生产工艺也从180nm不断进阶到110nm、90nm和40nm。

        例如:

2009年推出了全球第一款超低功耗系列STM32 L1;
2010年推出了第一款在高性能的基于90纳米工艺、120 MHz 的STM32F2产品线;
2011年推成第一款高性能Contex-M4的处理器STM32F4;
......
2019年推出全球最为强大的第一款双核处理器STM32MP1、最新一代混合信号Contex-M4 MCUs和世界上最大的MCU STM32H7;
2020年推出全球首颗内置LoRa收发器的SoC——STM32WL。

       

   “一只南美洲亚马逊流域热带雨林中的蝴蝶,偶尔扇动几下翅膀,可以在两周以后引起美国德克萨斯州的一场龙卷风。”STM32这只小蝴蝶带来的改变效果也很明显。

        2007年ST公司的通用MCU全球排名还只是第11位,2015年便上升到第3位,2018年上升到第2位,2018年则在中国供应商的排名中ST公司一举拿下第一的高地,此后数年,ST的地位几乎无人撼动。

4、如何学习STM32

        如今,STM32堪称爆火,并且潜力无穷。所以,有很多人都在学STM32。但STM32对入门者可能不是特别友好,因为知识很多,但是对于有一定开发经验的人来说,就是一把好兵器,它能帮你大大缩短开发周期。那应该如何入坑STM32呢?

(1) 根据时间表定时定量学习

        大学时期,都有实验室的学长学姐带着入门,安排任务。比如,基本任务是一周内学完搭好环境、熟悉调试软件,结合《STM32Fxxx参考手册》、《STM32固件库使用手册》和光盘视频,实现基本篇的GPIO应用。

(2) 举一反三,并通过阶段任务检查学习效果

        在学习例程时,可以尝试修改该例程的外设配置,达到举一反三的效果。每一周,学长学姐会根据你的学习进度,安排给你一个阶段任务,用来检查你的学习效果。

        如果你是自学,那么可以根据网上教程和各大资源网站上的“STM32入门小项目合集”,主动给自己找一个小项目,把它实现出来。

        这里我推荐正点原子的资源,毕竟每次看视频时的片头曲“我的未来不是梦”让我对STM32充满激情,当然野火、小苗、普中也不错~

(3) 基本外设、功能会用就行,后期需要什么再去针对性地学

        按部就班地把STM32知识从头到尾系统性地学习完,固然很好。但是,你要知道学习单片机只是为了解决问题,我们只要在遇到问题时,能够通过STM32解决就行。

        因此,当你把基本外设、功能都差不多掌握了,程序能跑起来,并且也知道哪里可以修改、修改成什么就已经基本入门了。

此后,你可以通过一些大大小小项目,巩固理解和探索新功能,你的经验也随之增加。

(4) 学好C语言,可以学着画PCB制板、焊接

        软件和硬件都要两手抓。C语言对于STM32的学习至关重要,C语言不好,还跑什么代码?学会画板子、焊板子,这样有什么需求,都可以自己添加。

        当然,上面的建议都是给0基础的STM32入门者,若是你有一定基础,那当然是对症下药,哪里不会补哪里。

(5) 学海无涯,勇于探索新技术

        “学海无涯、永无止境”,更何况是每一年都在推陈出新的STM32。事实上,STM32 的开发方式已经发生了很大的变化。

        比如:

2014 年,ST 公司推出了 HAL 库和 MCU 图形化配置软件STM32CubeMX。

2017 年年底,ST 公司收购了 Atollic 公司,把专业版 TrueSTUDIO 转为免费软件。

2019 年 4 月,ST 公司正式推出了自己的 STM32 程序开发 IDE 工具软件 STM32CubeIDE1.0.0,打造了一个完整的 STM32Cube 生态系统。

  而STM32Cube 生态系统已经完全抛弃了早期的标准外设库,STM32 系列 MCU 都提供 HAL固件库以及其他一些扩展库。STM32Cube 生态系统的两个核心软件是STM32CubeMX 和STM32CubeIDE,且都是由 ST 官方免费提供的。

  使用 STM32CubeMX 可以进行 MCU 的系统功能和外设图形化配置,可以生成STM32CubeIDE 项目框架代码,包括系统初始化代码和已配置外设的初始化代码。

       如果用户想在生成的 STM32CubeIDE 初始项目的基础上添加自己的应用程序代码只需把用户代码写在代码沙箱段内,就可以在 STM32CubeMX 中修改 MCU 设置,重新生成代码,而不会影响用户已经添加的程序代码。


更多技术内容和书籍资料获取,入群技术交流敬请关注“明解嵌入式”

本文来自博客园,作者:Sharemaker,转载请注明原文链接:http://www.cnblogs.com/Sharemaker/p/17421823.html

本文转载于网络 如有侵权请联系删除

相关文章

  • TiDB v6.2 发版

    TiDBv6.2于8月23日发布了。在全新的版本中,TiDB提供了诸多方面的提升,它们主要集中于:可观测性、性能、稳定性、数据生态加强以及MySQL兼容几个领域。可观测性在新版本中,TiDBDashboard支持了可视化执行计划。以往TiDB用只能借助观察文字输出的执行计划排查问题,这对于简单的交易类SQL而言问题并不大,但分析型SQL很可能会产生庞大的执行计划信息,造成用户难以观察分析。在新版本中,TiDBDashboard在Statements和SlowQuery中提供可视化执行计划和基础问题诊断的能力。这是一种全新的查询计划的展示方式,目标是通过图形化的手段展示Query查询计划的每个步骤,从而使得用户能够更加直观方便地了解查询执行计划的细节。对于复杂的大型查询语句,可视化的展示方式对于深入理解其执行过程大有裨益。在这个版本中,TiDBDashboard也新增的Monitoring页面,展示了在业务性能调优中所需的核心指标,使得用户大部分的日常运维监控需求可以在这里完成,无需在Grafana和Dashboard间跳转。除此之外,新版本中TiDB锁视图支持乐观事务被阻塞的信息。大量

  • python+Appium之APP自动化测试

    一、环境搭建:环境变量不生效1、首先,在系统变量里添加变量名为:ANDROID_HOME,值为:D:\android-sdk2、然后,在系统变量里,在已有的Path变量的值里后面添加:D:\android-sdk\build-tools\22.0.1,记得在前面加上英文分号3、最后,重启电脑,切记,如果环境变量配置好了,还在报关于变量未添加的错误,记得一定要重启电脑,都说:重启解百病啊,这里算是见识到了。 二、运行脚本:真机不断提示需要安装unlock,manager等插件且安装失败1、在做手机自动化测试过程中,我们是完全没必要去安装这些插件的,想到的方法是跳过这些插件的安装,下面介绍下,我在遇到这种情况下的处理方式:禁止手机每次启动需要安装unlock,manager等插件,在D:\Appium\node_modules\appium\lib\devices\android\android.js,注释4行代码,注释代码如下: //this.initUnicode.bind(this) //this.pushSettingsApp.bind(this) //this.pushUnloc

  • centos ansible shell脚本一键安装-自动化运维

    #!/bin/bash yum-yinstallepel-release#安装epel源,从epel源安装高版本ansible yumlist|grepansible#查看ansible的可用包 yum-yinstallansible#安装ansible ansible--version#查看ansible版本 echo" #主配置文件:/etc/ansible/ansible.cfg #主机清单:/etc/ansible/hosts #三个主程序:ansibleabsible-docansible-playbook " echo" [ansible] 43.255.28.59 43.255.30.187 [eisc] 47.95.216.170 43.255.28.59 ">>/etc/ansible/hosts#添加被管控主机 ansibleall--list#列出所有主机列表 echo"#生成密匙对:请一直回车" ssh-keygen-trsa#生成密匙对:一直回车;其中id_rsa是私钥,id_rsa.pu

  • Python通过socketserver处理多个链接

    socket只能处理一个client连接,如果需要并发处理多个链接则需要使用socketserver,下面是代码示例以及注释server端importsocketserver #之前的socket只能同时处理一个客户端,当需要并发处理client发送的信息是需要使用到socketserver,下面创建一个类,继承socketserver其对应实例就有并发能力 classMy_Tcp_Handler(socketserver.BaseRequestHandler): #下面的handler是自己定义的server与client交互的过程,所有交互过程都在此方法内部实现.方法名handle是固定的 defhandle(self): whileTrue: try: #下面将收到的数据打印并且大写后发回给客户端 self.data=self.request.recv(1024) print(self.data.decode(encoding="utf-8")) self.send_data=self.data.decode(encoding="utf-8"

  • 如何清空python的变量

    在python使用循环时,因为数据太大,循环使运行内存不断积累,最后电脑崩了。所以,查了一下,在spyder中如何可以像matlab那样清理单个变量(clear;clc)。1、在代码中的命令:删除单个变量,在代码中加入运行即可del变量复制2、在Ipythonconsole中删除所有变量reset Oncedeleted,variablescannotberecovered.Proceed(y/[n])? y复制3、清理控制台的命令历史clear复制内容扩展:python删除所有自定义变量方法当我们在pythonwin中创建多个变量后,通过dir()函数,可以看到所有已创建变量,这些已经创建的变量会保存在globals全局中,如果想快速删除可以使用如下脚本:阿弥陀佛,哈哈。1、脚本内容如下:#删除clear_env.py ====================================== def__clear_env(): forkeyinglobals().keys(): ifnotkey.startswith("__"):#排除系统内建函数 globa

  • 基于java的直线型接口测试框架初探

    在使用java语言作为接口测试的过程中,发现java语言的简洁性的确不如脚本语言,如python,很多功能python一行代码几个方法就能搞定,java需要几行,而且有时候并不利于理解。最近接触到了一个词“直线型”代码。看了之后有所感觉,重新写了一个直线型代码风格的接口请求框架。 源码如下:packagecom.fun.frame.httpclient importcom.fun.base.bean.RequestInfo importcom.fun.config.RequestType importnet.sf.json.JSONObject importorg.apache.commons.lang3.StringUtils importorg.apache.http.Header importorg.apache.http.client.methods.HttpRequestBase importorg.slf4j.Logger importorg.slf4j.LoggerFactory /** *重写FanLibrary,使用面对对象思想 */ publicclassFun

  • 【每天一道编程系列-2018.2.10】(Ans)

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Oct31_Dec25/article/details/79307636 【题目描述】 Writeaprogram,enteracharacter,todeterminewhetheritislowercase,ifso,convertittouppercase,otherwise,donotconvert. 【题目翻译】 编写程序,输入一个字符,判断它是否为小写字母,如果是,将它转换成大写字母,否则,不转换。 【本题答案】/** *@author:yesr *@date:2018.2.10 */ importjava.util.Scanner; publicclassTest0210{ publicstaticvoidmain(String[]args){ //小写字母的ascII值为97-122 //大写字母的ascII值为65-90 System.out.println("请输入一个字母:\n"); Scannerinput=

  • 你的测试职业发展目标是什么?

    测试经验越多,测试能力越高。所以我的职业发展是需要时间累积的,一步步向着高级测试工程师奔去。而且我也有初步的职业规划,前3年累积测试经验,不断的更新自己改正自己,做好测试任务。

  • KMP算法之Next数组详解

    最近刚好学到了kmp算法,对我来说还蛮难的,原理还好理解,就是next数组的求解让我很懵 旁听了一下隔壁班大佬的分享,觉得他们讲得特别好,就想来记录一下 最长公共前后缀 kmp算法首先要找“最长公共前后缀”,其定义为:A的“最长公共前后缀”是“A中以最后一个字符结尾的非前缀子串”与“A的前缀”能够匹配的最大长度。例:ababab我们从“最大长度”6开始向下枚举若答案是6。根据定义,“A中以最后一个字符结尾的非前缀子串”是ababab?我们注意到,ababab也算它自身的一个前缀因此,在枚举时,要从这个字符串的长度减一开始枚举! 若答案是5,则“非前缀子串”为babab。而“前缀”是ababa。两者不相等。 若答案是4,则“非前缀子串”为abab,而“前缀”是abab。两者相等。所以我们可以确定,字符串”ababab”的“最长公共前后缀”长度为4。 有什么用? 举例说明:有两个字符串 S:abaacababcacT:ababc首先,根据最长公共前后缀,我们写出T串的所有前缀的“最长公共前后缀”长度:T[0~0]=“a”,最长公共前后缀长度:0T[0~1]=“ab”,最长公共前后缀长度:0

  • WPF显示SQLITE数据(二)

    在上一篇WPF显示SQLITE数据(一)中,关于链接的字段,只是显示了下划线,单击后连接到浏览器的对应页面并没有实现,下面给出单击事件的实现 1.在xaml中写入事件定义 1<DataGridHyperlinkColumnHeader="URL地址"Width="940"Binding="{Bindingurl,Mode=OneWay,UpdateSourceTrigger=PropertyChanged}"> 2<DataGridHyperlinkColumn.ElementStyle> 3<Style> 4<EventSetterEvent="Hyperlink.Click"Handler="Hyperlink_Click"/> 5</Style> 6</DataGridHyperlinkColumn.ElementStyle> 7</DataGridHyperlinkColumn>复制 2.在MainWindow.xaml.cs中写入 1privatevoidHyperlink_Click(

  • mybatis plus常见配置

    枚举 mybatis-plus: type-enums-package:com.system.*.api.enums 复制

  • 团队项目:Recycle_2

    我们的团队项目Recycle:一个以回收与二手市场为主题的APP 初始阶段:每个团队成员根据自己的想法画出该APP简易的UML图 我的想法是主要分为四个部分:首页、回收车、消息、我的 首页:分为三大功能部分,垃圾分类、二手和市场      垃圾分类:分为纸质品、塑料、金属、玻璃、电器等      二手:用户与用户之间直接交易    市场:用户与负责厂商交易 回收车:类似于淘宝购物车,功能相似 消息:用户与用户私密交流和公开交流 我的:用户登录、登录后:可以看到订单的提交完成与否、我的钱包或者积分、地址管理等 简易UML图:  

  • codeforces 1027E. Inverse Coloring(计数)

    一开始发现的性质是确定了第一行后,后面的行只需要考虑和前面的行相同或者不同,整个过程只需要考虑行,构出的图一定符合性质(即同样满足列的性质),但是接下来死活定义不出状态,事实证明自己还是想的太少了 思路:https://www.cnblogs.com/tobyw/p/9513876.html 代码: #include<bits/stdc++.h> #definelllonglong #definemkmake_pair #defineftfirst #definesesecond #definepiipair<int,int> #definedbdouble #definelso<<1 #definerso<<1|1 #definelowbit(x)(x&-x) usingnamespacestd; constllP=998244353; lln,k,f[505][505],res[505]; intmain(){ cin>>n>>k; for(inti=1;i<=n;i++){ f[0][i]=

  • Apache-Tomcat 和 Apache-Maven配置

    1.1.下载安装文件 官网对应版本下载,例:apache-tomcat-8.0.35-windows-x64.zip   1.2.指定对应的安装目录: 例:D:\JavaSoft\apache-tomcat-8.0.35   1.3.配置环境变量 新建系统变量,名称:CATALINA_HOME,值:D:\JavaSoft\apache-tomcat-8.0.35 再追加到path变量,值[;%CATALINA_HOME%\lib;%CATALINA_HOME%\bin;]   1.4.启动Tomcat服务 a.运行cmd命令:startup,出现Tomcat对话框,表明服务启动成功。 b.运行cmd命令:services.msc,找到ApacheTomcat服务,修改启动类型   1.5.测试Tomcat 输入:http://localhost:8080/,出现默认JSP页面即表示安装成功!   ===============================================   2.1.下载安装文件 官网对应版

  • Linux安装Redis服务

    一、安装 1、进入linux系统,选择下载的目录,输入命令“wgethttp://download.redis.io/releases/redis-5.0.5.tar.gz”   2、解压下载的压缩包“tarxzfredis-5.0.5.tar.gz”   3、cd 进入解压后的文件夹进行编译,命令“make”   4、安装Redis,有图中内容就算安装成功了"makePREFIX=/server/redis-5.0.5install",“PREFIX”表示安装地址。     5、复制配置文件。从Redis的解压目录里把redis.conf配置文件复制到redis 的安装目录下面(如果有则可以省略这步)。     二、启动服务 1、vim打开redis.conf配置文件,找到“daemonizeno”把这个选项改成“yes”(该配置意思:让redis这个进程在后台进行)   2、启动redis服务 语法:命令 配置文件(“redis-server”就是bin目录下的命令

  • OC 底层探索 02、开辟空间 - 字节对齐 + 内存对齐

    一、字节对齐 1、为什么要进行字节对齐处理呢? 性能,快,以空间换取时间。 可以想象2个场景,场景1:当我们的CPU去读取内存时,每次读取的大小如果是不确定的(8、7、3、9......),那么除非每次读取都要重新改变自己的读取方式否则读取的数据就会读错到其他数据上去。 场景2,如果我们所存储的对象以固定的大小存储时,8/16,那么读取数据时,只需要按部就班去取不必反复改变读取方式。 场景对比,自然是场景2更快捷方便。 2、Apple的16字节对齐算法 Apple的objc最新源码中目前是16字节对齐,在此之前是8字节对齐(注意!真正的对象内存大小仍是8字节对齐的,后面会分析的)。代码如下: staticinlinesize_talign16(size_tx){ return(x+size_t(15))&~size_t(15); }复制 算法流程如下图:-->16后抹零 3、验证 运行源码demo: 如上图,MyPerson有3个属性,+isa=4*8=32 下图情况: 此时,好像有2个问题,问题001:我们每次都给对象16字节的对齐处理,未使用的空间岂不浪费了

  • MySQL慢查询 - 开启慢查询

    一、简介 开启慢查询日志,可以让MySQL记录下查询超过指定时间的语句,通过定位分析性能的瓶颈,才能更好的优化数据库系统的性能。 二、参数说明 slow_query_log慢查询开启状态slow_query_log_file慢查询日志存放的位置(这个目录需要MySQL的运行帐号的可写权限,一般设置为MySQL的数据存放目录)long_query_time查询超过多少秒才记录 三、设置步骤 1.查看慢查询相关参数 mysql>showvariableslike'slow_query%'; +---------------------------+----------------------------------+ |Variable_name|Value| +---------------------------+----------------------------------+ |slow_query_log|OFF| |slow_query_log_file|/mysql/data/localhost-slow.log| +-----------------------

  • 优雅的格式化时间显示

    在像评论列表这样的前端页面中,经常会出现时间的字段,如果显示一个标准的yyyy-MM-ddHH:mm:ss这样的时间格式,显然不是很友好,通常产品会要求显示[1分钟前]、[刚刚]类似的文字,那么怎么用js实现呢?我这里封装了一个通用的函数以实现,贴出完整代码: //时间格式化 functiongetDateDiff(date){ if(typeofdate==='string'){ date=newDate(Date.parse(date.replace(/-/g,"/"))); }elseif(typeofdate==='object'){ date=date.getTime(); } varresult='', differentValue=newDate().getTime()-date; if(differentValue<0){ return'穿越时空' } varminute=1000*60, hour=minute*60, day=hour*24, week=day*7, month=day*30,//且都用30天算 year=month*12; if(d

  • 添加背景音乐

    有两种分别用<bgsound>和<embed></embed>标签,当用<embed>插入背景音乐时可以设置宽度和高度为0,隐藏播放器。 ■<bgsound>:  <bgsound>是用来插入背景音乐,但只适用于ie,其参数设定不多。如下  <bgsoundsrc="your.mid"autostart=trueloop=infinite>src="your.mid"设定midi档案及路径,可以是相对或绝对。autostart=true是否在音乐档下载完之后就自动播放。true是,false否(内定值)。loop=infinite是否自动反复播放。loop=2表示重复两次,infinite表示重复多次。■<embed>:  <embed>是用来插入各种多媒体,格式可以是midi、wav、aiff、au等等,netscape及新版的ie都支持。其参数设定较多。如下下  <embedsrc="your.mid"autostart="true"loop="true"hidden=

  • centos vmware 安装 mysql

    A、安装一个好的centos; B、开启端口3306、80 、22 这几个端口 具体命令参考如下 1,查看防火墙状态: firewall-cmd--state systemctlstatusfirewalld.service 2,开启防火墙: systemctlstartfirewalld.service 3,设置开机自启: systemctlenablefirewalld.service 4,重启防火墙: systemctlrestartfirewalld.service 5,查看防火墙设置开机自启是否成功: systemctlis-enabledfirewalld.service;echo$? 6,关闭防火墙: systemctlstopfirewalld.service 7,开端口命令: 打开单个端口:firewall-cmd--zone=public--add-port=80/tcp--permanent 打开多个端口:firewall-cmd--zone=public--add-port=20000-29999/tcp--permanent --

  • regexp_like判断是否含有非数字(正则表达式)

    一、regexp_like函数 1、语法 REGEXP_LIKE(source_char,pattern[,match_option])//正则表达式匹配函数 REGEXP_REPLACE(source_char,pattern[,replacestr[,position[,occurrence[,match_option]]]])//正则表达式替换函数 REGEXP_INSTR(source_char,pattern[,position[,occurrence[,return_option[,match_option]]]])//正则表达式返回字符出现位置 REGEXP_SUBSTR(source_char,pattern[,position[,occurrence[,match_option]]])//正则表达式截取某字符串 REGEXP_COUNT(source_char,pattern[,match_option])//正则表达式统计字符串出现的次数,11g以后的版本 //source_char是源数据 //pattern是表达式 //match_option为c,区分大小

相关推荐

推荐阅读