LV.23 D2 开发环境搭建及平台介绍 学习笔记

一、Keil MDK-ARM简介及安装

        Keil MDK,也称MDK-ARM,Realview MDK (Microcontroller Development Kit)等。目前Keil MDK 由三家国内代理商提供技术支持和相关服务。  

        MDK-ARM软件为基于Cortex-M、Cortex-R4、ARM7、ARM9处理器设备提供了一个完整的开发环境。 MDK-ARM专为微控制器应用而设计,不仅易学易用,而且功能强大,能够满足大多数苛刻的嵌入式应用。

        MDK-ARM有四个可用版本,分别是MDK-Lite、MDK-Basic、MDK-Standard、  MDK-Professional。所有版本均提供一个完善的C / C++开发环境,其中MDK-Professional还包含大量的中间库。

Keil MDK-ARM功能特点

        完美支持Cortex-M、Cortex-R4、ARM7和ARM9系列器件。

        行业领先的ARM C/C++编译工具链

        确定的Keil RTX ,小封装实时操作系统(带源码)

        μVision5 IDE集成开发环境,调试器和仿真环境

        TCP/IP网络套件提供多种的协议和各种应用

        为带图形用户接口的嵌入式系统提供了完善的GUI库支持

        ULINKpro可实时分析运行中的应用程序,且能记录Cortex-M指令的每一次执行

        大量的项目例程帮助你快速熟悉MDK-ARM强大的内置特征

        符合CMSIS (Cortex微控制器软件接口标准)

Keil MDK-ARM获取

https://www.keil.com/demo/eval/arm.htm#/DOWNLOAD

Keil MDK-ARM安装

        安装MDK-523.exe  这keil5软件的安装包,不要有中文路径  

        安装Keil.STM32F0XX_DFP.1.4.0.pack  这是STM32F0设备安装包  

        运行KEIL_Lic(1).exe 破解keil (以管理员权限运行keil破解)

        注:keil安装过程可参考  DAY1-ARM体系结构概述\实验手册\WIFI-COTEXM0实验手册 第三章 开发环境搭建

 安装 ST_LINK 烧写工具

        ST_LINK 是 STM32 芯片的仿真器,这里介绍烧写工具的安装,通过这个软件操作ST_LINK 将.hex 文件烧写到芯片上。此软件用于为 M0 烧写 bootloader 文件。我们在 keil中编译好的代码可以使用它们本身进行下载。

        软件路径:DAY2-STM32开发环境搭建\安装软件包\ST-Link驱动及工具\STM32 ST-LINK Utility_v3.1.0  

        注:ST_lINK安装过程可参考  DAY1-ARM体系结构概述\实验手册\WIFI-COTEXM0实验手册 3.6节

 

二、STM32CubeMX简介及安装

STM32CubeMX简介

        直观的选择STM32微控制器  

        微控制器图形化配置

                自动处理引脚冲突

                动态设置确定的时钟树

                可以动态确定参数设置的外围和中间件模式和初始化

                功耗预测  

        C代码工程生成器覆盖了STM32微控制器初始化编译软件,如IAR,KEIL,GCC可以独立使用,作为Eclipse插件使用

TM32CubeMX获取

        官网地址: http://www.st.com/en/development-tools/stm32cubemx.html

 STM32CubeMX安装

 

        安装JAVA运行环境,JavaSetup8u151.exe  

        解压stm32cubemx.zip,安装SetupSTM32CubeMX-4.22.0.exe,最好不要有中文路径

        解压stm32cube_fw_f0_v180.zip到STM32CubeMX的安装路径中  

        注:安装过程可参考  DAY1-ARM体系结构概述\实验手册\WIFI-COTEXM0实验手册 第三章 开发环境搭建 

 STM32CubeMX——创建工程

 

点击New Project创建工程 

 

把工程名称和路径选择好

 

然后点击ok ,然后开始生成对应的工程源代码,导出一个Keil5的工程。

 击Open Project后,就会调用Keil5来打开这个工程。

