请选择 进入手机版 | 继续访问电脑版
开启左侧

[原创] Day11:搭建 STM32 开发环境

[复制链接]
Unigress 发表于 2021-4-23 14:55:17 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

Day11:搭建 STM32 开发环境

前言

大家已经学完了 C语言编程入门(电赛入门的前半部分)的内容,今天开始老师将带领大家在 充电宝团队自治的 “电赛 STM32 学习板” 上深入浅出的了解单片机的基础和领略 STM32 的妙用。

image-20201012114856973

小贴士

总所周知,计算机由硬件(外设,中央处理器,存储器等)和软件(操作系统,应用程序)组成。

单片机(单片微型计算机,Single-Chip Microcomputer),又称微控制器Microcontroller)。

是把中央处理器、存储器、定时/计数器(Timer/Counter)、各种输入输出接口等都集成在一块集成电路芯片上的微型计算机。

8051是一种8位元的单芯片微控制器,属于MCS-51单芯片的一种,由英特尔公司于 1981 年制造。

STM32系列芯片由ST公司基于ARM公司的Cortex-M3内核开发的 32 位微控制器(MCU)。

为什么学习STM32
可以发现,在嵌入式领域STM32芯片介于低端和高端之间,它相对于普通的8/16位机有更多的片上外设,更先进的内核架构,可以运行μC/OS等实时操作系统,相对于可运行Linux 操作系统的高端CPU,其成本低,实时性强。这个定位使得STM32不仅占领了大部分中端控制器的市场,更是成为提升开发者技术的优良过渡平台,为后续的学习打下坚实的基础。

如何学习STM32
为STM32的开发方式较普通的单片机开发还是有很大的不同,所以学习时要注意如下几点
(1)转变思维,适应使用固件库的开发方式,加强运用C语言的能力,建立工程意识。
(2)熟悉Cortex-M系列芯片架构,了解CMSIS标准,熟悉STM32的总线架构。
(3)掌握IC、SPI、SDIO、CAN、TCP/IP等各种通信协议,掌握了这些协议,开发软件驱动对容易了。

好了,开始我们今天的任务熟悉STM32的开发环境和工程模板。

1. STM32 开发前的常识

STM32系列芯片由ST公司基于 ARM 公司的 Cortex-M3 内核开发的 32 位微控制器(MCU)

STM32按内核架构分为不同产品,其中 STM32F1 系列有:

STM32F101“基本型”系列

STM32F103“增强型”系列

STM32F105、STM32F107“互联型”系列

image-20201012164749377

电赛学习板上使用的是 STM32F103RBT6 64管脚的单片机

ST(意法半导体)为了方便用户开发程序,提供了一套丰富的 STM32 固件库。

到底什么是固件库?它与直接操作寄存器开发有什么区别和联系?很多初学者很是费解,这里我们简单了解一下 STM32 固件库相关的基础知识,希望能够让大家对 STM32 固件库有一个初步的了解,至于固件库的详细使用方法,我们会在后面的章节一一介绍。

这章节有一些图片是截图的权威手册。这一节的知识可以参考《STM32 固件库使用手册中文翻译版》 P32,固件库手册讲解更加详细,这里只是提到一下,希望大家谅解。官方包的地址:软件资料\STM32 固件库使用参考资料\ STM32F10x_StdPeriph_Lib_V3.5.0  

image-20201012164334503

STM32F10x 标准外设库是一个固件函数包,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能特征。该函数库还包括每一个外设的驱动描述和应用实例。通过使用本固件函数库,无需深入掌握细节,用户也可以轻松应用每一个外设。因此,使用本固态函数库可以大大减少用户的程序编写时间,进而降低开发成本。

每个外设驱动都由一组函数组成,这组函数覆盖了该外设所有功能。每个器件的开发都由一个通用 API(Application Programming Interface应用编程界面)驱动,API 对该驱动程序的结构,函数和参数名称都进行了标准化。

小贴士

任何处理器,不管它有多么的高级,归根结底都是要对处理器的寄存器进行操作。但是固件库不是万能的,您如果想要把 STM32 学透,光读 STM32 固件库是远远不够的。你还是要了解一下 STM32 的原理,而这些原理了解了,你在进行固件库开发过程中才可能得心应手游刃有余。  

固件库与CMSIS

前面我们讲到, STM32 固件库就是函数的集合,那么对这些函数有什么要求呢??这里就涉及到一个 CMSIS 标准的基础知识,这部分知识可以从《Cortex-M3 权威指南》中了解到,我们这里只是对权威指南的讲解做个概括性的介绍。

经常有人问到 STM32 和 ARM 以及 ARM7 是什么关系这样的问题,其实 ARM 是一个做芯片标准的公司,它负责的是芯片内核的架构设计,而 TI, ST 这样的公司,他们并不做标准,他们是芯片公司,他们是根据 ARM 公司提供的芯片内核标准设计自己的芯片。

