mdk5软件和stm32包 的安装并完成一个简单的stm32程序的编译

    科技2026-02-16  9

    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有了一个初步的了解,还需自己后续勤加钻研。

    Processed: 0.011, SQL: 9