嵌入式系统原理与应用 课件 第6章 基于STM32F103微控制器的嵌入式系统开发基础2_第1页
嵌入式系统原理与应用 课件 第6章 基于STM32F103微控制器的嵌入式系统开发基础2_第2页
嵌入式系统原理与应用 课件 第6章 基于STM32F103微控制器的嵌入式系统开发基础2_第3页
嵌入式系统原理与应用 课件 第6章 基于STM32F103微控制器的嵌入式系统开发基础2_第4页
嵌入式系统原理与应用 课件 第6章 基于STM32F103微控制器的嵌入式系统开发基础2_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式系统设计西安邮电大学计算机学院王忠民2025/11/28本章学习目的熟悉并掌握与STM32微控制器开发相关的特有C语言基础知识,这是读者进行基于寄存器或固件库开发的基础了解基于意法半导体公司的STM32微控制器开发的四种模式寄存器开发模式、标准库开发模式、基于STM32Cube平台的HAL库和LL库开发模式各自的特点,重点理解寄存器开发和库函数开发实现的机理,了解STM32Cube平台的特点。理解ARMCortex微控制器软件接口标准CMSIS(CortexMicrocontrollerSoftwareInterfaceStandard)提出的目的和基本组成,掌握寄存器开发的基本原理和开发步骤理解基于标准外设库开发的基本原理,熟练掌握标准外设库工程的构建方法。第6章基于STM32F103微控制器的嵌入式系统开发基础---学习目的2025/11/28第6章基于STM32F103微控制器的嵌入式系统开发基础(1) 6.1微控制器开发语言基础 6.2STM32F103嵌入式系统开发模式 6.2.1寄存器开发模式 6.2.2标准外设库开发模式 6.2.3基于STM32Cube平台的HAL库和LL库开发模式 6.2.3HAL库开发模式 6.2.4LL库开发模式第6章基于STM32F103微控制器的嵌入式系统开发基础(2)6.2ARMCortex微控制器软件接口标准CMSIS 6.2.1CMSIS软件接口标准 6.2.2STM32F1xx微控制器的软件包CMSIS下载与安装 6.3

STM32F1标准外设库

6.4基于标准外设库的工程构建 6.5Proteus嵌入式系统仿真与调试

2025/11/28第6章基于STM32F103微控制器的嵌入式系统开发基础---学习内容目录第6章基于STM32F103微控制器的嵌入式系统开发基础---目录第6章基于STM32F103微控制器的嵌入式系统开发基础(2)6.2ARMCortex微控制器软件接口标准CMSIS 6.2.1CMSIS软件接口标准 6.2.2STM32F1xx微控制器的软件包CMSIS下载与安装 6.3STM32F1标准外设库

6.4基于标准外设库的工程构建 6.5Proteus嵌入式系统仿真与调试

为了解决不同芯片厂商生产的基于Cortex内核的微处理器在软件上的兼容问题,ARM公司与众多芯片和软件厂商共同制定了CMSIS(CortexMicrocontrollerSoftwareInterfaceStandard)标准,旨在将所有Cortex内核产品的软件接口标准化。半导体厂商在推出微控制器芯片的同时,基于该标准开发了相应的设备支持包,这样就可以方便嵌入式软件在不同微处理器芯片之间的移植了。第6章基于STM32F103微控制器的嵌入式系统开发基础---ARMCortex微控制器软件接口标准CMSIS2025/11/28CMSIS在Cortex-M3微控制器产业链中的作用

1.

统一软件接口,降低开发门槛:不同半导体厂商(如ST、NXP、TI等)生产的Cortex-M3微控制器,硬件外设和寄存器地址可能存在差异。CMSIS定义了一套标准化的底层硬件抽象接口(如寄存器访问、中断处理、系统时钟等),开发者无需深入了解不同厂商的硬件细节,即可用统一的代码框架开发应用,大幅减少了学习成本和移植工作量。

2.

加速软件开发与生态整合:

基于CMSIS标准,工具链厂商(如Keil、IAR)可开发通用的编译、调试工具,中间件供应商(如RTOS、文件系统)也能提供标准化的接口适配。这使得开发者可以轻松复用软件组件,缩短产品开发周期,推动整个产业链的软件生态标准化。

3.

促进跨平台兼容性与代码复用:

例如,一款基于STM32(ST厂商)开发的程序,若遵循CMSIS标准,只需少量修改即可移植到NXP的Cortex-M3芯片上,避免了因硬件差异导致的代码重写问题,增强了软件的跨平台兼容性。

4.

推动行业协作与标准化发展:CMSIS作为开放标准,让不同厂商的产品在软件层面具备一致性,有助于行业内的技术协作(如联合开发解决方案、共享代码资源),同时也降低了用户的技术锁定风险,推动Cortex-M3微控制器在工业控制、消费电子等领域的规模化应用。

