MDK环境下利用STM32库V3.5创建工程并调试的方法

更新时间:2023-05-20 22:16:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

MDK环境下利用STM32库V3.5创建工程并调试的方法

机电工程学院 STM32实践 张华林

MDK环境下利用STM32库V3.5创建工程并调试的方法

一、 STM32标准外设库及说明

1. 解压STM32F10x_StdPeriph_Lib_V3.5.0库到硬盘(如F盘)

2. 库中自带的MDK模板示例

1)位置

MDK环境下利用STM32库V3.5创建工程并调试的方法

2)工程组织结构

3)详细结构

MDK环境下利用STM32库V3.5创建工程并调试的方法

机电工程学院

STM32实践

张华林

MDK环境下利用STM32库V3.5创建工程并调试的方法

3. 库文件结构 1)Chm中的目录树

2)Windows资源管理器中的结构

MDK环境下利用STM32库V3.5创建工程并调试的方法

机电工程学院

STM32实践

张华林

MDK环境下利用STM32库V3.5创建工程并调试的方法

标准外设库的第一部分是CMSIS 和STM32F10x_StdPeriph_Driver,是STM32F10x CPU资源的总括:CMSIS 是独立于供应商的Cortex-M 处理器系列硬件抽象层,为芯片厂商和中间件供应商提供了简单的处理器软件接口,简化了软件复用工作,降低了Cortex-M 上操作系统的移植难度,并减少了新入门的微控制器开发者的学习曲线和新产品的上市时间;STM32F10x_StdPeriph_Driver则包括了分别对应包括了所有外设对应驱动函数,这些驱动函数均使用C语言编写,并提供了统一的易于调用的函数接口,供开发者使用。Project文件夹中则包括了ST官方的所有例程和基于不同编译器的项目模板,这些例程是学习和使用STM32的重要参考。Utilities包含了相关评估板的示例程序和驱动函数,供使用官方评估板的开发者使用,很多驱动函数同样可以作为学习的重要参考。

MDK环境下利用STM32库V3.5创建工程并调试的方法

CMSIS中

内核设备访问层:(CM3/CoreSupport)

core_cm3.h:CMSIS的Cortex-M3内核设备访问层头文件 core_cm3.c:CMSIS的Cortex-M3内核设备访问层源文件 微控制器外设访问层:(CM3/DeviceSupport/ST/STM32F10X)

stm32f10x.h:CMSIS的Cortex-M3 STM32f10xxx微控制器外设访问层头文件 system_stm32f10x.h:CMSIS的Cortex-M3 STM32f10xxx微控制器外设访问层头文件 system_stm32f10x.c:CMSIS的Cortex-M3 STM32f10xxx微控制器外设访问层源文件

STM32F10xxx标准外设库体系结构

MDK环境下利用STM32库V3.5创建工程并调试的方法

文件功能说明

MDK环境下利用STM32库V3.5创建工程并调试的方法

机电工程学院 STM32实践 张华林

在实际开发过程中,根据应用程序的需要,可以采取2种方法使用标准外设库(StdPeriph_Lib): (1) 使用外设驱动:这时应用程序开发基于外设驱动的API(应用编程接口)。用户只需要配置文件”stm32f10x_conf.h”,并使用相应的文件”stm32f10x_ppp.h/.c”即可。 (2) 不使用外设驱动:这时应用程序开发基于外设的寄存器结构和位定义文件。

标准外设库(StdPeriph_Lib)支持STM32F10xxx系列全部成员:大容量,中容量和小容量产品。实际开发中根据使用的STM32产品具体型号,用户可以通过文件”stm32f10x.h”中的预处理define或者通过开发环境中的全局设置来配置标准外设库(StdPeriph_Lib),一个define对应一个产品系列。 STM32F10x_LD:STM32小容量产品 STM32F10x_MD:STM32中容量产品 STM32F10x_HD:STM32大容量产品 在库文件中这些define的具体作用是: l 文件“stm3210f.h”中的中断IRQ定义

l 启动文件中的向量表,小容量,中容量,大容量产品各有一个启动文件 l 外设存储器映像和寄存器物理地址 l 产品设置:外部晶振(HSE)的值等 l 系统配置函数

通过宏定义这种方式,可以使标准外设库适用于不同系列的产品,同时也方便与不同产品之间的软件移植,极大的方便了软件的开发。

STM32F10XXX标准外设库的使用

标准外设库中包含了众多的变量定义和功能函数,如果不能了解他们的命名规范和使用规律将会给编程带来很大的麻烦,本节将主要叙述标准外设库中的相关规范,通过这些规范的学习可以更加灵活的使用固件库,同时也将极大增强程序的规范性和易读性,同时标准外设库中的这种规范也值得我们在进行其他相关的开发时使用和借鉴。

1. 缩写定义

MDK环境下利用STM32库V3.5创建工程并调试的方法

机电工程学院

STM32实践 张华林

2. 命名规则

