mdk5软件和stm32包 的安装并完成一个简单的stm32程序的编译
实验内容:(1)安装并熟悉mdk软件
(2)安装stm32包
(3)完成一个简单的stm32程序的编译
1.1MDK5简介:
MDK是目前针 对 ARM 处理器,尤其是 Cortex-M 内核处理器的最佳开发工具。MDK5 由两个部分组 成:MDKTools 和 SoftwarePacks,,MDK Tools 又分成三个部分:MDK-Core、ARMC/C++ Compiler 和 DS-MDK。MDK-Core 是基于 uVision IDE 和调试器,主要支持Cortex-M 和新的 Armv8-M 架构;ARMC/C++Compiler 包括两个编译器,带有汇 编器、连接器以及专为优化代码大小和性能的高度优化的运行时库;DS-MDK 包 括基于 eclipse 的 DS-5IDE 和调试器,支持 32 位 ARMCortex-A 处理器和广泛的 系统(32 位 ARMCortex-A 和 Cortex-M)。 SoftwarePacks 又分为:Device(芯片支持),CMSIS(ARMCortex 微控制器 软件接口标准)和 Mdidleware(中间库)三个部分。软件包可以随时添加到 MDK 的核心或 ds-mdk 以保证对新设备的支持和使中间件独立于工具链的更新。包括设 备支持、CMSIS 库、中间件、板支持、代码模板和例程。IPv4/IPv6 通信协议栈 也扩展了支持 ARM®mbed™软件部分,使物联网应用得以实现。
1.2MDK5的安装:
安装向导界面,点击next
勾选“I agree with all … Agreement",点击next
选择安装路径:
填写信息后点击next
等待安装:
安装完成,点击finish:
2.1 stm32简介
STM32 系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计 的 ARMCortex-M3 内核。按性能分成两个不同的系列:STM32F103“增强型”系 列和 STM32F101“基本型”系列。增强型系列时钟频率达到 72MHz,是同类产品 中性能最高的产品;基本型时钟频率为 36MHz,以 16 位产品的价格得到比 16 位产品大幅提升的性能,是 16 位产品用户的最佳选择。两个系列都内置 32K 到 128K 的闪存,不同的是 SRAM 的最大容量和外设接口的组合。时钟频率 72MHz 时,从闪存执行代码,STM32 功耗 36mA,是 32 位市场上功耗最低的产品,相 当于 0.5mA/MHz。
2.2 stm32包安装
ARM CMSIS 3.20.4安装
Keil STM32F1xx__DFP 1.0.4的安装
3.1 STM32的简单程序编译:
MLED工程的创建:
选择STM32
对Run-Time Environment进行设置,设置完成后,点击OK
工程建立完成
3.2 编码编写(代码来源于网上)
$`//宏定义,用于存放stm32寄存器映射`$$$
# `define PERIPH_BASE ((unsigned int)0x40000000)//AHB`
# `define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)`
# `define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)`
`//GPIOA_BASE=0x40000000+0x10000+0x0800=0x40010800,该地址为GPIOA的基地址`
# `define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00)`
`//GPIOB_BASE=0x40000000+0x10000+0x0C00=0x40010C00,该地址为GPIOB的基地址`
# `define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)`
`//GPIOC_BASE=0x40000000+0x10000+0x1000=0x40011000,该地址为GPIOC的基地址`
# `define GPIOD_BASE (APB2PERIPH_BASE + 0x1400)`
`//GPIOD_BASE=0x40000000+0x10000+0x1400=0x40011400,该地址为GPIOD的基地址`
# `define GPIOE_BASE (APB2PERIPH_BASE + 0x1800)`
`//GPIOE_BASE=0x40000000+0x10000+0x0800=0x40011800,该地址为GPIOE的基地址`
# `define GPIOF_BASE (APB2PERIPH_BASE + 0x1C00)`
`//GPIOF_BASE=0x40000000+0x10000+0x0800=0x40011C00,该地址为GPIOF的基地址`
# `define GPIOG_BASE (APB2PERIPH_BASE + 0x2000)`
`//GPIOG_BASE=0x40000000+0x10000+0x0800=0x40012000,该地址为GPIOG的基地址`
# `define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C`
# `define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C`
# `define GPIOC_ODR_Addr (GPIOC_BASE+12) //0x4001100C`
# `define GPIOD_ODR_Addr (GPIOD_BASE+12) //0x4001140C`
# `define GPIOE_ODR_Addr (GPIOE_BASE+12) //0x4001180C`
# `define GPIOF_ODR_Addr (GPIOF_BASE+12) //0x40011A0C`
# `define GPIOG_ODR_Addr (GPIOG_BASE+12) //0x40011E0C`
# `define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))`
# `define MEM_ADDR(addr) *((volatile unsigned long *)(addr))`
# `define LED0 MEM_ADDR(BITBAND(GPIOA_ODR_Addr,8))`
`//#define LED0 *((volatile unsigned long *)(0x422101a0)) //PA8`
`//定义typedef类型别名`
`typedef struct`
`{`
volatile unsigned int CR;
volatile unsigned int CFGR;
volatile unsigned int CIR;
volatile unsigned int APB2RSTR;
volatile unsigned int APB1RSTR;
volatile unsigned int AHBENR;
volatile unsigned int APB2ENR;
volatile unsigned int APB1ENR;
volatile unsigned int BDCR;
volatile unsigned int CSR;
`} RCC_TypeDef;`
# `define RCC ((RCC_TypeDef *)0x40021000)`
`//定义typedef类型别名`
`typedef struct`
`{`
`volatile unsigned int CRL;`
`volatile unsigned int CRH;`
`volatile unsigned int IDR;`
`volatile unsigned int ODR;`
`volatile unsigned int BSRR;`
`volatile unsigned int BRR;`
`volatile unsigned int LCKR;`
`} GPIO_TypeDef;`
`//GPIOA指向地址GPIOA_BASE,GPIOA_BASE地址存放的数据类型为GPIO_TypeDef`
# `define GPIOA ((GPIO_TypeDef *)GPIOA_BASE)`
`void LEDInit( void )`
`{`
RCC->APB2ENR|=1<<2; //GPIOA 时钟开启
GPIOA->CRH&=0XFFFFFFF0;
GPIOA->CRH|=0X00000003;
`}`
`//粗略延时`
`void Delay_ms( volatile unsigned int t)`
`{`
unsigned int i,n;
for (n=0;n<t;n++)
for (i=0;i<800;i++);
`}`
`int main(void)`
`{`
LEDInit();
while (1)
{
LED0=0;//LED熄灭
Delay_ms(500);//延时时间
LED0=1;//LED亮
Delay_ms(500);//延时时间
}
`}`
3.3 调试环境设置;
3.4 将文件保存到text.c中并将其添加到Source Group1中
3.5 编译text.c文件
总结:从刚开始的安装MDK到之后使用MDK建立工程,并完成一个stm32程序的编译会遇到各种问题,自己要善于寻找解决的办法,'LED’闪烁试验只是让自己初步熟悉了MDK的开发环境和对stm32有了一个初步的了解,还需自己后续勤加钻研。