简而言之,CMSIS就像产业链中的“通用语言”,通过统一软件接口,解决了不同厂商产品的兼容性问题,加速了开发效率,最终推动了Cortex-M3生态的繁荣与标准化发展。第6章基于STM32F103微控制器的嵌入式系统开发基础---ARMCortex微控制器软件接口标准CMSIS2025/11/28基于CMSIS(CortexMicrocontrollerSoftwareInterfaceStandard)标准的软件架构中,CMSIS层扮演着至关重要的角色;CMSIS向上提供实时操作系统内核外设函数、中间件函数、片上外设函数的用户程序调用的接口,实现了各个片内外设驱动文件文件名的规范化和操作函数的规范化等;CMSIS向下负责与内核和各个外设直接交互,CMSIS为微控制器(MCU)的硬件层提供了抽象层,这意味着它隐藏了硬件的具体实现细节,向上层(RTOS和用户应用程序)提供了一套统一且简单的接口;CMSIS通过定义标准化的接口,使得不同芯片厂商生产的基于Cortex-M处理器的微控制器在软件层面上具有更高的兼容性,这有助于减少因硬件差异而导致的软件移植问题,降低了开发成本;CMSIS通过提供内核外设函数、中间件函数和片上外设函数,使得开发人员能够更加专注于应用程序的开发,而无需深入了解硬件的具体细节,这大大提高了开发效率。

第6章基于STM32F103微控制器的嵌入式系统开发基础---ARMCortex微控制器软件接口标准CMSIS2025/11/28意法半导体公司基于CMSIS软件接口标准,为基于CortexM3核的系列微控制器开发了相应的设备支持包DFP(DeviceFamilyPack)和标准外设库。比如针对本书选用的STM32F1系列微控制器,就需要使用:(1)Keil.STM32F1xx_DFP.pack设备支持包---本节介绍,要集成到MDK5开发工具中(2)STM32F10x_StdPeriph_Lib_V3.x.x标准外设库---相关函数关联到所开发的工程中。下节介绍第6章基于STM32F103微控制器的嵌入式系统开发基础---STM32F1xx微控制器的设备支持包下载与安装2025/11/28设备支持包的下载:从Keil官网上下载项目所选用的微控制芯片的软件支持包的具体步骤如下:(1)打开Keil官网,在主页上点击“Products”菜单项。(2)在ARM-Keil产品页面,找到“ARMDevelopmentTools”选项,点击进入armDeveloper页面。(3)在armDeveloper页面,找到“CMSISpacks”,点击“CMSIS-Packindex”链接,进入ARM-Keil支持的各大半导体厂商的CMSISPacks页面。(4)在搜索框键入“STM32F1”,即可找到STM32F103系列微控制器对应的设备支持包,目前找到的最新版本为2.4.1(注意,意法半导体公司会不断推出新的版本,目前使用较多的是早一些推出的keil.STM32F1xx_DFP.1.0.5.pack)。第6章基于STM32F103微控制器的嵌入式系统开发基础---STM32F1xx微控制器的设备支持包下载与安装2025/11/28设备支持包的安装:(1)确信已安装了KeilMDK集成开发环境。如果未安装,需要从Keil官网()下载并安装最新版本的KeilMDK。(2)双击下载好的Keil.STM32F1xx_DFP.2.4.1.pack,选择将其安装在系统默认的KeilMDK5文件夹下,单击“Next”按钮开始安装。安装完成后,单击“Finish”按钮完成设备支持包的安装。(3)查看STM32F1系列设备支持包安装是否成功。打开KeilMDK集成开发环境,点击Project->Manage->PackInstaller…,弹出如图6.4所示的对话框。可以看出,意法半导体公司的STM32F1系列(STM32F100~STM32F107)8子系列的微控制器设备支持包已安装,目前安装的Keil.STM32F1xx_DFP.2.4.1.pack是意法半导体公司2023-05-12推出的,是目前最新的版本。可以看出,STM32F103系列共有29款不同的微控制器芯片。STM32F1系列微控制器的支持包Keil.STM32F1xx_DFP.2.4.1.pack下载:/packs/?q=STM32F1&pack-search=STM32F1系列微控制器的设备支持包安装完成后,就可以进行基于STM32F1系列某款微控制器的工程的构建了。这里举例仅想说明设备支持包在工程构建过程的作用,以及基于设备支持包生成的相关工程文件。构建一个完整的工程,不仅需要设备支持包的支持,同时还需要标准外设库的支持。1.构建存放工程的文件夹假设我们要构建一个基于STM32F103R6微控制器的工程,首先构建一个空的工程文件夹,这里我们在桌面上创建一个名为321的文件夹,再在该文件夹中创建一个project子文件夹,用于存放MDK生成的工程文件、过程文件等。2.构建工程打开KeilMDK,点击Project->NewμVisionProject…,在弹出的段画框中选择要放置工程的文件夹(桌面上的321\project),输入工程名321(工程名与文件夹同名),点击保存,弹出如图6.5所示的“SlectDeviceforTarget’Target1’…”对话框,选择STM32F103R6,点击OK。3.查看生成的工程文件321.uvprojx为工程文件,该文件在KeilMDK生成STM32F1微控制器工程时具有至关重要的作用。默认生成的Objects文件夹用于存放编译过程中产生的中间目标文件(ObjectFiles)。默认生成的Listing文件夹用于存放编译器编译时产生的列表清单文件(ListingFiles)。第6章基于STM32F103微控制器的嵌入式系统开发基础---基于设备支持包的工程构建2025/11/28目录第6章基于STM32F103微控制器的嵌入式系统开发基础---目录第6章基于STM32F103微控制器的嵌入式系统开发基础(2)6.2ARMCortex微控制器软件接口标准CMSIS 6.2.1CMSIS软件接口标准 6.2.2STM32F1xx微控制器的软件包CMSIS下载与安装 6.3STM32F1标准外设库 6.4基于标准外设库的工程构建

6.5Proteus嵌入式系统仿真与调试

