嵌入式技术与应用开发项目教程(STM32版)习题答案
项目一LED控制设计与实现
1-1 嵌入式系统是如何定义的?
嵌入式系统(Embedded system),是一种“完全嵌入受控器件内部,为特定应用而设计的专用计算机系统”,根据IEEE(国际电气和电子工程师协会)的定义:嵌入式系统是控制、监视或辅助设备、机器或用于工厂运作的设备。
目前,国内普遍认同的嵌入式系统定义是:以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。
1-2 嵌入式系统具有哪些特点?
嵌入式系统具有以下几个显著特点:
(1)嵌入式系统是面向特定应用;
(2)软件要求固态化存储;
(3)嵌入式系统的硬件和软件都必须具备高度可定制性;
(4)嵌入式系统的生命周期较长;
(5)嵌入式系统开发需要开发工具和环境。
1-3 ARM Cortex-M3处理器是哪几个部分组成?
嵌入式系统一般是由嵌入式处理器、存储器、输入输出和软件(嵌入式设备的应用软件和操作系统是紧密结合的)等4部分组成。
1-4 简述STM32F103系列产品的命名规则。
STM32F103系列产品的命名规则,是按照“STM32F103XXYY”格式来命名的,具体含义如下:
(1)产品系列:STM32是基于ARM Cortex-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标准(Cortex Microcontroller Software Interface Standard),既“ARM Cortex™微控制器软件接口标准”。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-7 STM32固件关键子目录有哪些?其功能是什么?
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-8 STM32固件关键文件有哪些?
STM32固件的关键文件主要存放在Libraries子目录下。
(1)core_cm3.c和core_cm3.件
是位于\Libraries\CMSIS\CM3\CoreSupport子目录下面的,分别是内核访问层的源文件和头文件,提供进入M3内核接口。是由ARM公司提供的CMSIS核心文件,对所有CM3内核的芯片都一样,永远都不需要修改这个文件。
(2)STM32F10x子目录的3个文件
在STM32F10x子目录下面有3个文件:system_stm32f10x.c、system_stm32f10x.h以及stm32f10x.件,是外设访问层的源文件和头文件。
(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.件复制到子目录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文件夹下面;
通过选择芯片“Select Device Target ‘Target1’”对话框,选择相应的型号。本项目使用的是STM32F103R6芯片,选择STMicroelectronics下面的STM32F103R6;
在“Copy STM32 Startup Code to project .”对话框中,选择“否”。
(3)新建组和添加文件到STM32_ Project工程模板
在USER子目录里面,新建一个主文件main.c,其中main()函数是一个空函数,方便以后在这里面添加需要的代码;
在STM32_ Project工程下,新建USER、CORE、OBJ和STM32F10x_FWLib四个组;
往USER、CORE、OBJ和STM32F10x_FWLib这四个组中,添加我们需要的文件到相应的组中。
(4)工程配置与编译
在C/C++选项配置界中,通过“Include Paths”设置编译器的头文件包含路径,添加所要编译文件的路径(STM32F10x_FWLib\inc、CORE和USER三个子目录都要添加进去);
在C/C++选项配置界中,填写“STM32F10X_LD,USE_STDPERIPH_DRIVER”到Define输入框里(若使用中容量芯片就把STM32F10X_LD修改为STM32F10X_MD、使用大容量芯片就修改为STM32F10X_HD);
在Output选项中,选中“Greate HEX File”选项,并通过“Select Folder for Objects…”按钮,在弹出的对话框中选中“OBJ”子目录;
工程配置好后,对工程进行编译。
1-10 请使用基于STM32固件库的工程模板,来完成控制2个LED交替闪烁的电路和程序设计、运行与调试。
(1)电路设计
参考任务2的电路设计,增加1个LED,接在STM32F103VCT6的PB9引脚上,电路如下图所示。
(2)程序设计
参考任务3的程序设计,完成控制2个LED交替闪烁的程序设计,代码如下:
#include "stm32f10x.h"
void Delay(unsigned int count) //延时函数
{
unsigned int i;
for(;count!=0;count--)
{
i=5000;
while(i--);
}
}
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能GPIOB时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9; //PB8、PB9引脚配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //配置PB8、PB9为推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIOB速度为50MHz GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB8、PB9 GPIO_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-1 STM32的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为推挽输出、速率为50MHz
GPIOC->CRH&=0XFFFF0FFF; //清掉PC11位原来的设置,不影响其他位的设置
GPIOC->CRH|=0X00008000; //PC11为上拉/下拉输入、速率为50MHz
GPIOC->ODR=1<<11; //设置PC11为1,使得PC11为上拉输入
如表2-1所示,通过这5个语句的配置,我们就设置了PC11为上拉输入,PC4为推挽输出、速率为50MHz。
2-3 请用端口输出数据寄存器ODR,编写控制GPIO C(书上把“C”写为“D”了)口的PC3~PC5和PC8~PC11输出高电平的语句。
控制GPIOC口的PC3~PC5和PC8~PC11输出高电平的语句:
GPIOC->ODR = 0x0f38;
2-4 简述RCC_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-6 Cortex-M3处理器采用什么架构?
Cortex-M3处理器采用ARMv7-M架构,它包括所有的16位Thumb指令集和基本的32位Thumb-2指令集架构,Cortex-M3处理器不能执行ARM指令集。
2-7 Cortex-M3中的特殊功能寄存器包括哪几个?程序状态寄存器在其内部又被分为哪几个?
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论