1. ARM与STM32之间的关系
要讨论ARM与STM32之间的关系,或者讨论ARM核与基于ARM核设计出的一系列MCU之间的关系,我认为可以从现代芯片设计方法聊起,能够得到一个比较清晰的认识。
可以先看一下STM32F103中的结构框图:
图中左上角的Cortex-M3就是ARM核中的一种,(ARM的种类在其他几位大佬的回答中,已经解释的很多了),一般包含:ALU、移位寄存器、存储器、指令译码、逻辑控制器等功能,也就是实现了MCU的核心运算功能。如果一个片上系统相当于一个人,那么ARM核的功能相当于就是人的大脑,而上图中其它的模块,就相当于人的躯干或者内脏等功能区域。
要知道现代芯片设计和生产已经高度分工,一个STM32F103芯片中的模块(也就是上图中的颜色各异的方块)并不是全部都由ST独立完成的,反而是由不同的专业团队各自设计其中的一块或几块,再由ST公司(购买后)拼接在自己设计的芯片中。
比如SPIA授权使用,CANB授权使用,ST拿到这些模块之后再通过标准总线将他们连接起来,就变成了一块MCU,虽然可能A和B就是ST或内部团队。也就是说,在设计一款芯片的时候,在一定程度上和我们去电脑城组装一台电脑有点相似,当然复杂性更高,以及更多工作要做。
所以在设计通用芯片时,会考虑到芯片的核心运算功能通用性比较高,也就是不同芯片其实对核心运算功能的要求很相似(不同人的大脑结构相似),所以不会专门花心思去设计这一部分,反而会去购买专设计出的内核。我们这里讨论的ARM核就是一种专门卖给使用的内核。
综上所述,STM32是使用了ARM核的MCU,其实除了STM32,ARM核的使用范围很广,TI与Freescale也有使用ARM核的MCU与SOC。我们通常把使用ARM核作为核心运算功能的片上系统叫做ARM芯片,于是对ARM芯片的开发,就是题主所说的ARM编程。由于ARM芯片在使用上其实大同小异,同时STM32芯片推荐使用的KEIL开发套件使用起来很好上手,所以题主通过使用STM32来入门ARM编程也是很好的。
2. 如何进行ARM编程
1. 首先学会开发工具和调试工具的使用,STM32使用的是Keil5(经 @Weyne Chen 补充:“常用的集成开发环境有IAR和Keil,官方教程多用IAR,国内多用Keil。官方为了跨平台,也在推基于gcc的集成开发环境,年初。”这么说更为准确,感谢。),网上有大量视频。这里不用学习的太精通,因为后面做项目的过程中一直可以学习。一开始主要熟悉:创建项目、编译、下载、调试就可以。
2. 开发驱动。STM32官网能够下载官方驱动Demo,已经实现了驱动的基本功能,如果没有特殊需求,已经可以直接用了。这一部分,网上有很多文章和视频有做说明。这一部分是和ARM编程最相关的部分。
这篇博客中有很多有价值的学习资料,可以参考学习:
stm32学习视频(资料)推荐_单身狗的MCU乐园_新浪博客3. 开发应用。这里已经和MCU或者ARM没有太多关系,随便怎么写软件都没问题。但是开发时还是要注意,与windows上的软件开发有很大区别,MCU的资源极其有限,运算速度也相对慢很多,要时刻注意内存溢出、延时、公共资源被占用等问题。
驱动和应用其实说到底是人为的划分,为了方便项目分工合作以及平台间移植,人为将和MCU相关的代码定义为“驱动”,而将与MCU关系不大并且主要是用来实现功能和特性的代码定义为“应用”。“驱动”和“应用”在不同的.c和.h文件中编写,驱动用来控制MCU中的硬件模块工作,应用通过调用驱动的接口来实现对MCU的控制。