Libraries文件夹(1)CMSIS\CM3文件夹用于存放符合CMSIS标准的文件,具体包括:1)内核支持文件文件夹(CoreSupport):包括core_cm3.c和core_cm3.h文件,提供了进入Cortex-M3内核的接口,是CMSIS标准的核心组成部分。它们由ARM公司提供,用于实现内核级别的功能,如中断管理、系统控制等。2)设备支持文件文件夹(DeviceSupport):这些文件包含了STM32F10x系列微控制器的寄存器定义、中断向量表以及系统时钟配置等。例如,system_stm32f10x.c和system_stm32f10x.h文件用于设置系统的时钟和总线配置,确保微控制器能够正确运行。3)启动文件文件夹(startup):包括高容量、中容量和低容量微控制器的启动文件,如高高容量芯片的启动文件startup_stm32f10x_hd.s。启动文件是用汇编语言编写的,负责在系统复位后初始化堆栈、设置中断向量表、配置系统时钟等,为C语言程序的运行准备环境。第6章基于STM32F103微控制器的嵌入式系统开发基础---STM32F1标准外设库2025/11/28STM32F10x系列标准外设库:STM32F10x_StdPeriph_Lib_V3.6.0下载:/en/embedded-software/stsw-stm32054.html#get-softwarestm32f10x.h:寄存器定义和基本类型声明。system_stm32f10x.h/c:系统初始化和时钟配置。stm32f10x_conf.h:外设库的配置,选择需要的外设。stm32f10x_it.h/c:中断服务函数的实现。core_cm3.h/c:Cortex-M3内核相关函数和定义。Libraries文件夹(2)STM32F10x_StdPeriph_Driver文件夹STM32F10x_StdPeriph_Driver文件夹用于存放STM32F10x系列微控制器的外设驱动文件。这些文件为STM32的各种外设(如GPIO、ADC、TIM等)提供了底层的驱动程序,使得开发者可以方便地通过高级API函数来操作这些外设,而无需深入了解硬件细节。1)Inc文件夹:存放片上外设的头文件(如stm32f10x_gpio.h),这些头文件包含了外设寄存器的定义、外设功能的描述以及API函数的声明等。2)Src文件夹:存放片上外设的源文件(如stm32f10x_gpio.c),这些源文件实现了对外设寄存器的直接操作,并为开发者提供了丰富的API函数,用于实现各种外设功能。第6章基于STM32F103微控制器的嵌入式系统开发基础---STM32F1标准外设库2025/11/282.Project文件夹:(1)STM32F10x_StdPeriph_Template文件夹

存放官方的标准外设库工程模板。这个模板为开发者提供了一个标准的工程结构,包含了创建新项目时所需的基本文件和配置。通过使用这个模板,开发者可以快速启动一个新的STM32项目,而无需从头开始搭建工程结构。这大大提高了开发效率,并减少了因配置错误而导致的开发障碍。注意:用户在构建自己的工程时,需要将“STM32F10x_StdPeriph_Template”中的stm32f10x_conf.h、stm32f10x_it.h和stm32f10x_it.c等文件拷贝到自己的工程中去(通常与用户开发的程序一起放在文件夹user中),并根据需要进行修改。第6章基于STM32F103微控制器的嵌入式系统开发基础---STM32F1标准外设库2025/11/282.Project文件夹:(2)STM32F10x_StdPeriph_Examples文件夹STM32F10x_StdPeriph_Examples文件夹下存放的是ST公司提供的外设驱动例程。这些例程展示了如何使用STM32F10x系列微控制器的各种外设,如GPIO、ADC、TIM等。第6章基于STM32F103微控制器的嵌入式系统开发基础---STM32F1标准外设库2025/11/283.Utilities文件夹:评估板相关代码

存放与STM32评估板相关的专用驱动程序和工具代码,这些代码通常用于初始化评估板上的硬件资源或实现特定的硬件功能,但对于非评估板开发不是必需的。第6章基于STM32F103微控制器的嵌入式系统开发基础---STM32F1标准外设库2025/11/28在构建基于标准外设库的工程时,需要将STM32F10x_StdPeriph_Lib_V3.x.x中Libraries文件夹和STM32F10x_StdPeriph_Template文件夹中的相关文件拷贝到自己构建的工程的相关文件夹下,然后在MDK集成开发环境中,再将这些文件关联到工程中去。因此,了解STM32F10x标准库中的相关文件至关重要。第6章基于STM32F103微控制器的嵌入式系统开发基础---基于设库中构建工程的思路2025/11/28外设库存放工程的文件夹开发工程的MDK5环境在构建基于标准外设库的工程时,需要将STM32F10x_StdPeriph_Lib_V3.x.x中Libraries文件夹和STM32F10x_StdPeriph_Template文件夹中的相关文件拷贝到自己构建的工程的相关文件夹下,然后在MDK集成开发环境中,再将这些文件关联到工程中去。因此,了解STM32F10x标准库中的相关文件至关重要。表6.1给出了工程构建时涉及到的文件及其层次关系,表中从下往上依次从底层(硬件层)到上层(用户应用程序层)。第6章基于STM32F103微控制器的嵌入式系统开发基础---STM32F10x标准外设库中的文件关系2025/11/281.内核操作文件core_cm3.h/core_cm3.ccore_cm3.h和core_cm3.c共同构成了Cortex-M3内核的软件接口层,用于实现对Cortex-M3内核的访问和配置。

