嵌入式大作业

一、简答题。(共30分,共5小题,每题6分。)

  1. 简述嵌入式的概念?
    答:嵌入式一般指嵌入式系统,是指以应用为中心、以计算机技术为基础,软、硬件可裁剪,适应于应用系统对功能、可靠性、成本、体积、功耗等方面有特殊要求的专用计算机系统,它可以用来控制、监视或者辅助机器、设备或装置的运行。

  2. 简述嵌入式系统中处理器的工作模式和状态,及之间的转换关系。
    答:嵌入式系统中处理器的工作模式包括:线程模式(thread mode)与处理者模式(handler mode),状态则包括:特权级与用户级。
    其中特权级可以执行任何指令,可以访问所有范围的存储器(如果有MPU,需要在MPU规定禁区之外),所以异常服务程序必须在特权级下执行,用户级只能执行部分指令,不能对系统控制空间(SCS)中的寄存器(如NVIC、SYSTICK、MPU)进行操作。线程模式是用户应用程序的运行模式。在该模式下,可以执行特权级和用户(非特权)级代码。处理者模式是异常或中断服务程序或操作系统内核代码的运行模式。在该模式下,所有代码都是特权访问的。
    之间的转换关系图如下:
    在这里插入图片描述
    1.芯片复位后,进入线程模式(特权级)。
    2.线程模式(特权级)与处理者模式(特权级)之间通过异常/中断的进出来切换,可以通过置位CONTROL[0]来进入非特权级。
    3.处理者模式永远都是特权级。不管产生了任何异常,处理器都将以特权级来运行其服务例程,异常返回后,系统将回到产生异常时所处的级别。
    4.处理者模式通过异常/中断进入,退出即返回线程模式。从处理者模式异常返回时,也可以通过置位CONTROL[0]或清零CONTROL[0]来改变返回线程模式的级别。
    5.线程模式(用户级)不能试图修改CONTROL[0]来回到线程模式特权级,它必须通过一个异常进入到Handler模式,由那个异常Handler处理来修改,清零CONTROL[0]为线程模式特权级,才能在返回到线程模式后拿到特权级。

  3. 什么是嵌入式的最小系统?STM32的最小系统由什么组成?
    答:嵌入式的最小系统是指以某控制器为核心,与满足运行的最简单的硬件所组成的嵌入式系统。STM32的最小系统由电源电路、时钟电路、复位电路、启动电路、程序下载电路组成。

  4. 解释什么是嵌入式系统开发中所用的固件库?并写出你常用的固件库中一个文件。
    答: 嵌入式系统开发中所用的固件库是一个固件函数包,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能特征。该函数库还包括每一个外设的驱动描述和应用实例,每个外设驱动都由一组函数组成,这组函数覆盖了该外设所有功能。每个器件的开发都由一个通用API (application programming interface 应用编程界面)驱动,API对该驱动程序的结构,函数和参数名称都进行了标准化。其优点是:通过使用固件函数库,无需深入掌握底层硬件细节,开发者就可以轻松应用每一个外设。因此,使用固态函数库可以大大减少用户的程序编写时间,进而降低开发成本。一个常用的固件库的文件是:stm32f10x.h,这个文件是微控制器专用头文件,包含了STM32F10x全系列所有外设寄存器的定义(寄存器的基地址和布局)、位定义、中断向量表、存储空间的地址映射等,在程序设计中经常进行使用。

  5. 简述STM32的外部中断/事件控制器(EXTernal Interrupt/event controller,EXTI)中断通道。
    答:中断通道是处理中断的通路,每个中断通道对应唯一中断向量和中断服务程序,但该中断通道可具有多个可引起中断的中断源,这些中断源都能通过对应的“中断通道”向内核申请中断。STM32 可以支持68个外部中断通道,并固定的分配给相应的外部设备。每个中断通道都具备自己的中断优先级控制字节 PRI_n,每个字节共有8位,但在 STM32 中只使用 4 位,高 4 位有效,
    STM32的外部中断/事件控制器有19个中断通道,其中16个中断通道EXTI0-EXTI15对应GPIOx_Pin0-GPIOx_Pin15,另外3个分别是EXTI16连接的PVD输出、EXTI17连接到RTC闹钟事件和EXTI18连接到USB唤醒事件。每个中断通道的输入线可以独立地配置输入类型(脉冲或挂起)和对应的触发事件(上升沿、下降沿或双边沿触发)。每个输入线都可以独立地被屏蔽。中断挂起寄存器保持着状态线的中断请求。当相同占先优先级和相同响应优先级的中断同时申请服务时,STM32首先响应中断通道所对应的中断号小的那个中断。

二、编程题(50分)
1、硬件连接图如图1所示,编程实现如下功能。
(1) 利用STM32的GPIO接口和定时器Tim2的定时中断(时钟频率72MHz),利用库函数法实现2个LED每隔1s,按照LED1和LED2顺次循环亮灭。要求:需提供包括工程文件结构、所有代码(GPIO初始化,TIM初始化,NVIC初始化,主程序,中断服务程序)和仿真结果。(15分)。
答:
工程文件结构:
在这里插入图片描述
代码:

#include "stm32f10x.h"

void LED_Config(void)//GPIO初始化函数
{
   
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    GPIO_ResetBits(GPIOA,GPIO_Pin_1);
    GPIO_SetBits(GPIOA,GPIO_Pin_4);
}


void TIM2_NVIC_config(void)//NVIC初始化函数
{
   
    NVIC_InitTypeDef nvic;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);//优先级分组
    nvic.NVIC_IRQChannel=TIM2_IRQn;
    nvic.NVIC_IRQChannelCmd=ENABLE;
    nvic.NVIC_IRQChannelPreemptionPriority=0;
    nvic.NVIC_IRQChannelSubPriority=0;
    NVIC_Init(&nvic);
}


void TIM2_Config(void)//TIM2初始化
{
   
    TIM_TimeBaseInitTypeDef tim;//结构体
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启时钟
    tim.TIM_ClockDivision=TIM_CKD_DIV1;//采样分频
    tim.TIM_CounterMode=TIM_CounterMode_Up;//向上计数
    tim.TIM_Period==(10000-1);;//自动重装载寄存器的值
    tim.TIM_Prescaler=(7200 - 1);//时钟预分频

    TIM_TimeBaseInit(TIM2,&tim);//初始化结构体
    TIM_ClearFlag(TIM2,TIM_FLAG_Update);//清除溢出中断标志
    TIM_ITConfig(TIM2,TIM_IT_Update|TIM_IT_Trigger,ENABLE);
    TIM_Cmd(TIM2
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值