标准外设库遵从以下命名规则 PPP表示任一外设缩写,例如:ADC。源程序文件和头文件命名都以“stm32f10x_”作为开头,例如:stm32f10x_conf.h。常量仅被应用于一个文件的,定义于该文件中;被应用于多个文件的,在对应头文件中定义。所有常量都由英文字母大写书写。寄存器作为常量处理。他们的命名都由英文字母大写书写。在大多数情况下,他们采用与缩写规范一致。外设函数的命名以该外设的缩写加下划线为开头。每个单词的第一个字母都由英文字母大写书写,例如:SPI_SendData。在函数名中,只允许存在一个下划线,用以分隔外设缩写和函数名的其它部分。对于函数命名,总的来说有以下规则:

l 名为PPP_Init的函数,其功能是根据PPP_InitTypeDef中指定的参数,初始化外设PPP,例如

TIM_Init. l 名为PPP_DeInit的函数,其功能为复位外设PPP的所有寄存器至缺省值,例如TIM_DeInit. l 名为PPP_Init的函数,其功能为通过设置PPP_InitTypeDef 结构中的各种参数来定义外设的

功能,例如:USART_Init . l 名为PPP_Cmd的函数,其功能为使能或者失能外设PPP,例如: SPI_Cmd.

l 名为PPP_ITConfig的函数,其功能为使能或者失能来自外设PPP某中断源,例如:

RCC_ITConfig.

MDK环境下利用STM32库V3.5创建工程并调试的方法

l 名为PPP_DMAConfig的函数,其功能为使能或者失能外设PPP的DMA接口,例如:

TIM1_DMAConfig. l 用以配置外设功能的函数,总是以字符串“Config”结尾,例如GPIO_PinRemapConfig. l 名为PPP_GetFlagStatus的函数,其功能为检查外设PPP某标志位被设置与否,例如:

I2C_GetFlagStatus. l 名为PPP_ClearFlag的函数,其功能为清除外设PPP标志位,例如:I2C_ClearFlag. l 名为PPP_GetITStatus的函数,其功能为判断来自外设PPP的中断发生与否,例如:

I2C_GetITStatus. l 名为PPP_ClearITPendingBit的函数,其功能为清除外设PPP中断待处理标志位,例如:

I2C_ClearITPendingBit.

3. 变量类型定义

在早期的版本中有24个变量类型定义,在Keil的安装根目录下,可以找到对应的定义,路径为:Keil\ARM\INC\ST\STM32F10x\stm32f10x_type.h

/* Includes ------------------------------------------------------------------*/ /* Exported types ------------------------------------------------------------*/ typedef signed long s32; typedef signed short s16; typedef signed char s8;

typedef signed long const sc32; /* Read Only */ typedef signed short const sc16; /* Read Only */ typedef signed char const sc8; /* Read Only */ typedef volatile signed long vs32; typedef volatile signed short vs16; typedef volatile signed char vs8;

typedef volatile signed long const vsc32; /* Read Only */ typedef volatile signed short const vsc16; /* Read Only */ typedef volatile signed char const vsc8; /* Read Only */ typedef unsigned long u32; typedef unsigned short u16; typedef unsigned char u8;

typedef unsigned long const uc32; /* Read Only */ typedef unsigned short const uc16; /* Read Only */ typedef unsigned char const uc8; /* Read Only */ typedef volatile unsigned long vu32; typedef volatile unsigned short vu16; typedef volatile unsigned char vu8;

typedef volatile unsigned long const vuc32; /* Read Only */

MDK环境下利用STM32库V3.5创建工程并调试的方法

typedef volatile unsigned short const vuc16; /* Read Only */ typedef volatile unsigned char const vuc8; /* Read Only */

3.0以后的版本中使用了CMSIS数据类型,变量的定义有所不同,但是出于兼容旧版本的目的,以上的数据类型仍然兼容。CMSIS的IO类型限定词如表 5-7所示,CMSIS和STM32固件库的数据类型对比如表 5-8所示。这些数据类型可以在

STM32F10x_StdPeriph_Lib_V3.4.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\stm32f10x.h中找到具体的定义,此部分定义如下。

/*!< STM32F10x Standard Peripheral Library old types (maintained for legacy purpose) */

typedef int32_t s32; typedef int16_t s16; typedef int8_t s8;

typedef const int32_t sc32; /*!< Read Only */ typedef const int16_t sc16; /*!< Read Only */ typedef const int8_t sc8; /*!< Read Only */ typedef __IO int32_t vs32; typedef __IO int16_t vs16; typedef __IO int8_t vs8;

typedef __I int32_t vsc32; /*!< Read Only */ typedef __I int16_t vsc16; /*!< Read Only */ typedef __I int8_t vsc8; /*!< Read Only */ typedef uint32_t u32; typedef uint16_t u16; typedef uint8_t u8;

typedef const uint32_t uc32; /*!< Read Only */ typedef const uint16_t uc16; /*!< Read Only */ typedef const uint8_t uc8; /*!< Read Only */ typedef __IO uint32_t vu32; typedef __IO uint16_t vu16; typedef __IO uint8_t vu8;

typedef __I uint32_t vuc32; /*!< Read Only */ typedef __I uint16_t vuc16; /*!< Read Only */ typedef __I uint8_t vuc8; /*!< Read Only */

MDK环境下利用STM32库V3.5创建工程并调试的方法

