MDK5的组成如下(核心包括4个部分:uVision IDE with Editor(编辑器),ARM C/C++ Compiler(编译器),Pack Installer(包安装器),uVision Debugger with Trace(调试跟踪器)。Software Packs(包安装器)又分为:Device(芯片支持),CMSIS(ARM Cortex 微控制器软件接口标准)和 Mdidleware(中间库)三个小部分):
准备好MDK5安装包和F1的芯片支持:
安装完成后离线导入芯片支持包即可:
我们下面都用库函数开发,首先介绍一下库函数。固件库就是函数的集合,固件库函数的作用是向下负责与寄存器直接打交道,向上提供用户函数调用的接口(API)。
例如,再51中直接操作寄存器:
P0=0x11;
32中也可以直接操作寄存器:
GPIOx->BRR = 0x0011;
但STM32的寄存器太多了,为了方便开发者,官方才推出固件库函数,如下:
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
GPIOx->BRR = GPIO_Pin;
}
但要精通STM32,还是要了解以下寄存器实现的原理的。
Cortex-M3芯片的结构如下:
为了让所有使用Cortex-M3芯片的公司软件兼容,ARM和芯片商共同提出了CMSIS标准(Cortex Microcontroller Software Interface Standard),即微控制器软件接口标准。STM32也适用。下面是基于CMSIS的应用程序结构:
CMSIS 分为 3 个基本功能层:
可以看出,CMSIS 层在整个系统中是处于中间层,向下负责与内核和各个外设直接打交道,向上提供实时操作系统用户程序调用的函数接口。通过制定标准,其他公司设计的库函数都得到了规范。例如,CMSIS 规范就规定,系统初始化函数名字必须为 SystemInit。
用Keil新建工程,选择芯片型号STM32F103ZET6:
到这里,我们还只是建了一个框架,还需要添加启动代码,以及.c 文件等。
创建完成如下,并将相关文件复制到指定文件夹(不赘述):
然后进入管理工程,将创建的目录添加进工程:
然后将相关C代码添加进来:
工程目录如下:
然后编译工程,首先选择中间文件生成目录:
选择需要包含的头文件目录:
另外,库函数在配置和选择外设的时候通过宏定义来选择的,所以我们需要配置一个全局的宏定义变量:STM32F10X_HD,USE_STDPERIPH_DRIVER
然后编译:
工程模板基本建立完毕,然后还需要进行一些额外的配置:
让编译之后能够生成 hex 文件;
编译生成hex文件后,此时只接上USB_232串口就可以下载程序到板上了:
效果如下:
zdyz还提供了三个函数,我们可以直接加到工程中,后面方便调用:
除了用串口下载hex文件外,还可以通过ST-Link的SW方式下载,这种方式比较快,可以实时跟踪调试,推荐使用。
设置好使用ST-Link及相关频率:
并设置好Dialog DLL,以支持STM32的软硬件仿真:
此外,还要安装ST-Link的驱动,否则会显示找不到目标器件:
以上。