CMSIS(CortexMicrocontrollerSoftwareInterfaceStandard)提供的Cortex-M3内核支持文件,包含:内核寄存器定义(如NVIC、SysTick);内联函数(如__enable_irq()、__WFI());系统级操作(如原子访问、位带操作);SysTick定时器配置函数。工程中的作用:提供与内核交互的统一接口,确保代码可移植性。管理中断控制器(NVIC)和系统定时器(SysTick)。

注意:此文件由ARM提供,通常无需修改第6章基于STM32F103微控制器的嵌入式系统开发基础---STM32F10x标准外设库中的文件关系2025/11/282.标准外设库核心头文件stm32f10x.hstm32f10x.h是STM32F10x系列微控制器标准外设库的核心头文件。在进行STM32开发时,需要经常查看这个文件中的相关定义。这个文件打开可以看到,里面非常多的结构体以及宏定义。主要包含了以下几个方面的内容:(1)微控制器的寄存器地址映射(如GPIO、USART、TIM等外设的基地址)(2)外设基地址映射(宏定义相关外设地址)(3)片上外设结构体类型定义,如GPIO_TypeDef、USART_TypeDef(4)外设的位定义,如寄存器标志位、控制位(5)中断向量表定义。工程中的作用:

提供对硬件寄存器的直接访问,使开发者无需手动计算地址。例如,通过GPIOA->ODR操作GPIOA的输出寄存器。必须包含,否则无法操作外设。第6章基于STM32F103微控制器的嵌入式系统开发基础---STM32F10x标准外设库中的文件关系2025/11/28有了这个文件,前面介绍的后2种寄存器开发方式就可以顺利进行了!2.标准外设库核心头文件stm32f10x.h(1)数据类型定义为了满足跨平台兼容性、可移植性以及标准库支持的需要,在stm32f10x.h文件中定义了一系列特有的数据类型,如:typedefint32_ts32;typedefint16_ts16;typedefint8_ts8;typedefconstint32_tsc32;/*!<ReadOnly*/typedefconstint16_tsc16;/*!<ReadOnly*/typedefconstint8_tsc8;/*!<ReadOnly*/typedef__IOint32_tvs32;typedef__IOint16_tvs16;typedef__IOint8_tvs8;

