小介绍
有一次,当我开车进入下一个租住的公寓时,遇到了一些麻烦,这很烦人:主房间的电灯开关在柜壁后面,该柜壁被拧紧在墙上,并且由于无法进行重新布置,因为 花了很多时间和精力。 我非常想解决这个问题,我想到一个主意:制作一个遥控器来控制照明!
正是出于创建自己的遥控器来控制房间中的灯光的想法,我对电子,微控制器和各种无线电设备的热情开始了。
文章清单:
- 学习STM32或智能管理光的入门
- STM32入门:位操作
- STM32入门:什么是寄存器? 如何与他们合作?
之后,我开始研究该主题,熟悉电子学的基础知识,设备的示例,并学习人们如何实现此类设备。 在搜索了有关如何开始研究微控制器的信息之后,我发现了什么是Arduino,它们与之共吃,如何与它们一起工作。 这个简单的解决方案看起来非常吸引人,因为据我当时的理解,该代码将被构建一次或两次。 但是得出结论,我不知道Arduino草图之外的微控制器内部发生了什么,我决定寻找一个更有趣的选项,这意味着对微控制器技术的深入研究和沉浸。
我工作的公司设有开发部门,因此我决定联系工程师,以正确的方式指导我,并说明从哪里开始解决我的问题。 我从研究Arduino时被强烈劝阻,我手上有一条未知的,难以理解的绿色围巾,上面刻有题词,字母和各种电子元件。
那时对我而言,所有这一切似乎都是难以理解的,甚至使我有些困惑,但是我不会拒绝执行任务。 因此,在研究了我想为自己的目的堆放设备之后,我熟悉了STM32系列微控制器和STM32F0-Discovery开发板。
令我感到惊讶的是,如此庞大的社区,STM上的文章,示例和各种材料与Arduino相比并没有那么丰富。 当然,如果您进行搜索,则会有许多“面向初学者的文章”,其中描述了如何开始和在何处开始。 但是在那一刻,在我看来这一切都是非常复杂的,许多细节对于初学者的研究头脑都很有趣,但事情并没有被告知。 尽管许多文章的特点是“学习最少”,但即使有现成的代码示例,也不一定总是能借助它们获得理想的结果。 这就是为什么我决定根据一个特定想法(房间里的照明控制面板)的实现写一小段关于STM32编程的文章的原因。
为什么不使用AVR / Arduino?
预料到对于一个没有经验的初学者马上进入像STM32这样的复杂MK的研究还为时过早-我会告诉你为什么我决定不考虑并熟悉Atmel处理器家族而不考虑将Arduino作为选择而采用这种方式。
首先,价格-功能关系起着决定性的作用,即使从ST的最便宜和最简单的MK之一到相当“胖”的ATMega,也可以看到这种差异:
在我看到AVR和STM32的价格和功能之间存在重大差异之后-我决定在开发中不使用AVR =)
其次,我以前曾尝试过自己确定要达到预期结果时应该掌握的技能。 万一我决定使用Arduino,复制完成的库,放上草图并瞧,就足够了。 但是了解数字总线的工作方式,无线电发射机的工作方式,其所有配置和使用方式的情况-在这种情况下,我永远不会来。 对于我自己,我选择了最困难和棘手的道路,以便在实现结果的道路上获得最大的经验和知识。
第三,任何STM32都可以用另一个STM32代替,但功能更好。 而且,无需改变开关电路。
第四,具有专业开发经验的人更可能使用32位MK,并且大多数情况下它们是NXP,Texas Instruments和ST Microelectronics的模型。 是的,我可以随时与开发部门的工程师联系,以了解如何解决特定问题并就我感兴趣的问题获取建议。
为什么要开始使用发现板探索STM32微控制器?
正如您已经了解的那样,亲爱的读者,我们将使用发现板开始熟悉STM32微控制器并进行研究。 为什么选择探索,而不是自己的董事会?
- 在任何Discovery板上,都有一个内置的ST-LINK编程器/调试器,该编程器/调试器通过USB连接到计算机,并且可以通过卸下/安装相应的跳线,用于对板上的微控制器和外部设备进行编程。 就是说,这是所有事物的优点-我们还通过获得二合一解决方案(微控制器和编程器)来节省资金。
- 发现卡具有直接从微控制器到主板引脚的所有引脚的完整布线。 为了方便起见,我将Discovery放在了相同的两个原型开发板中。
- 3.板上总是有一定数量的各种外围设备,例如加速度计,麦克风,显示器,传感器等。 不同的Discovery板具有不同的主体套件选项。 如果有人感兴趣,可以在制造商的网站上阅读更多内容。
除了发现委员会之外,我们还需要什么开发资源?
在与发现委员会的合作中,我们将需要许多不可替代的事情,而这些事情离不开:
- 电路板上查看连接的位置,位置和内容。 您可以在原理图包部分的主板制造商页面上获取电路。 您可以通过在图片中所示的方框中向下滚动一个页面来下载方案:
- 我们的微控制器的数据表 ,以便您可以在任何方便的时间查看引脚排列,规格,参数和其他必要的工作信息。 就我而言,它是STM32F051R8T6 。 数据表链接位于页面标题中:
- 我们还需要微控制器上的参考手册 。 该文档详细描述了与MK内核,其时钟模块,外围设备等配合使用的方法和方法。 它还包含所有MK寄存器,MK和外围设备的所有选项和设置的说明。 这可能是最重要的文件,如果没有该文件,将很难弄清楚MK内部的工作方式和作用。 您可以从微控制器页面上的链接下载文件:
- 最后,我们需要建立一个开发环境,在其中我们可以为MK创建程序,并从容地编译和刷新程序。 一次,我尝试了几乎所有最受欢迎的IDE,并选择了Keil uVision5。在我看来,这种开发环境对我来说似乎是最方便和易学的。 内置的调试器,现成的且易于连接的低级库,大量示例以及方便组织的工作界面和IDE空间是影响我选择的决定性因素。 您可以从官方网站下载此IDE,但是需要简单的注册:。 由于32kB中下载的固件的大小确实有一个小限制,因为 该IDE已付费。 但这对我们来说绰绰有余。 我们将需要MDK-Arm:
让我们开始进行IDE的初始设置和准备工作!
下载我们的IDE的安装文件后,您可以继续进行安装。 按照安装程序的说明完成安装过程。 复制操作所需的所有文件后,将出现一个用于安装
Pack Installer的软件安装程序的窗口。 该安装程序包含低级库,中间件,定期更新的程序示例。
要开始使用我们的电路板,我们需要安装许多工作所需的软件包,并且需要找到可以使用的微控制器。 您也可以使用窗口顶部的搜索。 找到我们的MK之后,在窗口的下半部分单击它,我们需要安装以下库列表:
- Keil :: STM32F0xx_DFP是针对特定系列微控制器的完整软件包,包括手册,数据表,SVD文件,制造商的库。
- ARM :: CMSIS是Cortex微控制器软件接口标准的软件包,其中包括来自ARM的一整套库来支持Cortex内核。
- Keil :: ARM_Compiler是ARM的最新编译器。
安装所需的软件包后,您可以继续配置IDE和我们的调试器/编程器。 为此,我们需要打开Keil主窗口并创建一个新项目。
为此,请转到菜单
项目->新建uVision项目,然后选择我们将保存项目的文件夹。
之后,Keil会问我们该项目将使用哪种MK。 选择所需的MK,然后单击“
确定” 。
将会再次出现一个我们已经熟悉的窗口,我们可以在其中将感兴趣的模块连接到项目。 对于我们的项目,我们需要两个模块:
- CMSIS库的核心 ,其中声明了设置,寄存器地址以及MK工作所需的更多内容。
- Startup-file ,负责启动时MK的初始化,向量的声明和中断处理程序等等。
如果插件的所有依赖性都得到满足,管理器将以绿色向我们发送信号:
按下“
确定”按钮后,我们可以开始创建项目。
为了配置项目参数并配置我们的编程器,请右键单击
Target 1以打开相应的菜单。
在项目的主菜单中,将
Xtal参数设置为
8.0 MHz 。 此参数负责我们的MK石英振荡器的工作频率:
接下来,我们继续配置程序员/调试器。 在同一窗口中,单击“
调试”选项卡,然后在“
使用”字段中选择“
ST-Link调试器”参数并转到设置:
在设置中,我们应该看到板上安装的ST-Link的型号,序列号,硬件版本和IDCODE MK,我们将对其进行闪烁:
为了方便起见,您可以配置负责在闪烁后自动重置MK的参数。 为此,请检查“
重置并运行”字段。
之后,您需要配置另一个选项,该选项将使我们能够在项目代码中编写俄语注释。 我们单击
配置按钮,然后在打开的菜单中,在
编码字段中选择
俄语Windows-1251 。
仅此而已。 我们的IDE和程序员已准备就绪!
Keil有一个方便的项目导航器,我们可以在其中查看项目结构,工作所需的参考资料,包括我们之前已经下载到计算机中的参考资料(发现方案,数据表,参考手册),清单项目和模板中使用的函数,用于快速插入编程语言的不同语言结构。
将项目结构中的文件夹从
Source Group 1重命名为
App / User ,从而表明我们将在此文件夹中包含用户程序文件:
通过执行“
将新项添加到组”应用程序/用户”命令,通过项目导航器添加主程序文件。
您必须从列表中选择
C File(.c)并为其指定名称
main.c :
创建的文件将自动添加到项目结构中,并将在主程序窗口中打开。
好了,现在我们可以开始创建程序了。
首先,您需要将我们的微控制器系列的头文件连接到我们的可执行文件。 将以
下行添加到
main.c文件中,该程序将使我们的LED交替闪烁:
/* */
#include "stm32f0xx.h"
/* */
int main(void)
{
/* GPIO */
RCC->AHBENR |= RCC_AHBENR_GPIOCEN;
/* PC8 PC9 Output*/
GPIOC ->MODER = 0x50000;
/* Output type Push-Pull */
GPIOC->OTYPER = 0;
/* Low */
GPIOC->OSPEEDR = 0;
while(1)
{
/* PC8, PC9 */
GPIOC->ODR = 0x100;
for (int i=0; i<500000; i++){} //
/* PC9, PC8 */
GPIOC->ODR = 0x200;
for (int i=0; i<500000; i++){} //
}
}
, , . :
Build ( F7) , , :
Load ( F8) :
, .
! STM32 !
, , , Discovery. )
:
- STM32 -
- STM32:
- STM32: ? ?