我们用CubeMX和Keil5联合对STM32进行开发,CubeMX主要是前期的配置过程。

三、STM32储存器映射 

3.1 Cortex-M0存储器映射

        注:被控单元的FLASH,RAM和AHB到APB的桥(即片上外设),这些功能部件共同排列在一个 4GB 的地址空间内。我们在编程的时候,可以通过他们的地址找到他们,然后来操作他们

存储器本身没有地址,给存储器分配地址的过程叫存储器映射 

3.2 STM32F0存储器映射

STM32F05x 存储器映像和外设寄存器编址

 在中文参考手册的2.2中可以找到

3.3 寄存器的访问方式

以GPIOA寄存器组为例、如何读写ODR寄存器?

        以知GPIOA的起始地址为0x48000000

        各寄存器的偏移地址如下:

        MODER;             /*Address offset: 0x00 */

        OTYPER;             /*Address offset: 0x04 */

        OSPEEDR;          /*Address offset: 0x08 */

        PUPDR;              /*Address offset: 0x0C */

        IDR;                   /*Address offset: 0x10 */

        ODR;                 /*Address offset: 0x14 */

        BSRR;               /*Address offset: 0x18 */

        LCKR;               /*Address offset: 0x1C */

如何访问寄存器——第一种方式

对地址进行宏定义

#define     GPIOA_BASE        ( (unsigned int ) 0x48000000 )

#define     GPIOA_ODR         ( GPIOA_BASE  +  0x14 )

读操作

val  = *(unsigned int *) GPIOA_ODR  ;

写操作

*(unsigned int *)  GPIOA_ODR = val  ;  

改进

#define     GPIOA_ODR    ( *(unsigned int *) ( GPIOA_BASE  +  0x14 ))

val  = GPIOA_ODR  ;    //读

GPIOA_ODR = val  ;     //写

如何访问外设寄存器——第二种方式

         用结构体封装寄存器

        用上面的方法去定义地址,还是稍显繁琐、根据我们每一类外设对应的寄存器组地址都是连续增长的特点,我们引入 C 语言中的结构体语法对寄存器进行封装、 

typedef struct {
        uint32_t        MODER;             /*Address offset: 0x00 */
        uint32_t        OTYPER;     /*Address offset: 0x04 */
        uint32_t        OSPEEDR;     /*Address offset: 0x08 */
        uint32_t        PUPDR;         /*Address offset: 0x0C */
        uint32_t        IDR;         /*Address offset: 0x10 */
        uint32_t        ODR;         /*Address offset: 0x14 */
        uint32_t        BSRR;         /*Address offset: 0x18 */
        uint32_t        LCKR;         /*Address offset: 0x1C */
} GPIO_TypeDef;
#define     GPIOA_BASE        ( (unsigned int ) 0x48000000 )
#define     GPIOA     ((GPIO_TypeDef *) GPIOA_BASE) 

注:我们访问GPIOA的控制寄存器组时、直接使用宏定义好 GPIO_TypeDef 类型的指针,而且指针指向 GPIOA端口的首地址,这样我们直接用宏GPIOA访问改外设的任意一个寄存器

GPIOA->MODER     =  0x20 ;

GPIOA->OSPEEDR  =  0x16 ;

四、STM32启动文件分析 

STM32F0启动模式

 

        注:Cortex-M0 的程序映像通常是从地址 0x00000000 开始的、系统复位后,处理器首先读取向量表中的前两个字(8 个字节),第一个字存入 MSP,第二个字为复位向量,它表示程序执行的起始地址(复位处理)

 

        根据启动模式的不同,用户闪存、系统闪存和SRAM都 可以映射到0x0的低端地址;      

        我们的板子boot0直接接地,因此启动区域为flash启动

C语言程序内存排布

 

注:        

        栈的作用是用于局部变量,函数调用,函数形参等的开销        

        堆主要用来动态内存的分配 

启动文件startup_stm32f051.s分析 (下方课件中)