第6章基于STM32F103微控制器的嵌入式系统开发基础---STM32F10x标准外设库中的文件关系2025/11/282.标准外设库核心头文件stm32f10x.h(2)片上外设结构体类型定义为了方便开发者访问和操作STM32的片上外设的相关寄存器,stm32f10x.h中定义了各种外设的结构体类型。这些结构体将外设的寄存器封装成一个整体,使得开发者可以通过结构体指针来访问和修改外设的寄存器值。如对于GPIO片上外设,stm32f10x.h头文件中定义了如下所示的一个名为GPIO_TypeDef的结构体类型,其内部成员是GPIO的7个寄存器。typedefstruct{__IOuint32_tCRL;//GPIO端口配置低寄存器__IOuint32_tCRH;//GPIO端口配置高寄存器__IOuint32_tIDR;//GPIO端口输入数据寄存器__IOuint32_tODR;//GPIO端口输出数据寄存器__IOuint32_tBSRR;//端口位设置/清除寄存器__IOuint32_tBRR;//端口位清除寄存器__IOuint32_tLCKR;//端口配置锁定寄存器}GPIO_TypeDef;由于片上外设的功能是通过其内部的寄存器来实现的,因此,将这些寄存器视为一个整体,通过C语言的结构体类型变量定义的方式,就可以对结构体中的成员进行操作了。

第6章基于STM32F103微控制器的嵌入式系统开发基础---STM32F10x标准外设库中的文件关系2025/11/282.标准外设库核心头文件stm32f10x.h(3)外设变量的声明所谓的“外设的声明”,其实质主要是一些宏定义,宏名就代表了某种外设,如下所示的GPIOA等:#defineGPIOA((GPIO_TypeDef*)GPIOA_BASE)#defineGPIOB((GPIO_TypeDef*)GPIOB_BASE)#defineADC1((ADC_TypeDef*)ADC1_BASE)#defineTIM1((TIM_TypeDef*)TIM1_BASE)……以GPIOA为例,“#defineGPIOA((GPIO_TypeDef*)GPIOA_BASE)”中GPIOA_BASE是一个宏,它定义了GPIOA端口的基地址(STM32参考手册中可以找到;stm32f10x.h头文件中通过宏也对其进行了定义)。GPIO_TypeDef是一个结构体类型,当GPIOA宏被使用时,它实际上是将GPIOA_BASE这个地址转换为一个GPIO_TypeDef类型的指针。这样,就可以通过该指针来访问GPIOA端口的所有寄存器了。例如,要将GPIOA的输出数据寄存器的第0位置1:GPIOA->ODR|=(1<<0);GPIOA引脚0输出高电平。若该引脚上连接了一个LED灯,该灯就会被点亮或熄灭(取决于LED灯的驱动方式)。

第6章基于STM32F103微控制器的嵌入式系统开发基础---STM32F10x标准外设库中的文件关系2025/11/282.标准外设库核心头文件stm32f10x.h(4)外设基地址映射STM32F10x系列微控制器芯片的片上外设被挂载在不同速率的外设总线APB1、APB2和AHB上,stm32f10x.h头文件中通过一系列的宏定义实现了片上外设基地址的定义。理解这些外设基地址是如何获得的,对于理解如何通过外设结构体指针实现对外设寄存器的操作是很有帮助的。下面是stm32f10x.h中与外设基地址相关的一些宏定义。#definePERIPH_BASE((uint32_t)0x40000000)……#defineAPB1PERIPH_BASEPERIPH_BASE#defineAPB2PERIPH_BASE(PERIPH_BASE+0x10000)#defineAHBPERIPH_BASE(PERIPH_BASE+0x20000)#defineTIM2_BASE(APB1PERIPH_BASE+0x0000)#defineTIM3_BASE(APB1PERIPH_BASE+0x0400)……#defineGPIOA_BASE(APB2PERIPH_BASE+0x0800)#defineGPIOB_BASE(APB2PERIPH_BASE+0x0C00)……GPIOA的基地址是如何基于这些宏定义得到的呢?GPIOA挂载在APB2总线上,它是APB2总线上的第三个外设(前两个外设分别为AFIO和EXTI,见图5.7),每个外设被安排占用了1024个单元,因此,挂在APB2总线上的GPIOA的偏移地址为0x0800,APB2PERIPH_BASE又是基于PERIPH_BASE+0x10000得到的,PERIPH_BASE为0x40000000(STM32F10x不同总线片上外设地址空间分配见图5.5),因此,GPIOA_BASE就应该为0x40000000+0x10000+0x0800=0x40010800。综上所述,stm32f10x.h通过定义特定的数据类型、片上外设结构体类型、寄存器地址和位定义以及枚举等,为STM32F10x系列微控制器的开发提供了必要的基础设施和接口,使得开发者能够更加高效、方便地进行硬件编程和控制系统设计。因此,在用户使用STM32库编写外设驱动时,必须将其包含在自己的工程文件中。

第6章基于STM32F103微控制器的嵌入式系统开发基础---STM32F10x标准外设库中的文件关系2025/11/283.系统时钟配置文件system_stm32f10x.h/system_stm32f10x.c系统上电复位时,进行系统初始化和时钟配置。注意其时钟配置功能与rcc.h/.c之间的关系:启动流程:1、SystemInit():设置默认时钟(如HSI)。2、用户通过rcc.c中的函数切换到HSE+PLL以提升性能动态调整时钟:

RCC在运行时切换时钟源(如从高速模式切换到低功耗模式)。外设控制:

所有外设操作前必须通过RCC使能其时钟(否则寄存器访问无效)。system_stm32f10x.h/.c:启动时配置时钟;Rcc.h/.c:运行时使能时钟或动态调整时钟配置第6章基于STM32F103微控制器的嵌入式系统开发基础---STM32F10x标准外设库中的文件关系2025/11/284.系统启动文件startup_stm32f10x_xx.s启动文件startup_stm32f10x_xx.s是意法半导体公司为STM32F10x系列微控制器提供的。用户在构建工程时,必须导入一个与工程使用的微控制器容量对应的启动文件。对于STM32F103系列微控制器来讲,主要是用其中3个启动文件:startup_stm32f10x_ld.s:适用于小容量产品(FLASH≤32K)startup_stm32f10x_md.s:适用于中等容量产品(64K≤FLASH≤128K)startup_stm32f10x_hd.s:适用于大容量产品(256K≤FLASH)第6章基于STM32F103微控制器的嵌入式系统开发基础---STM32F10x标准外设库中的文件关系2025/11/284.系统启动文件startup_stm32f10x_xx.s系统启动文件主要作用是在STM32F10x系列微控制器上电或复位后,引导程序进入主函数(main函数)之前,执行一系列初始化操作。启动文件完成的初始化工作有:(1)初始化堆栈和程序计数器:初始化堆栈指针(MSP)和程序计数器指针(PC),为程序的执行准备必要的环境;设置堆栈大小,并分配相应的内存空间。(2)设置异常向量表:设置中断向量表,包括复位处理函数(Reset_Handler)、非屏蔽中断处理函数(NMI_Handler)以及各类异常处理函数(如硬错误、内存管理错误、总线错误等)的入口地址。(3)系统初始化:调用前面提到的系统初始化函数SystemInit(),进行系统时钟和其他硬件的初始化。(4)引导进入用户程序:完成上述初始化工作后,启动文件会将控制权转移给C/C++运行库中的__main函数(这是C库的分支入口,用于进行C/C++运行环境的初始化)。最终,__main函数会调用用户编写的main函数,从而开始程序的主体执行。第6章基于STM32F103微控制器的嵌入式系统开发基础---STM32F10x标准外设库中的文件关系2025/11/285.外设操作相关文件stm32f10x_xxx.h/stm32f10x_xxx.c与stm32f10x_conf.h启动文件(1)外设文件stm32f10x_xxx.h/stm32f10x_xxx.c文件名中的“xxx”对应某种外设,如GPIO,相应的外设文件就是stm32f10x_gpio.h和stm32f10x_gpio.c。因此,STM32F10x系列芯片上有多少种外设,就相应有多少个这样的外设文件。这类文件中定义和实现了针对相应外设功能的各种操作,如初始化、读/写数据寄存器、中断控制等。(2)外设配置文件stm32f10x_conf.h文件是STM32F10x标准库中的一个重要配置文件,它通过宏定义和包含外设头文件的方式,实现了对STM32F10x系列微控制器片上外设资源的配置和初始化设置。stm32f10x_conf.h位于标准库的STM32F10x_StdPeriph_Template文件夹下,用户在构建工程时应该把文件拷贝到自己的应用程序文件夹(通常习惯取名为user)中,并根据外设的使用情况导入相应外设的头文件。第6章基于STM32F103微控制器的嵌入式系统开发基础---STM32F10x标准外设库中的文件关系2025/11/286.中断/异常相关的文件misc.h/misc.c与stm32f10x_it.h/stm32f10x_it.c(1)中断设置文件:misc.h/misc.c--主要用于配置

Cortex-M3内核相关外设,而非具体的片内外设(如GPIO、USART等)。misc.h和misc.c是针对CortexM3核内的NVIC和Systick(嘀嗒定时器)而设计的,因此,在基于中断的系统应用中,这两个文件是必不可少的。(2)中断服务程序文件:stm32f10x_it.h/stm32f10x_it.h---非标准外设库文件,位于模版中stm32f10x_it.h和stm32f10x_it.c是STM32F10x系列微控制器的中断服务程序文件。它们的主要作用是定义和实现中断服务函数(ISR)。stm32f10x_it.h文件通常包含中断服务函数的声明(即函数原型),而stm32f10x_it.c文件则包含这些函数的实现代码。与外设配置文件stm32f10x_conf.h一样,stm32f10x_it.h/stm32f10x_it.c也位于标准库的STM32F10x_StdPeriph_Template文件夹下,用户在构建工程时应该把文件拷贝到自己的应用程序文件夹(通常习惯取名为user)中,并根据中断的使用情况对文件进行相应的完善。第6章基于STM32F103微控制器的嵌入式系统开发基础---STM32F10x标准外设库中的文件关系2025/11/286.stm32f10x_conf.h---非标准外设库文件,位于模版中功能:配置外设库的编译选项,通过宏定义启用或禁用特定外设的代码包含。例如:#defineUSE_SPI//启用SPI驱动#defineUSE_ADC//启用ADC驱动工程中的作用:减少编译时间及代码体积,仅包含实际使用的外设驱动。注意:需根据工程需求手动启用/禁用外设宏。

第6章基于STM32F103微控制器的嵌入式系统开发基础---STM32F10x标准外设库中的文件关系2025/11/28目录第6章基于STM32F103微控制器的嵌入式系统开发基础---目录第6章基于STM32F103微控制器的嵌入式系统开发基础(2)6.2ARMCortex微控制器软件接口标准CMSIS 6.2.1CMSIS软件接口标准 6.2.2STM32F1xx微控制器的软件包CMSIS下载与安装 6.3STM32F1标准外设库

6.4基于标准外设库的工程构建 6.5Proteus嵌入式系统仿真与调试

基于标准外设库的工程开发过程由两步组成。1、首先创建一个工程文件夹,用来存放工程用到的相关库文件、工程文件以及用户文件等。2、然后在KeilMDK集成开发环境中创建工程,将工程文件夹中的相关文件关联到工程的相关组中,进行相关环境参数的设置,用户程序的编写与调试等工作。这里我们仍使用本章开头给出的“LED灯闪烁”例子,详细介绍基于标准外设库的工程构建过程。

第6章基于STM32F103微控制器的嵌入式系统开发基础---基于标准外设库的工程构建2025/11/28第6章基于STM32F103微控制器的嵌入式系统开发基础---基于标准外设库的工程构建过程2025/11/28标准外设库构建存放工程的文件夹将工程中的相关文件(库文件与用户文件)关联到的MDK5环境中6.4.1创建存放工程的工程文件夹

在一个硬盘分区上建立工程文件夹,以本章“LED灯闪烁”为例,工程文件夹取名LED,并且在该目录下再创建3个空文件夹,如图6.10所示。注意:不同的开发者会根据自己的习惯或喜好,在工程文件夹下构建不同命名的子文件夹来存放工程的相关文件,完全遵从个人习惯以及开发过程中便于相关文件的查找,没有统一的标准。我们根据工程中文件的来源构建了三个子文件夹:Lib文件夹存放ARM公司和意法半导体公司提供的相关库文件;Project文件夹存放MDK集成开发环境生成的工程文件;User文件夹用来存放用户自己编写的文件。根目录下的text.txt文本文件是对工程功能的简单描述。第6章基于STM32F103微控制器的嵌入式系统开发基础---基于标准外设库的工程构建过程2025/11/28图6.10工程文件管理目录6.4.1创建存放工程的工程文件夹

(1)Lib文件夹在Lib文件夹下创建如下4个子文件夹:

1、\Lib\CMSIS:将标准库中CMSIS目录下的相关文件拷贝到该文件夹下:core_cm3.h,core_cm3.c,stm32f10x.h,system_stm32f10x.h和system_stm32f10x.c2、\Lib\inc:将标准库中STM32F10x_StdPeriph_Driver\inc文件夹下相关外设的头文件拷贝到该文件夹下。如本工程只涉及RCC和GPIO两个外设,只需将stm32f10x_rcc.h和stm32f10x_gpio.h两个文件拷贝过来即可。

3、\Lib\src:将标准库中STM32F10x_StdPeriph_Driver\src文件夹下相关外设的文件拷贝到该文件夹下。与头文件一样,只需将stm32f10x_rcc.c和stm32f10x_gpio.c拷贝过来。

4、\Lib\startup:根据工程所用微控制器芯片Flash容量大小,从STM32F10x标准库的\CM3\DeviceSupport\ST\STM32F10x\startup\arm文件夹中选择一个合适的启动文件,拷贝到该文件夹下。如本工程使用STM32F103R6微控制器,Flash容量为32K,属于小容量产品,应该选择startup_stm32f10x_ld.s头文件。第6章基于STM32F103微控制器的嵌入式系统开发基础---基于标准外设库的工程构建过程2025/11/28图6.10工程文件管理目录6.4.1创建存放工程的工程文件夹

(2)Project文件夹存放MDK生成的工程文件(.uvprojx文件)。MDK也会在该文件夹下自动生成两个子文件夹Objects和Listings来存放输出文件和过程列表文件。第6章基于STM32F103微控制器的嵌入式系统开发基础---基于标准外设库的工程构建过程2025/11/28图6.10工程文件管理目录(3)User文件夹该文件夹主要存放用户自定义的代码文件,包括主函数文件、中断服务函数文件以及用户根据需要添加的其他文件。1)用户程序代码main.c:工程的主函数文件,用户需要在这里编写程序的主循环、初始化代码以及业务逻辑等。它是用户程序的核心部分。2)中断服务函数stm32f10x_it.c:用于定义和实现中断服务函数。该文件(包括其对应的头文件)位于标准库中的模板文件夹“STM32F10x_StdPeriph_Template”中,用户需要将其拷贝到User文件夹中,用户要根据需要添加或修改该文件中的中断服务函数。3)其他用户自定义文件:除了上述文件外,User目录还可能包含用户根据需要添加的其他.c和.h文件。这些文件可以包含用户自定义的函数、变量、类型定义等,用于实现特定的功能或模块。6.4.2在KeilMDK中创建工程在创建了存放工程的文件夹并将相关的文件从标准库中拷贝到相应的文件夹后,就可以开始在MDK中创建工程了。1.创建工程打开MDK开发工具,点击KeilMDK的菜单:Project–>NewUvisionProject,如图6.11所示,在弹出的对话框中,将工程的存放位置定位到上一节已经建好的工程文件夹:LED\Project,输入工程文件名“LED”,然后单击保存。第6章基于STM32F103微控制器的嵌入式系统开发基础---基于标准外设库的工程构建过程2025/11/28图6.11创建工程对话框在弹出的如图6.12所示的对话框中选择所使用的微控制器芯片,这里我们选择STM32F103R6,单击“OK”。弹出如图6.13所示的ManageRun-TimeEnvironment对话框,为工程添加需要的组件。本工程不需要添加任何组件,直接点击Cancel。图6.12选择微控制器型号6.4.2在KeilMDK中创建工程

