C语言基础就马上学习STM32,你一定会有这些疑惑

如果你只有C语言基础马上学STM32,你肯定会有这些疑惑:

为什么会有这么多看不见的 API 函数?看不见的变量(寄存器)名称?

为什么项目除了 main.c 之外还有这么多其他看不见的文件?它们是干什么用的?

什么是闪存?什么是内存?什么是只读存储器?

什么是寄存器?什么是时钟?什么是中断?什么是计时器?什么是 DMA?

什么是端口复用和重映射?什么是ADC?什么是脉宽调制?什么是UART?什么是IIC?什么是SPI?

什么是示意图?什么是PCB?什么是晶体振荡器?什么是重置?什么是水平?什么是上拉和下拉浮子?

为什么我的helloworld c语言程序下载到STM32不能运行?为什么下载的固体 .hex 文件?.hex .bin .exe 文件有什么区别?

为什么要注册编程?和标准/HAL 库编程?连网上教程都有STM32CubeMX可视化配置编程?你应该学哪个?使用哪个?

如果你只有C语言基础,有以上疑惑是很正常的。因为C语言只是一种编程语言,在单片机上,可以用汇编编程、C语言编程,甚至很多极客板,都可以用Python、JavaScript编程。为什么现在单片机编程主要是C语言?由于各大芯片厂商提供的BSP封装主要是C语言,所以C语言在性能效率和可维护性方面可以说是目前最优的解决方案。

所以你和STM32的区别就是这部分知识,或者说,你和单片机的区别就是这部分知识,因为对于所有的单片机来说,这部分知识是通用的。.

上一篇:开发板选型

我个人建议购买最小的系统板。首先,价格低。其次,你在学习的时候更容易理解各个模块之间的关系。第三,您可以根据自己的设计需要购买不同的外围模块进行调试。

一个系统板,一个Jlink,一个串口模块,你可以学习工程搭建怎样将程序烧写到单片机中,时钟配置,定时器,GPIO,UART,USB,甚至RTOS。100元以内就可以买到小SPI屏、IIC传感器等。覆盖。

STM32F103 最小系统板

一、单片机基础知识点

这部分的知识点可以参考这本书,通读一遍,对这些关键词有个概念。

书籍公众号可下载:嵌入式思维导图,回复“MCU”

二、MCU启动过程

有了基本的了解后,再了解单片机的启动过程。不管是哪个单片机,都会有一个启动文件,是原厂提供的。通过了解启动文件,我们可以了解处理器的架构、指令集和中断向量。安排等

启动代码通常编程在闪存中,闪存是系统上电后立即执行的程序,它在任何用户 C 代码之前运行。上电后,arm处理器处于arm状态,运行在管理模式,系统中所有中断都被禁止,取pc到地址0执行。一个可执行的镜像文件必须有一个入口点,并且可以放在rom开头的镜像文件的入口地址也必须设置为0.,在汇编语言中,我们已经说过如何定义程序的入口点,当项目中有多个入口点时,需要在链接器中使用-entry来表示程序的入口点。如果用户创建的程序包含主函数,

一般来说,启动代码主要完成两方面的工作,一是初始化执行环境,如中断向量表、堆栈、i/o等;另一种是初始化c库和用户应用程序。

如果我看不懂这段文字怎么办?没关系,当我们开始的时候,我们只需要知道有这个东西。

STM32的整个启动过程是指从上电到运行到main函数的过程。步骤是:

①上电后,硬件设置SP、PC

PC:Program Counter,通用寄存器,控制程序执行,用于指向当前运行指令的下一条指令。

SP:Stack Pointer,通用寄存器,堆栈指针,用于push和pop操作。

ARM微处理器共有37个32位寄存器,其中31个为通用寄存器,6位状态寄存器。

但是这些寄存器不能同时访问,可以访问哪些寄存器取决于ARM处理器的工作状态和具体的工作模式。

但在任何时候,通用寄存器R14~R0、程序计数器PC(即R15),一个状态寄存器都是可访问的。

②设置系统时钟

③软件设定SP

④加载.data、.bss,初始化栈区

⑤ 跳转到C文件的main函数

STM32启动流程

至此,我们终于到了C语言入口的主体部分。你是不是比较熟悉?

所以总结一下,相比于我们之前写的C语言程序,单片机项目中有一些文件和代码是服务于上述启动过程的,所以在项目中看不懂这些文件是正常的,所以我们来获取例如,我们可以直接使用官方项目配置的文件。

三、如何搭建单片机项目

STM32工程是如何生成的?传统的视频教程会教我们一一创建和复制文件。为什么教程的老师知道用什么文件?因为是原芯片厂提供的,当然我们可以直接下载原芯片厂的样例库,然后直接使用上面的工程修改主函数的内容进行开发。

原厂资料下载在这里:ST官网,在这里可以找到说明书、源码、软件工具,比任何教程资料都要完整。

顺便说一句,这里还有一点。我们在学习C语言的时候,用的是Visual C++和Visual Studio for IDE,那为什么我们在学习单片机的时候还需要用到KEIL和IAR呢?这里有一个交叉编译的概念。

我们之前常见的软件开发都是本地编译:

当前PC下,x86 CPU下,程序可以直接编译,可执行程序(或库文件)可以直接在当前环境下。

编译,可以称为本地编译。

