嵌入式技术与应用开发项目教程(STM32版)习题答案项目一LED控制设计与实现1-1嵌入式系统是如何定义的?嵌入式系统(Embeddedsystem),是一种“完全嵌入受控器件内部,为特定应用而设计的专用计算机系统”,根据IEEE(国际电气和电子工程师协会)的定义:嵌入式系统是控制、监视或辅助设备、机器或用于工厂运作的设备。目前,国内普遍认同的嵌入式系统定义是:以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。1-2嵌入式系统具有哪些特点?嵌入式系统具有以下几个显著特点:(1)嵌入式系统是面向特定应用;(2)软件要求固态化存储;(3)嵌入式系统的硬件和软件都必须具备高度可定制性;(4)嵌入式系统的生命周期较长;(5)嵌入式系统开发需要开发工具和环境。1-3ARMCortex-M3处理器是哪几个部分组成?嵌入式系统一般是由嵌入式处理器、存储器、输入输出和软件(嵌入式设备的应用软件和操作系统是紧密结合的)等4部分组成。1-4简述STM32F103系列产品的命名规则。STM32F103系列产品的命名规则,是按照“STM32F103XXYY”格式来命名的,具体含义如下:(1)产品系列:STM32是基于ARMCortex-M3内核设计的32位微控制器;(2)产品类型:F是通用类型;(3)产品子系列:101是基本型、102是USB基本型(USB全速设备)、103是增强型、105或107是互联型;(4)引脚数目(第一个X):T是36脚、C是48脚、R是64脚、V是100脚、Z是144脚;(5)闪存存储器容量(第二个X):4是16K、6是32K、8是64K、B是128K、C是256K、D是384K、E是512K;(6)封装(第一个Y):H是BGA、T是LQFP、U是VFQFPN、Y是WLCSP64;(7)温度范围(第二个Y):6是工业级温度范围-400C~850C、7是工业级温度范围-400C~1050C。1-5简述STM32固件库开发与寄存器开发的关系。ST公司推出的官STM32固件库,固件库将这些寄存器的底层操作,都封装起来,提供一整套接口(API)供开发者调用。在大多数场合下,你不需要去知道操作的是哪个寄存器,你只需要知道调用哪些函数即可。1-6论述STM32固件库与CMSIS标准之间关系。(1)STM32固件库就是函数的集合,固件库函数的作用是向下负责与寄存器直接打交道,向上提供用户函数调用的接口(API)。(2)ARM公司和芯片生产商共同提出了一套标准CMSIS标准(CortexMicrocontrollerSoftwareInterfaceStandard),既“ARMCortex™微控制器软件接口标准”。CMSIS分为核内外设访问层、中间件访问层和外设访问层3个基本功能层。ARM是一个做芯片标准的公司,它负责的是芯片内核的架构设计,而TI、ST这样的公司,并不是做标准的,只是一个芯片公司,他们是根据ARM公司提供的芯片内核标准设计自己的芯片。任何一个做Cortex-M3芯片,他们的内核结构都是一样的,只是在存储器容量、片上外设、端口数量、串口数量以及其他模块上有所区别,这些资源他们可以根据自己的需求理念来设计。同一家公司设计的多种Cortex-m3内核芯片的片上外设也会有很大的区别,比如STM32F103RBT和STM32F103ZET在片上外设上就有很大的区别。ST官方库(STM32固件库)就是根据这套CMSIS标准设计的。(3)CMSIS向下负责与内核和各个外设直接打交道,向上提供实时操作系统用户程序调用的函数接口。如果没有CMSIS标准,那么各个芯片公司就会设计自己喜欢的风格的库函数,而CMSIS标准就是要强制规定,芯片生产公司设计的库函数必须按照CMSIS这套规范来设计。(4)CMSIS还对各个外设驱动文件的文件名字规范化、函数的名字规范化等一系列规定。比如,GPIO_ResetBits函数,这个函数名字也是不能随便定义的,是要遵循CMSIS规范的。又如,在我们使用STM32芯片时,首先要进行系统初始化,CMSIS就规定系统初始化函数名必须为SystemInit,所以各个芯片公司写自己的库函数时,就必须用SystemInit对系统进行初始化。1-7STM32固件关键子目录有哪些?其功能是什么?STM32固件库关键子目录主要有Libraries和Project子目录。(1)Libraries里面有CMSIS子目录和STM32F10x_StdPeriph_Driver子目录,这2个子目录包含固件库核心的所有子文件夹和文件,主要包含大量的头文件、源文件和系统文件,是开发必须使用的。(2)Project里面有STM32F10x_StdPeriph_Examples和STM32F10x_StdPeriph_Template子目录。STM32F10x_StdPeriph_Examples子目录存放的是ST官方提供的固件实例源码,包含了几乎所有STM32F10x外设的使用详细源代码。在以后的开发过程中,可以参考修改这个官方提供的实例,来快速驱动自己的外设。很多开发板的实例,也都参考了官方提供的例程源码,这些源码对以后的学习非常重要。STM32F10x_StdPeriph_Template子目录存放的是工程模板。1-8STM32固件关键文件有哪些?STM32固件的关键文件主要存放在Libraries子目录下。(1)core_cm3.c和core_cm3.h文件是位于\Libraries\CMSIS\CM3\CoreSupport子目录下面的,分别是内核访问层的源文件和头文件,提供进入M3内核接口。是由ARM公司提供的CMSIS核心文件,对所有CM3内核的芯片都一样,永远都不需要修改这个文件。(2)STM32F10x子目录的3个文件在STM32F10x子目录下面有3个文件:system_stm32f10x.c、system_stm32f10x.h以及stm32f10x.h文件,是外设访问层的源文件和头文件。(3)启动文件在STM32F10x子目录下面还有一个startup子目录,这个子目录里面放的是启动文件。启动文件主要是进行堆栈之类的初始化、中断向量表以及中断函数定义,还要引导进入main函数。(4)STM32F10x_StdPeriph_Template子目录的3个文件在Project\STM32F10x_StdPeriph_Template子目录下有3个关键文件:stm32f10x_it.c、stm32f10x_it.h和stm32f10x_conf.h。stm32f10x_it.c和stm32f10x_it.h是外设中断函数文件,是用来编写中断服务函数,用户可以相应的加入自己的中断程序代码。stm32f10x_conf.h是固件库配置文件,有很多#include。在建立工程时,可以注释掉一些不用的外设头文件,来选择固件库所使用的外设。1-9简述新建基于STM32固件库的KeilμVision4工程模板步骤。新建基于STM32固件库的KeilμVision4工程模板步骤如下:(1)新建工程模板目录新建一个“STM32_Project工程模板”目录,在“STM32_Project工程模板”目录下,新建4个USER、CORE、OBJ以及STM32F10x_FWLib子目录;把官方固件库“Libraries\STM32F10x_StdPeriph_Driver”下面的src和inc子目录复制到子目录STM32F10x_FWLib下面;把固件库“Libraries\CMSIS\CM3\CoreSupport”下面的core_cm3.c和core_cm3.h文件复制到子目录CORE下面;把“Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm”下面的startup_stm32f10x_ld.s文件复制到CORE文件夹下面;先把官方固件库“Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x”下面的3个文件stm32f10x.h,system_stm32f10x.c,system_stm32f10x.h,复制到我们的子目录USER下面,然后把官方固件库“Project\STM32F10x_StdPeriph_Template”下面的3个文件stm32f10x_conf.h,stm32f10x_it.c,stm32f10x_it.h复制到子目录USER下面。(2)新建KeilμVision4工程模板新建“STM32_Project”工程,并保存在USER文件夹下面;通过选择芯片“SelectDeviceTarget‘Target1’”对话框,选择相应的型号。本项目使用的是STM32F103R6芯片,选择STMicroelectronics下面的STM32F103R6;在“CopySTM32StartupCodetoproject.”对话框中,选择“否”。(3)新建组和添加文件到STM32_Project工程模板在USER子目录里面,新建一个主文件main.c,其中main()函数是一个空函数,方便以后在这里面添加需要的代码;在STM32_Project工程下,新建USER、CORE、OBJ和STM32F10x_FWLib四个组;往USER、CORE、OBJ和STM32F10x_FWLib这四个组中,添加我们需要的文件到相应的组中。(4)工程配置与编译在C/C++选项配置界中,通过“IncludePaths”设置编译器的头文件包含路径,添加所要编译文件的路径(STM32F10x_FWLib\inc、CORE和USER三个子目录都要添加进去);在C/C++选项配置界中,填写“STM32F10X_LD,USE_STDPERIPH_DRIVER”到Define输入框里(若使用中容量芯片就把STM32F10X_LD修改为STM32F10X_MD、使用大容量芯片就修改为STM32F10X_HD);在Output选项中,选中“GreateHEXFile”选项,并通过“SelectFolderforObjects…”按钮,在弹出的对话框中选中“OBJ”子目录;工程配置好后,对工程进行编译。1-10请使用基于STM32固件库的工程模板,来完成控制2个LED交替闪烁的电路和程序设计、运行与调试。(1)电路设计参考任务2的电路设计,增加1个LED,接在STM32F103VCT6的PB9引脚上,电路如下图所示。U11415161720212223414243444546495026272855565758596162293033343536PA0WKUPPA1PA2PA3PA4PA5PA6PA7PA8PA9PA10PA11PA12PA13PA14PA15PB0PB1PB2PB3PB4PB5PB6PB7PB8PB9PB10PB11PB12PB13PB14PB15NRSTPC0PC1PC2PC3PC4PC5PC6PC7PC8PC9PC10PC11PC12PC13_RTCPC14OSC32_INPC15OSC32_OUTOSCIN_PD0OSCOUT_PD1PD278910112425373839405152532345654R2100R1100D2LEDYELLOWD1LEDYELLOWVBAT1BOOT060STM32F103R6(2)程序设计参考任务3的程序设计,完成控制2个LED交替闪烁的程序设计,代码如下:#includestm32f10x.hvoidDelay(unsignedintcount)//延时函数{unsignedinti;for(;count!=0;count--){i=5000;while(i--);}}intmain(void){GPIO_InitTypeDefGPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2