所以,任何一个做 Cortex-M3 芯片,他们的内核结构都是一样的,不同的是他们的存储器容量, 片上外设, IO 以及其他模块的区别。所以你会发现,不同公司设计的 Cortex-M3 芯片他们的端口数量,串口数量,控制方法这些都是有区别的, 这些资源他们可以根据自己的需求理念来设计。同一家公司设计的多种 Cortex-m3 内核芯片的片上外设也会有很大的区别,比如 STM32F103RBT 和 STM32F103ZET,他们的片上外设就有很大的区别。我们可以通过《Cortex-M3 权威指南》中的一个图来了解一下:  

image-20201012163811675

从上图可以看出,芯片虽然是芯片公司设计,但是内核却要服从 ARM 公司提出的 Cortex-M3内核标准了,理所当然,芯片公司每卖出一片芯片,需要向 ARM 公司交一定的专利费。  

既然大家都使用的是 Cortex-M3 核,也就是说,本质上大家都是一样的,这样 ARM 公司为了能让不同的芯片公司生产的 Cortex-M3 芯片能在软件上基本兼容,和芯片生产商共同提出了一套标准 CMSIS 标准(Cortex Microcontroller Software Interface Standard) ,翻译过来是“ARM Cortex™ 微控制器软件接口标准”。 ST 官方库就是根据这套标准设计的。这里我们又要引用参考资料里面的图片来看看基于 CMSIS 应用程序基本结构:  

image-20201012163955055

如图2所示,基于CMSIS标准的软件架构主要分为以下4层:用户应用层、操作系统及中间件接口层、CMSIS层、硬件寄存器层。

CMSIS层起着承上启下的作用

一方面该层对硬件寄存器层进行统一实现,屏蔽了不同厂商对 Cortex-M系列微处理器核内外设寄存器的不同定义;

另一方面又向上层的操作系统及中间件接口层和应用层提供接口,简化了应用程 序开发难度,使开发人员 能够在完全透明的情况下进行应用程序开发。

2. 学习资料下载及熟悉

电赛学习板的学习资料在百度网盘和CSDN中都可以下载

解压后的内容

image-20201012170305308

硬件资料

  1. 主要有电赛学习板的原理图
  2. 电赛学习板上各芯片的参考手册

学习资料

image-20201012174215574

工具软件

image-20201012174242490

工程模板

STM32 在 Keil5 上使用的工程配置

官方例程

主要是 ST 公司出的 STM32 固件库 V3.5 的原始资料

3. Keil5 的 安装和注册

  1. 在 [工具软件] 下找到 [MDK~Keil5]

image-20201012174541026

  1. 双击 [mdk515.exe],开始安装,选择 [next]。  

image-20201012160442101

  1. 选择 [ I agree to all the terms ...] ,点击 [next]

    image-20201012160556979

    1. 选择安装路径,路径不能带中文,点击 [next]  

      image-20201012160654240

小贴士

1、安装路径不能带中文,必须是英文路径
2、安装目录不能跟 51 的 KEIL 或者 KEIL4 冲突,三者目录必须分开
3、KEIL5 的安装比起 KEIL4 多了一个步骤,必须添加 MCU 库,不然没法使用。
4、如果使用的时候出现莫名其妙的错误,先百度查找解决方法。  

  1. 填写用户信息,全部填空格即可,点击 [next]

image-20201012160738524

  1. Finish,安装完成。

image-20201012160817576

  1. KEIL5 不像 KEIL4 那样自带了很多厂商的 MCU 型号,KEIL5 需要自己安装。把下面弹出的界面关掉,我们直接去 keil 的官网下载:http://www.keil.com/dd2/pack/,或者直接用我们下载好的包 [Keil.STM32F1xx_DFP.2.1.0.pack]。  

image-20201012174619193

  1. 把下载好的包双击安装即可,安装路径选择跟 KEIL5 一样的安装路径,安装成功之后,在 KEIL5 的 Pack Installer 中就可以看到我们安装的三个包,以后我们新建工程的时候,就有单片机的型号可选。  这里我只下载目前教程需要使用的 F1 系列的包。  

image-20201012161012872

  1. 通过 KEIL5 的快捷方式打开Keil,选择 [File] > [License Management] 复制 CID  (记得复制你自己电脑上的,别复制图片上的)

image-20201012161239022

  1. 在 [MDK~Keil5] 下找到 [注册.exe] 打开注册机,把刚刚复制的 CID 粘贴到注册机的 CID 框处;

    image-20201012161404462

  2. Target 选择 ARM,然后点击 Generate,复制注册机生成的 License ID Code ;

  3. 回到 KEIL5,[File] > [License Management] ,把刚刚从注册机复制到的 License ID Code粘贴到 New License ID Code(LIC)框处,点击 Add LIC。搞定,破解成功。  

    image-20201012161608817

小贴士:

这个操作步骤确实有点儿长,但是所幸大家只需要操作一次就好,后续我们就直接用它来写程序就行,希望大家多点儿耐心和细心,把它完成

4. 工程模板的介绍和使用

在 [工具软件] 中找到 [MDK~Keil5] 下的 [EmptyPro] 工程

image-20201012174651005

在 EmptyPro 录下建立以下几个目录