2.将相关文件关联到工程中到目前为止,MDK中生成了图6.14所示的包含了LED工程初步信息的工程框架。Target通常指的是项目中的一个具体目标设备或配置。由于一个项目可能包含多个Target,因此Target的命名需要能够清晰地区分它们。由于本项目就一个目标设备,因此可以使用默认的名称Target1。项目管理区中的“SourceGroup1”为默认的第一个源文件分组名称,在KeilMDK5的项目结构中,开发者可以创建多个SourceGroup来分类和组织他们的源代码文件,以便于管理和维护。下面我们结合本章“LED灯闪烁”工程,说明如何创建源文件组,并将上一节在硬盘上创建的工程文件夹中的文件关联到工程的相关源文件组中。第6章基于STM32F103微控制器的嵌入式系统开发基础---基于标准外设库的工程构建过程2025/11/28图6.14“LED灯闪烁”工程的初始工程框架6.4.2在KeilMDK中创建工程1)源文件组的创建默认源文件组名“SourceGroup1”修改:在工程管理区间断双击(双击之间间隔1s左右)需要修改的文本“SourceGroup1”,待其处于可编辑状态后,修改其内容为工程实际的源文件组名。比如,这里我们将默认的SourceGroup1修改为Startup。新建源文件组:点击Project->Manage->Components,Environment,Books…,或点击工具栏图标,弹出图6.15所示的“管理项目项”对话框。

