一、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分析 (下方课件中)