CMSIS IO类型限定词

固件库与CMSIS数据类型对比

MDK环境下利用STM32库V3.5创建工程并调试的方法

stm32f10x.h文件中还包含了常用的布尔形变量定义,如:

typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus; typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;

#define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE)) typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus;

不同版本的标准外设库的变量定义略有不同,如3.4版本中就没有之前版本的TRUE和FALSE的定义,用户也可以根据自己的需求按照上面的格式定义自己的布尔形变量。在使用标准外设库进行开发遇到相关的定义问题时应首先找到对应的头文件定义。

4. 使用步骤

“stm32f10x.h”是整个标准外设库的入口文件,这个文件包含了STM32F10x全系列所有外设寄存器的定义(寄存器的基地址和布局)、位定义、中断向量表、存储空间的地址映射等。为了是这个文件适用于不同系列的产品,程序中是通过宏定义来实现不同产品的匹配的,程序的注释中已经详细给出了每个启动文件所对应的产品系列,与之对应,也要相应的修改这个入口文件,需要根据所使用的产品系列正确的注释/去掉相应的注释define。在这段程序的下方同样有这样的一个注释程序*#define USE_STDPERIPH_DRIVER*/ 用于选择是否使用标准外设库,如果保留这个注释,则用户开发程序可以基于直接访问“stm32f10x.h”中定义的外设寄存器,所有的操作均基于寄存器完成,目前不使用固件库的单片机开发,如51、AVR、MSP430等其实都是采用此种方式,通过在对应型号的头文件中进行外设寄存器等方面的定义,从而在程序中对相应的寄存器操作完成相应的功能设计。

如果去掉/*#define USE_STDPERIPH_DRIVER*/的注释,则是使用标准外设库进行开发,用户需要使用在文件“stm32f10x_conf.h”中,选择要用的外设,外设同样是通过注释/去掉注释的方式来选择。示例程序如下:

/* Uncomment the line below to enable peripheral header file inclusion */ #include "stm32f10x_adc.h" /* #include "stm32f10x_bkp.h" */ /* #include "stm32f10x_can.h" */ /* #include "stm32f10x_cec.h" */ /* #include "stm32f10x_crc.h" */

MDK环境下利用STM32库V3.5创建工程并调试的方法

/* #include "stm32f10x_dac.h" */

/* #include "stm32f10x_dbgmcu.h" */ #include "stm32f10x_dma.h"

/* #include "stm32f10x_exti.h" */ /* #include "stm32f10x_flash.h" */ /* #include "stm32f10x_fsmc.h" */ #include "stm32f10x_gpio.h" /* #include "stm32f10x_i2c.h" */ /* #include "stm32f10x_iwdg.h" */ /* #include "stm32f10x_pwr.h" */ #include "stm32f10x_rcc.h" /* #include "stm32f10x_rtc.h" */ /* #include "stm32f10x_sdio.h" */ /* #include "stm32f10x_spi.h" */ /* #include "stm32f10x_tim.h" */ /* #include "stm32f10x_usart.h" */ /* #include "stm32f10x_wwdg.h" */

#include "misc.h" /* High level functions for NVIC and SysTick (add-on to CMSIS functions) */

上面一段程序来自于例程中的AD采集程序,程序使用了AD和DMA,因此去掉相应的注释,同时几乎所有的应用都需要使用复位与时钟以及通用I/O,因此这两项是必须的,而多数程序同样要使用NVIC中断IRQ设置和SysTick时钟源设置,那么 “misc.h”这一项也是必须的。

上面已经针对具体的产品信号和程序功能进行了针对性的配置,接下来需要配置系统所使用的时钟,系统时钟在“system_stm32f10x.c”同样通过注释的方式来配置,程序如下:

#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL) /* #define SYSCLK_FREQ_HSE HSE_VALUE */ #define SYSCLK_FREQ_24MHz 24000000 #else

/* #define SYSCLK_FREQ_HSE HSE_VALUE */ /* #define SYSCLK_FREQ_24MHz 24000000 */ /* #define SYSCLK_FREQ_36MHz 36000000 */ /* #define SYSCLK_FREQ_48MHz 48000000 */ /* #define SYSCLK_FREQ_56MHz 56000000 */ #define SYSCLK_FREQ_72MHz 72000000 #endif

MDK环境下利用STM32库V3.5创建工程并调试的方法

二、 在MDK中创建工程

1. 新建keil工程

MDK环境下利用STM32库V3.5创建工程并调试的方法

2.修改工程树

MDK环境下利用STM32库V3.5创建工程并调试的方法

3.修改工程Option属性 1)Output设置

2)listing设置

MDK环境下利用STM32库V3.5创建工程并调试的方法

3)c/c++

①Define预定义USE_STDPERIPH_DRIVER, STM32F10X_MD_VL(逗号隔开)

②头文件路径

MDK环境下利用STM32库V3.5创建工程并调试的方法

加入以下路径

MDK环境下利用STM32库V3.5创建工程并调试的方法

4)Debug设置

4. 拷贝库模板中的代码到工程的user文件夹下

本文来源:https://www.bwwdw.com/article/ja44.html

Top