在弹出的对话框中,单击New(Insert),在出现的虚线框(位于startup下)中,键入新的源文件组名,这里我们输入CMSIS。依次重复操作,分别构建源文件组StdPeriph_Driver,User,Text。至此,得到图6.16所示的工程框架(目前源文件组还是空的,工程的相关文件还没有从硬盘上的工程文件夹关联到相应的源文件组中)。这里构建的源文件组拟关联的工程文件如下:Startup:关联工程启动文件CMSIS:关联内核相关文件StdPeriph_Driver:关联相关片上外设文件User:关联用户编写的代码图6.15“管理项目项”对话框图6.14“LED灯闪烁”工程的初始工程框架Text:关联一个项目说明的文本文件第6章基于STM32F103微控制器的嵌入式系统开发基础---基于标准外设库的工程构建过程2025/11/28图6.15“管理项目项”对话框图6.16创建完空的源文件组的工程框架注意:MDK5工程中“源文件组”的组织与命名没有统一的标准,用户可以根据自己的喜好来创建,唯一的目的就是方便用户在项目开发过程中对相关文件的查找与管理。6.4.2在KeilMDK中创建工程2)文件关联到源文件组双击相关的源文件组名(比如Startup),在图6.17所示弹出的“AddFilestoGroup‘Startup’”对话框中,从工程文件夹Lib\startup\arm中选择适用于本项目微控制器STM32F103R6的启动文件startup_stm32f10x_ld.s,单击“Add”按钮,即可将startup_stm32f10x_ld.s文件关联到Startup源文件组中。第6章基于STM32F103微控制器的嵌入式系统开发基础---基于标准外设库的工程构建过程2025/11/28图6.17关联文件到源文件组对话框6.4.2在KeilMDK中创建工程依次重复操作,将相关文件关联到相应的源文件组中,最后得到图6.18所示的相关文件关联到工程中后的工程架构。若这时候直接对工程进行编译,显然会出现很多错误或警告,原因是目前还没有对编译与链接环境进行设置。第6章基于STM32F103微控制器的嵌入式系统开发基础---基于标准外设库的工程构建过程2025/11/28图6.18关联相关文件后的工程框架6.4.2在KeilMDK中创建工程3.编译与链接环境配置在把相关文件关联到工程中后,还需要对开发环境进行配置。点击Project–>OptionsforTarget‘Target1…’,或单击工具栏图标,弹出图6.19所示的目标选项配置对话框。OptionsforTarget'Target1...'对话框是MDK5中非常重要的配置界面,它允许开发者根据项目需求对编译、链接、调试等各个环节进行详细的配置。通过合理配置这些选项,可以优化程序性能、提高开发效率,并确保程序的稳定性和可靠性。由于该对话框包含的设置内容较多,为了方便起见,表6.1列出了对话框中各标签页的主要功能。第6章基于STM32F103微控制器的嵌入式系统开发基础---基于标准外设库的工程构建过程2025/11/28图6.19OptionsforTarget‘Target1’对话框6.4.2在KeilMDK中创建工程3.编译与链接环境配置由于该对话框包含的设置内容较多,为了方便起见,表6.1列出了对话框中各标签页的主要功能。第6章基于STM32F103微控制器的嵌入式系统开发基础---基于标准外设库的工程构建过程2025/11/286.4.2在KeilMDK中创建工程3.编译与链接环境配置1)Output标签页点击Output标签,弹出图6.20所示的标签页。目标文件的存放位置设置:默认情况下,目标文件存放在工程文件夹下由MDK自动生成的Objects文件夹中。若需要修改,点击“SelectFolderforobjects…”按钮,将目标文件的存放位置进行重新设置(用户需要事先创建一个用来存放目标文件的文件夹)。选择是否生成Hex文件:MDK5生成的两种主要可执行文件是hex文件和axf文件。其中axf文件是默认生成的可执行文件,而hex文件则需要在编译设置中指定生成。这两种文件各有用途,axf文件主要用于调试,而hex文件则用于编程或烧录到目标设备中。第6章基于STM32F103微控制器的嵌入式系统开发基础---基于标准外设库的工程构建过程2025/11/286.4.2在KeilMDK中创建工程3.编译与链接环境配置2)Listing标签页点击Listing标签,弹出图6.21所示的标签页。默认情况下,列表文件存放在工程文件夹下由MDK自动生成的Listings文件夹中。若需要修改,点击“SelectFolderforobjects…”按钮,将列表文件的存放位置进行重新设置(用户需要事先创建一个用来存放列表文件的文件夹)。第6章基于STM32F103微控制器的嵌入式系统开发基础---基于标准外设库的工程构建过程2025/11/286.4.2在KeilMDK中创建工程3.编译与链接环境配置3)C/C++标签页点击C/C++标签,弹出图6.22所示的标签页。C/C++标签页中需要设置的选项较多,是实现工程能被正确编译的关键,主要包括:添加条件宏:在Define标签后的编辑框输入宏常量:USE_STDPERIPH_DRIVER和STM32F10X_LD(中间用逗号分开)。