(1)CMSIS目录:官方库 [STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS] 下的源码;

(2)Devices目录:后续做项目需要用到的设备文件夹(暂时没用);

(3)FWlib目录 :官方库 [STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver] 下的源码;

(4)List目录:用于存放keil生成的list文件。于存放keil开发环境的工程文件,工程文件位置所在;

(5)Output目录:用于存放编译过程中生成的 16 进制文件,用于下载烧写程序到开发板上;

(6)Project目录:STM32工程文件的位置,平时就是从这里打开工程的;

(7)Startup目录:用于存放STM32处理器的启动引导代码。

(8)System目录:基础但最常用的代码 如 printf() 函数的重定向,延时函数,中断分组等。

(9)User目录:用于存放工程中主要的用户代码,如 main.c。

image-20201013113718981

User 目录下 大家可以看到我们最熟悉的 C 语言的 main(),对就是这里,接下来我们的主要操作也是在这里完成

System 文件夹下的内容简述

delay 文件夹内包含了 delay.c 和 delay.h 两个文件,这两个文件用来实现系统的延时功能,其中包含 3 个函数(这里我们不讲 SysTick_Handler 函数,该函数在讲 ucos 的时候再介绍):  

void delay_init(u8 SYSCLK);     // 延时函数的初始化:例如
void delay_ms(u16 nms);         // 毫秒级延时函数
void delay_us(u32 nus);         // 微秒级延时函数

sys 文件夹内包含了 sys.c 和 sys.h 两个文件。在 sys.h 里面定义了 STM32 的 IO 口输入读取宏定义和输出宏定义。 sys.c 里面只定义了一个中断分组函数。下面我们将分别向大家介绍  。

该部分代码在 sys.h 文件中,实现对 STM32 各个 IO 口的位操作,包括读入和输出。当然在这些函数调用之前,必须先进行 IO 口时钟的使能和 IO 口功能定义。此部分仅仅对IO 口进行输入输出读取和控制。   

位带操作简单的说, 就是把每个比特膨胀为一个 32 位的字,当访问这些字的时候就达到了访问比特的目的,比如说 BSRR 寄存器有 32 个位,那么可以映射到 32 个地址上,我们去访问这 32 个地址就达到访问 32 个比特的目的。 这样我们往某个地址写 1 就达到往对应比特位写 1 的目的,同样往某个地址写 0 就达到往对应的比特位写 0 的目的。  

usart 文件夹内包含了 usart.c 和 usart.h 两个文件。这两个文件用于串口的初始化和中  断接收。这里只是针对串口 1,比如你要用串口 2 或者其他的串口,只要对代码稍作修改就可以了。

usart.c 里面包含了 2 个函数:

void uart_init(u32 bound);          /// 串口1的初始化函数
void usart1_IRQHandler(void);       /// 串口1中断服务函数

这段引入 printf 函数支持的代码在 usart.h 头文件的最上方,这段代码加入之后便可以通过 printf 函数向串口发送我们需要的内容,方便开发过程中查看代码执行情况以及一些变量值。这段代码不需要修改,引入到 usart.h 即可。  

小贴士:这里我把操作简化了一些,后续我们就在这个工程上完成操作,具体创建空工程的操作很复杂,有兴趣的同学可以看文章 【Keil 创建空工程】

5. 下载程序到开发板

  1. 在 [工具软件] 中找到CH341串口驱动

    image-20201012180151943

  2. 双击CH341SER.EXE,点击安装串口驱动

    image-20201012154135474

  3. 安装完成后,使用USB线,将你的电脑和电赛学习板链接在一起,如下图所示:

    image-20201012154831095

  4. 右击 [此电脑] > [管理],选择 [设备管理器] , 查看识别的端口号,每个人电脑识别的可能不一样,例如:我的电脑是COM3

    image-20201012155121746

  5. 在  [工具软件]  中找到 STM下载器ISP;

    image-20201012180213591

  6. 双击打开 mcuisp.exe ,可以看到Port为COM3,如果没有点击搜索串口

    image-20201012155448073

  7. 点击image-20201012155554581 选项,选择 [EmptyPro] 中的 [Output] 目录下的 [Empty.hex] 文件

    image-20201012180250730

  8. 点击 [开始编程] 按钮,开始下载程序

    image-20201012180304348

  9. 等待进度条结束,下载完成,在开发板上按下复位按键(S2),即可以查看学习板上的状态了

    image-20201014101108627

小贴士:除了通过串口下载程序,也可以通过 JTAG 下载,操作比较复杂,具体见文档[ 通过 J-link 下载程序]

6. 今天练习

  1. 安装 RealView MDK 软件开发环境;
  2. 下载并运行程序,注意观看现象。
  3. 熟悉工程模板 EmptyPro 的代码;
专业铸就品质,梦想成就未来
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题
阅读排行 更多
广告位
0351-8210788
周一至周日 9:00-18:00
意见反馈:mind@unigress.com
关注我们

扫一扫关注我们

Powered by Discuz! X3.4 Licensed  © 2001-2013 Comsenz Inc.( 晋ICP备12005011 )