交叉编译是对应于本地编译的概念。

所谓,交叉编译就是在一个平台上编译,把编译好的程序放在另一个平台上运行编译环境,运行环境

不一样,属于十字架,所谓的十字架。

KEIL MDK和IAR只是一套更方便的软件,集成了交叉编译工具链、仿真和下载工具。因此,企业在使用破解的KEIL时收到律师函是很正常的。其他人将因制作如此有用的工具而被收费。但是如果你喜欢,其实可以在Linux上搭建自己的STM32交叉编译工具链(gcc-arm-none-eabi)环境,然后用gdb来模拟调试,完全脱离KEIL。

然后我们回到STM32学习的问题。前面说过,STM32的编程方式有以下三种:

.注册编程

.标准/HAL 库编程

.STM32CubeMX 可视化编程

它们出现的时间是1>2>3,寄存器最早也是最原始的。所以我推荐的入门方式是STM32CubeMX的可视化编程方式,也是ST主推的一种方式。对我们来说,这也是最简单的学习方式。

关于是否需要从寄存器编程入手?我不建议开始。学习效率太低了。一个函数需要修改数据、控制和状态的多个寄存器,以及各种与或非移位操作。一旦出现一点错误,就很难排查,代码维护也很重要。难,你得一一看几十万页的芯片手册。正是因为寄存器开发效率太低,ST封装了标准库和HAL库,而STM32CubeMX可视化编程的出现是因为HAL库的配置不直观,就像配置外设时钟一样,不得不这样计算,还有CubeMX,一张图就可以很清楚了。

所以你可以快速上手,然后你需要了解寄存器编程。寄存器编程无非就是按照芯片手册修改相应的数据、控制、状态寄存器,不是技术门槛。

STM32官网教程&&微雪CubeMX教程,不得不说,官方的最好。

文档也可以从公众号下载:嵌入式思维导图

四、单片机上的helloworld

至此,你可以按照教程配置你的项目,编写STM32的helloworld。

除了helloworld,还可以实现各种加减乘除、栈、队列、链表、树等数据结构,甚至各种排序查询算法。这和C语言学习的内容完全一样吗?

当然,你会发现我在单片机上运行的程序,怎么能像Visual C++一样在电脑上打印出结果呢?因为MCU还没有驱动屏幕?

五、微控制器的时钟和外设

时钟更容易理解。时钟是微控制器的脉冲,时钟频率决定了微控制器何时运行一个指令周期。. 就像我们做广播体操时收音机里的 1234 2234 3234 节拍一样。. . . 然后我们所有的学生都跟着这个节奏一个一个动作。节拍越快,我们移动的越快。节拍越慢,我们移动的越慢。

CubeMX生成的所有工程都需要配置时钟,这样程序才能烧录到单片机上,以设定的主频运行。设置方法请参考时钟配置章节。

MCU外围模块与我们需要实现的业务功能息息相关。常用外设子模块如下:GPIO、定时器、串口、SPI、I2C、USB等。

·如果想用串口打印日志到电脑,先学UART模块。

·如果你想定期打印时间,你会学习UART和定时器模块。

·如果要读取按键状态,就学习GPIO怎样将程序烧写到单片机中,外部中断。

·如果要控制LED开关,就学GPIO,如果要点亮花哨的灯,就学定时器、PWM、GPIO模块。

·如果要驱动IIC接口温湿度传感器,学习I2C模块。

·你要驱动SPI屏,你学习SPI模块。

·如果你想驱动电机,你会学习PWM、定时器和计数器模块。

·如果要驱动串口伺服,可以学习UART模块,按照协议发送16进制数据。

六、单片机业务逻辑

至此,你已经驱动了常用的外围模块,那么如何使用这些模块来做一个产品呢?

比如下面是一个智能手环的框图,无非就是GPIO驱动振动器,I2C驱动心率传感器,SPI驱动屏幕,I2C驱动NFC。

至于什么时候开屏?多久读取一次心率传感器数据?什么时候振动?您可以使用 C 语言语法来做到这一点。比如定时器每10s读取一次心率数据,然后同步更新到屏幕上。正常心率显示绿色图标,当读取数据大于多少时显示红色。这些是常见的 if switch while basic 语法可以实现的逻辑。

七、高级微控制器编程

实现了基本的外设驱动和基本的业务逻辑之后,你想知道,入门级工程师和中高级MCU开发工程师有什么区别?

·你了解程序模块化吗?

·你了解底层与业务的解耦吗?

·你了解设计模式吗?

·你了解代码执行效率优化吗?

这时候需要对各种关键字extern ifndef const volatile、预处理、结构体、指针等有一点深入的C语言使用技巧,学习数据结构,设计模式,看各种开源代码,等等,以提高自己的水平。综合能力。

智能音箱软件模块设计框图

八、建议

学习而不解决实际问题是流氓行为。

从复制代码开始的学习是闭门进行的。

不要刻意死记芯片手册,各种寄存器,各种API,学会看手册,学会搜索,学会提问。

思考底层逻辑,技术的出现是因为场景的需要,而不是技术本身。单片机的所有功能点都是为了解决某个问题。

最后,分享初级嵌入式开发工程师的技术栈,供大家参考。更多资源可以关注“嵌入式思维导图”:

说了这么多,大家记得关注下方第一条评论(或私信我)干货哦~

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论