USE_STDPERIPH_DRIVER:表明本工程开发过程中需要使用STM32库函数。

STM32F10X_LD:表明工程采用的芯片系列为STM32F10X低容量(Low-Density)芯片。STM32F10x系列芯片根据内存容量和特性分为中容量(Medium-Density)、小容量(Low-Density)和大容量(High-Density)等。第6章基于STM32F103微控制器的嵌入式系统开发基础---基于标准外设库的工程构建过程2025/11/286.4.2在KeilMDK中创建工程3.编译与链接环境配置3)C/C++标签页点击C/C++标签,弹出图6.22所示的标签页。C/C++标签页中需要设置的选项较多,是实现工程能被正确编译的关键,主要包括:添加头文件:单击“IncludePaths”标签所在编辑框后的“.…”按钮,弹出图6.23所示的头文件设置对话框,单击右边的添加按钮New(Insert),找到工程所用到的头件(这些文件实际存放于上一节所建立的User和Lib文件夹下面),确认后该头文件就自动添加到头文件列表中。添加了所有头文件后的对话框如图6.24所示。第6章基于STM32F103微控制器的嵌入式系统开发基础---基于标准外设库的工程构建过程2025/11/28图6.24添加了所有头文件的对话框6.4.2在KeilMDK中创建工程3.编译与链接环境配置3)C/C++标签页点击C/C++标签,弹出图6.22所示的标签页。C/C++标签页中需要设置的选项较多,是实现工程能被正确编译的关键,主要包括:C语言标准选择:通过勾选C/C++标签页中的C99Mode选项,开发者可以启用C99标准编译其C语言代码。在C语言发展过程中,先后推出有C89/C90标准(1989年)、C99标准(1999年)和C11标准(2011年)等。至此,我们就可以对图6.18所示的关联了相关文件后的工程进行编译了,生成可执行的axf文件和hex文件。

为了显示工程中的各个源文件包含的头文件,在图6.25的Target1上点击右键,在弹出的对话框中选择“ShowIncludeFileDependencies”,这样,在工程管理区就会看到各源文件包含的头文件情况。第6章基于STM32F103微控制器的嵌入式系统开发基础---基于标准外设库的工程构建过程2025/11/28图6.25工程管理区显示源文件关联的图文件目

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论