1 / 24
文档名称:

嵌入式技术与应用开发项目教程(STM32版)习题答案.pdf

格式:pdf   大小:2,075KB   页数:24页
下载后只包含 1 个 PDF 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

嵌入式技术与应用开发项目教程(STM32版)习题答案.pdf

上传人:1781111**** 2024/5/11 文件大小:2.03 MB

下载得到文件列表

嵌入式技术与应用开发项目教程(STM32版)习题答案.pdf

相关文档

文档介绍

文档介绍:该【嵌入式技术与应用开发项目教程(STM32版)习题答案 】是由【1781111****】上传分享,文档一共【24】页,该文档可以免费在线阅读,需要了解更多关于【嵌入式技术与应用开发项目教程(STM32版)习题答案 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。:..嵌入式技术与应用开发项目教程(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),分别是内核访问层的源文件和头文件,提供进入M3内核接口。是由ARM公司提供的CMSIS核心文件,对所有CM3内核的芯片都一样,永远都不需要修改这个文件。(2)STM32F10x子目录的3个文件在STM32F10x子目录下面有3个文件:、,是外设访问层的源文件和头文件。(3)启动文件在STM32F10x子目录下面还有一个startup子目录,这个子目录里面放的是启动文件。启动文件主要是进行堆栈之类的初始化、中断向量表以及中断函数定义,还要引导进入main函数。:..(4)STM32F10x_StdPeriph_Template子目录的3个文件在子目录下有3个关键文件:、。,是用来编写中断服务函数,用户可以相应的加入自己的中断程序代码。,有很多#include。在建立工程时,可以注释掉一些不用的外设头文件,来选择固件库所使用的外设。1-9简述新建基于STM32固件库的KeilμVision4工程模板步骤。新建基于STM32固件库的KeilμVision4工程模板步骤如下:(1)新建工程模板目录新建一个“STM32_Project工程模板”目录,在“STM32_Project工程模板”目录下,新建4个USER、CORE、OBJ以及STM32F10x_FWLib子目录;把官方固件库“”下面的src和inc子目录复制到子目录STM32F10x_FWLib下面;把固件库“”;把“”;先把官方固件库“”,,,复制到我们的子目录USER下面,然后把官方固件库“”,,。(2)新建KeilμVision4工程模板新建“STM32_Project”工程,并保存在USER文件夹下面;通过选择芯片“SelectDeviceTarget‘Target1’”对话框,选择相应的型号。本项目使用的是STM32F103R6芯片,选择STMicroelectronics下面的STM32F103R6;在“CopySTM32StartupCodetoproject?.”对话框中,选择“否”。(3)新建组和添加文件到STM32_Project工程模板在USER子目录里面,,其中main()函数是一个空函数,方便以后在这里面添加需要的代码;在STM32_Project工程下,新建USER、CORE、OBJ和STM32F10x_FWLib四个组;往USER、CORE、OBJ和STM32F10x_FWLib这四个组中,添加我们需要的文件到相应的组中。(4)工程配置与编译在C/C++选项配置界中,通过“IncludePaths”设置编译器的头文件包含路径,添加所要编译文件的路径(、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引脚上,电路如下图所示。U114PA0-WKUPNRST715PA116PA2PC0817PA3PC1920PA4PC21021PA5PC31122PA6PC42423PA7PC52541PA8PC63742PA9PC73843PA10PC83944PA11PC94045PA12PC105146PA13PC115249PA14PC1253R2R150PA15PC13_RTC2100100PC14-OSC32_IN326PB0PC15-OSC32_OUT427PB128PB2D2D155PB3OSCIN_PD0556PB4OSCOUT_PD16LED-YELLOWLED-YELLOW57PB5PD25458PB659PB761PB862PB929PB1030PB11VBAT133PB1234PB1335PB1436PB15BOOT060STM32F103R6(2)程序设计参考任务3的程序设计,完成控制2个LED交替闪烁的程序设计,代码如下:voidDelay(unsignedintcount)//延时函数{unsignedinti;for(;count!=0;count--){i=5000;while(i--);}}intmain(void){GPIO_InitTypeDefGPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//=GPIO_Pin_8|GPIO_Pin_9;//PB8、=GPIO_Mode_Out_PP;//配置PB8、=GPIO_Speed_50MHz;//GPIOB速度为50MHzGPIO_Init(GPIOB,&GPIO_InitStructure);//初始化PB8、PB9GPIO_SetBits(GPIOB,GPIO_Pin_8);//PB8、PB9输出高电平,LED熄灭while(1){GPIO_ResetBits(GPIOB,GPIO_Pin_8);//PB8输出低电平,LED1点亮GPIO_SetBits(GPIOB,GPIO_Pin_9);//PB9输出高电平,LED2熄灭Delay(100);//延时,保持点亮一段时间GPIO_SetBits(GPIOB,GPIO_Pin_8);//PB8输出高电平,LED1熄灭GPIO_ResetBits(GPIOB,GPIO_Pin_9);//PB9输出低电平,LED2点亮Delay(100);//保持熄灭一段时间}}:..项目二跑马灯设计与实现2-1STM32的IO口可以由软件配置成哪几种模式?STM32的IO口可以由软件配置成如下8种模式:(1)浮空输入:IN_FLOATING;(2)上拉输入:IPU;(3)下拉输入:IPD;(4)模拟输入:AIN;(5)开漏输出:Out_OD;(6)推挽输出:Out_PP;(7)复用功能的推挽式输出:AF_PP;(8)复用功能的开漏输出:AF_OD。2-2端口配置寄存器有哪两个?其作用是什么?请举例说明。(1)有2个32位的端口配置寄存器CRL和CRH。(2)IO端口低配置寄存器CRL是控制着每个IO端口(A~G)的低8位IO端口的模式和输出速率;IO端口低配置寄存器CRL是控制着每个IO端口(A~G)的高8位IO端口的模式和输出速率。(3)例如:设置GPIOC的11位为上拉输入,4位为推挽输出,输出速率为50MHz。采用寄存器设置,代码如下:GPIOC->CRL&=0XFFF0FFFF;//清掉PC4位原来的设置,不影响其他位的设置GPIOC->CRL|=0X00030000;//设置PC12为推挽输出、速率为50MHzGPIOC->CRH&=0XFFFF0FFF;//清掉PC11位原来的设置,不影响其他位的设置GPIOC->CRH|=0X00008000;//PC11为上拉/下拉输入、速率为50MHzGPIOC->ODR=1<<11;//设置PC11为1,使得PC11为上拉输入如表2-1所示,通过这5个语句的配置,我们就设置了PC11为上拉输入,PC4为推挽输出、速率为50MHz。2-3请用端口输出数据寄存器ODR,编写控制GPIOC(书上把“C”写为“D”了)口的PC3~PC5和PC8~PC11输出高电平的语句。控制GPIOC口的PC3~PC5和PC8~PC11输出高电平的语句:GPIOC->ODR=0x0f38;2-_APB2PeriphClockCmd()和GPIO_Init()函数的功能。RCC_APB2PeriphClockCmd()函数是使能GPIOx对应的外设时钟;GPIO_Init()函数是初始化(配置)GPIO的模式和速度,也就是设置相应GPIO的CRL和CRH寄存器值。2-5请使用两种方法,用库函数编写控制PB7输出低电平和PB8输出高电平的代码。(1)第一种方法GPIO_ReSetBits(GPIOB,GPIO_Pin_7);//PB7输出低电平GPIO_SetBits(GPIOB,GPIO_Pin_8);//PB8输出高电平(2)第二种方法GPIO_WriteBit(GPIOB,GPIO_Pin_7,0);//PB7输出低电平GPIO_WriteBit(GPIOB,GPIO_Pin_8,1);//PB8输出高电平2-6Cortex-M3处理器采用什么架构?Cortex-M3处理器采用ARMv7-M架构,它包括所有的16位Thumb指令集和基本的32位Thumb-2指令集架构,Cortex-M3处理器不能执行ARM指令集。2-7Cortex-M3中的特殊功能寄存器包括哪几个?程序状态寄存器在其内部又被分为哪几个?:..(1)Cortex-M3中的特殊功能寄存器包括:1)程序状态寄存器组(PSRs或xPSR);2)中断屏蔽寄存器组(PRIMASK、FAULTMASK和BASEPRI);3)控制寄存器(CONTROL)。(2)程序状态寄存器在其内部又被分为如下3个子状态寄存器:1)应用程序PSR(APSR);2)中断号PSR(IPSR);3)执行PSR(EPSR)。2-8STM32系统架构是由哪两个单元组成?以及每个单元是由哪四部分组成?(1)STM32系统架构是由内核的驱动单元和外设的被动单元两个单元组成。(2)Crotex-Mx内核的驱动单元是由Icode总线、DCode总线、System总线以及通用DMA四个部分组成。(3)外设的被动单元是由AHB/APB桥连接的所有APB设备、内部闪存FlASH、内部SRAM以及FSMC四个部分组成。2-9STM32时钟系统有哪五个时钟源?STM32时钟系统有高速内部时钟HSI、高速外部时钟HSE、低速内部时钟LSI、低速外部时钟LSE和锁相环倍频输出PLL五个时钟源。2-10试一试,采用基于寄存器和基于库函数2种方法,完成的8个LED循环点亮的电路和程序设计、运行与调试,其中8个LED是由PA1~PA8控制。(1)8个LED循环点亮的电路,如下图所示:U114PA0-WKUPNRST715PA116PA2PC0817PA3PC1920PA4PC21021PA5PC31122PA6PC42423PA7PC52541PA8PC63742PA9PC73843PA10PC839D8D7D6D5D4D3D2D144PA11PC94045PA12PC1051LED-REDLED-REDLED-REDLED-REDLED-REDLED-REDLED-REDLED-RED46PA13PC115249PA14PC125350PA15PC13_RTC2PC14-OSC32_IN3R8R7R6R5R4R3R2R126PB0PC15-OSC32_OUT4100100100100100**********PB128PB255PB3OSCIN_PD0556PB4OSCOUT_PD1657PB5PD25458PB659PB761PB862PB929PB1030PB11VBAT133PB1234PB1335PB1436PB15BOOT060STM32F103R6(2)采用基于寄存器完成的8个LED循环点亮的程序如下:uint16_ttemp,i;voidDelay(unsignedintcount)//延时函数{unsignedinti;for(;count!=0;count--){i=5000;while(i--);}}intmain(void):..{//初始化GPIOA口的PA1~8RCC->APB2ENR|=1<<2;//使能PORTA时钟GPIOA->CRL&=0X0000000F;//清掉PA1~7原来的设置GPIOA->CRH&=0XFFFFFFF0;//清掉PA8原来的设置,同时不影响其它位设置GPIOA->CRL|=0X33333330;//PA1~7推挽输出GPIOA->CRH|=0X00000003;//PA8推挽输出GPIOA->ODR|=0x01FE;//PA1~8输出高while(1){GPIOA->ODR=0x0FFFE;//先熄灭所有LEDtemp=0x0FFFD;for(i=0;i<8;i++){GPIOA->ODR=temp;Delay(100);temp=(temp<<1)+1;}}}(2)采用基于库函数完成的8个LED循环点亮的程序如下:uint16_ttemp,i;voidDelay(unsignedintcount)//延时函数{unsignedinti;for(;count!=0;count--){i=5000;while(i--);}}intmain(void){GPIO_InitTypeDefGPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//=GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;//PA1-=GPIO_Mode_Out_PP;//=GPIO_Speed_50MHz;//GPIOA速度为50MHzGPIO_Init(GPIOA,&GPIO_InitStructure);//初始化PA1-PB8GPIO_Write(GPIOA,0x01FE);//PA1-PA8输出高电平,LED熄灭while(1){temp=0x01FD;for(i=0;i<8;i++){GPIO_Write(GPIOA,temp);Delay(100);temp=(temp<<1)+1;}}}:..项目三数码管显示设计与实现3-1简述Cortex-M3存储器与STM32存储器之间的关系。Cortex-M3定义了一个存储器结构,ST公司是按照Cortex-M3的存储器定义,设计出了自己的存储器结构,ST公司的STM32的存储器结构必须按照Cortex-M3定义的存储器结构来进行设计。也就是说,Cortex-M3的存储器结构决定了STM32的存储器结构。3-2简述Cortex-M3存储器如何对4G地址空间进行划分。Cortex-M3存储器,就是把程序存储器、数据存储器、寄存器、输入输出端口等组织在这个4GB空间的不同区域,这些区域是被明确的划分为大小相等的8块区域,每块区域大小为512M。这里划分的8块区域是粗线条的,主要包括代码、SRAM、外设、外部RAM、外部设备、专用外设总线-内部、专用外设总线-外部、特定厂商等。3-3位带区和位带别名区在Cortex-M3存储器中哪两个区域,地址是多少?(1)位带区和位带别名区在Cortex-M3存储器中SRAM区和片上外设区。(2)SRAM区是从地址0x2000_0000开始的1MB位带区,其对应的位带别名区的地址是从0x2200_0000开始的32MB。(3)片上外设区是从地址0x4000_0000开始的1MB位带区,其对应的位带别名区的地址是从0x4200_0000开始的32MB。3-4为什么通过位带别名区访问这些字时,就可以达到访问原来位的目的?在SRAM区和片上外设区的底部,都各有一个1MB的位带区,这两个位带区的地址除了像普通的RAM一样使用,而且每个位带区都对应一个自己的32MB位带别名区。在这里,位带别名区都可以把位带区的每个位(bit)扩展成一个32位的字。当你通过位带别名区访问这些字时,就可以达到访问原来位的目的。3-5SRAM区的位带地址映射到位带别名区的地址,是怎么计算的?假设SRAM位带区的某个位(bit),此位的所在字节地址记为A,位序号为n(n的值为0~7),则该位在位带别名区的地址为:AliasAddr=0x2200_0000+((A‐0x2000_0000)*8+n)*4=0x2200_0000+(A‐0x2000_0000)*32+n*4上式中的“*4”表示一个字为4个字节,“*8”表示一个字节有8个bit(位)。3-6片上外设区的位带地址映射到位带别名区的地址,是怎么计算的?假设片上外设位带区的某个位(bit),此位的所在字节地址也记为A,位序号为n(n的值为0~7),则该位在位带别名区的地址为:AliasAddr=0x4200_0000+((A‐0x4000_0000)*8+n)*4=0x4200_0000+(A‐0x4000_0000)*32+n*4上式中的“*4”表示一个字为4个字节,“*8”表示一个字节有8个bit(位)。3-7请编写建立一个能把“位带地址+位序号”转换成位带别名地址宏的代码,并对其如何实现进行说明。建立一个把“位带地址+位序号”转换成位带别名地址的宏,代码如下:#defineBITBAND(addr,bitnum)((addr&0xF0000000)+0x2000000+((addr&0xFFFFF)<<5)+(bitnum<<2))参考前面介绍的转换公式,完成“位带地址+位序号”转换成位带别名地址的计算,代码说明如下:(1)addr:是片上外设区的位带区的开始地址0x4000_0000;(2)addr&0xF000_0000:除了最高位,对其他位清0;(3)(addr&0xF000_0000)+0x200_0000:获得位带别名区的开始地址0x4200_0000;:..(4)addr&0xF_FFFF:保留低10位,其他位清0;(5)<<5:左移5位也就是乘以32,把位带区的bit位扩展为一个字(32位);(6)bitnum:是位带区的bit位的位号;(7)bitnum<<2:是乘以4,也就是获得位带区的bit位号对应在位带别名区的字地址偏移量。由于一个字是4个字节,占用4个存储单元,所以字之间的地址偏移量是4。如位带区的bit1,其对应在位带别名区的字地址偏移是4。又如位带区的bit2,其对应在位带别名区的字地址偏移是8。3-8试一试,采用位带操作的方法,完成的按键控制LED循环点亮的电路和程序设计、运行与调试。LED循环点亮的电路与与任务4电路一样,见图2-6所示。参考【技能训练3-2】把延时和位带操作分类单独写一个文件,完成基于位带操作的LED循环点亮步骤如下:(1)把【技能训练3-2】中的SYSTEM子目录复制到本工程目录下,。(2)在SYSTEM子目录下新建一个sys子目录,。:#ifndef__SYS_H#define__SYS_H//把“位带地址+位序号”转换成位带别名地址的宏&0xFFFFF)<<5)+(bitnum<<2))//把别名地址转换成指针类型的宏#defineMEM_ADDR(addr)*((volatileunsignedlong*)(addr))#defineBIT_ADDR(addr,bitnum)MEM_ADDR(BITBAND(addr,bitnum))//IO口输出地址映射#defineGPIOA_ODR_Addr(GPIOA_BASE+12)//0x4001080C#defineGPIOB_ODR_Addr(GPIOB_BASE+12)//0x40010C0C#defineGPIOC_ODR_Addr(GPIOC_BASE+12)//0x4001100C#defineGPIOD_ODR_Addr(GPIOD_BASE+12)//0x4001140C#defineGPIOE_ODR_Addr(GPIOE_BASE+12)//0x4001180C#defineGPIOF_ODR_Addr(GPIOF_BASE+12)//0x40011A0C#defineGPIOG_ODR_Addr(GPIOG_BASE+12)//0x40011E0C//IO口输入地址映射#defineGPIOA_IDR_Addr(GPIOA_BASE+8)//0x40010808#defineGPIOB_IDR_Addr(GPIOB_BASE+8)//0x40010C08#defineGPIOC_IDR_Addr(GPIOC_BASE+8)//0x40011008#defineGPIOD_IDR_Addr(GPIOD_BASE+8)//0x40011408#defineGPIOE_IDR_Addr(GPIOE_BASE+8)//0x40011808#defineGPIOF_IDR_Addr(GPIOF_BASE+8)//0x40011A08#defineGPIOG_IDR_Addr(GPIOG_BASE+8)//0x40011E08//IO口输入输出操作,只对单一的IO引脚,其中n的取值范围是:0~15。#definePAout(n)BIT_ADDR(GPIOA_ODR_Addr,n)//输出#d