2014计量学院-嵌入式系统试卷答案 - 图文

更新时间:2024-05-31 18:23:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

中国计量学院2013 ~ 2014 学年第 1 学期《嵌入式系统原理与应用》课程试卷(A)参考答案及评分标准 1. 画出基于ARM-Cortex M3内核最小系统的电路图,并进行简要说明启动引脚所对应的启动模式。(10分)

最小系统的电路图,能正确画出图或者用文字描述得(6分)

启动模式说明,能正确画出图或者用文字描述得(4分)

2. 画出基于CMSIS标准的应用程序的基本结构,并简述其所包含的三个基本功能层。(10分)

基于CMSIS标准的应用程序的基本结构,能正确画出图或者用文字描述得(7分)

《嵌入式系统原理与应用 》课程试卷(A )参考答案及评分标准 第 1 页 共 12页

CMSIS标准的三个基本功能层:(3分)

1. 内核设备访问层:包含用于访问内核寄存器设备的名称定义、地址定义和助手函数。同时也为RTOS定义了独立于微控制器的接口,该接口包括调试通道定义。

2. 中间设备访问层:为软件提供了访问外设的通用方法。芯片供应商应当修改中间设备访问层,对于

中间设备访问层,芯片厂商需要根据自己的设备特性进行更新。 3. 微控制器外设访问层:提供了片上所有外设的定义。

3. 画出STM32内部的总线结构。并简要说明AHB总线与SRAM、DMA及APB总线之间的关系。(10分) 能正确画出图或者用文字描述得6分。

FLITF为Flash控制器。

AHB总线与SRAM、DMA及APB总线之间的关系(4分):

STM32的内部SRAM和DMA单元直接与AHB总线相连,外部设备则使用两条APB总线相连,每一条APB总线又都与AHB总线矩阵相连。

4. 在基于ARM-Cortex M3内核的芯片上编写程序实现如下功能。通过GPIO口引脚实现2个LED 灯交替实现闪烁,2个灯持续时间闪烁时间持续为1秒。(25分) 1) 画出所需要的电路图。(5分)

GPIOA.6GPIOA.7STM32 2) 画出程序的流程图。(5分)

开始RCC设置GPIO设置LED操作While(1);

《嵌入式系统原理与应用 》课程试卷(A )参考答案及评分标准 第 2 页 共 12页

3) 配置Systick定时器,并使用Systick定时器实现1秒钟的延时功能,写出相应的程序。(5分) 方法:1:

SysTick_Config(72000000/ 2000); void Delay(uint32_t nTime) {

TimingDelay = nTime;

while(TimingDelay != 0); }

void TimingDelay_Decrement(void) {

if (TimingDelay != 0x00) {

TimingDelay--; } } 方法2:

Systick_Configuration();

void Systick_Configuration(void) {

/* 失能Systick定时器 */

SysTick_CounterCmd(SysTick_Counter_Disable); /* 选择HCLK为Systick时钟源 */

SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); /* 清除Systick计数器 */

SysTick_CounterCmd(SysTick_Counter_Clear);

/* 主频为72/8MHz,配置计数值为9000 * 1000可以得到1s定时间隔*/ SysTick_SetReload(9000 * 1000); }

void Delay_Second(void) {

/* 启动Systick计数 */

SysTick_CounterCmd(SysTick_Counter_Enable); /* 等待Systick计数至0 */

while(SysTick_GetFlagStatus(SysTick_FLAG_COUNT) == 0); /* 失能Systick定时器 */

SysTick_CounterCmd(SysTick_Counter_Disable); /* 清除Systick计数器 */

SysTick_CounterCmd(SysTick_Counter_Clear); }

4) 写出整个交替LED灯闪烁的程序。(10分)

#include \

《嵌入式系统原理与应用 》课程试卷(A )参考答案及评分标准 第 3 页 共 12页

void RCC_Configuration(void); void GPIO_Configuration(void); void Systick_Configuration(void); void Delay_Second(void); int main(void) {

RCC_Configuration(); GPIO_Configuration(); /* 设置SyTtick定时器 */ Systick_Configuration(); while(1) {

GPIO_WriteBit(GPIOA, GPIO_Pin_4,

(BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_4)) );//翻转GPIOA.4电平 Delay_Second(); //见前面的systick延时 } }

void RCC_Configuration(void) {

/* 定义枚举类型变量 HSEStartUpStatus */ ErrorStatus HSEStartUpStatus;

/* 复位系统时钟设置*/ RCC_DeInit(); /* 开启HSE*/

RCC_HSEConfig(RCC_HSE_ON); /* 等待HSE起振并稳定*/

HSEStartUpStatus = RCC_WaitForHSEStartUp(); /* 判断HSE起是否振成功,是则进入if()内部 */ if(HSEStartUpStatus == SUCCESS) {

/* 选择HCLK(AHB)时钟源为SYSCLK 1分频 */ RCC_HCLKConfig(RCC_SYSCLK_Div1);

/* 选择PCLK2时钟源为 HCLK(AHB) 1分频 */ RCC_PCLK2Config(RCC_HCLK_Div1);

/* 选择PCLK1时钟源为 HCLK(AHB) 2分频 */ RCC_PCLK1Config(RCC_HCLK_Div2); /* 设置FLASH延时周期数为2 */ FLASH_SetLatency(FLASH_Latency_2); /* 使能FLASH预取缓存 */

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

《嵌入式系统原理与应用 》课程试卷(A )参考答案及评分标准 第 4 页 共 12页

/* 选择锁相环(PLL)时钟源为HSE 1分频,倍频数为9,则PLL输出频率为 8MHz * 9 = 72MHz */ RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /* 使能PLL */

RCC_PLLCmd(ENABLE); /* 等待PLL输出稳定 */

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); /* 选择SYSCLK时钟源为PLL */

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /* 等待PLL成为SYSCLK时钟源 */ while(RCC_GetSYSCLKSource() != 0x08); }

/* 打开APB2总线上的GPIOA时钟*/

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); }

void GPIO_Configuration(void) {

/* 定义GPIO初始化结构体 GPIO_InitStructure */ GPIO_InitTypeDef GPIO_InitStructure;

/* 设置 GPIOA.4 为推挽输出,最大翻转频率为50MHz*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); }

5.在基于ARM-Cortex M3内核的芯片上编写程序实现如下功能。使用按键与芯片管脚相连,配置两个外部中断,实现在中断0中,通过USART口,输出一个字符串。例如:interrupt 0;在中断1中,通过USART口,输出一个字符串。例如:interrupt 1;执行顺序是先是中断0,然后是中断1。 (1) 画出所需要的电路图。(5分)

(2) 画出程序的流程图。(5分)

《嵌入式系统原理与应用 》课程试卷(A )参考答案及评分标准 第 5 页 共 12页

(3) 配置串口USART1,实现通过串口向PC机的串口助手打印一个字符串。例如:interrupt 0。写出相应的

程序。(5分)

在KEIL C Target option -> target中选择 useMicroLIB void GPIO_Configuration(void) {

/* 定义 GPIO 初始化结构体 GPIO_InitStructure */ GPIO_InitTypeDef GPIO_InitStructure;

/* 设置USART1的Tx脚(PA.9)为第二功能推挽输出模式 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA , &GPIO_InitStructure);

/* 设置USART1的Rx脚(PA.10)为浮空输入脚 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA , &GPIO_InitStructure); }

void USART_Configuration(void) {

USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 9600;

USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No ;

USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1 , &USART_InitStructure); USART_Cmd(USART1 , ENABLE); }

int fputc(int ch,FILE *f)

《嵌入式系统原理与应用 》课程试卷(A )参考答案及评分标准 第 6 页 共 12页

{ }

printf(\

(4) 写出整个外部中断以及串口输出的程序。(与第3小题相重合的部分程序不需要再写出)(10分)

#include \#include \

#include \#include \#include \

/* Private function prototypes -----------------------------------------------*/ void RCC_Configuration(void); void Init_GPIOs (void); void Delay(uint32_t nTime); void USART_Configuration(void); void EXTI_Configuration(void); void NVIC_Configuration(void); int main(void) {

/* Configure Clocks for Application need */ RCC_Configuration();

NVIC_Configuration(); Init_GPIOs(); USART_Configuration(); { } }

void Init_GPIOs (void) {

GPIO_InitTypeDef GPIO_InitStructure;

RCC_AHBPeriphClockCmd(LD_GPIO_PORT_CLK|USERBUTTON_GPIO_CLK, ENABLE);

/* Configure User Button pin as input */ EXTI_Configuration(); while(1)

USART_SendData(USART1,(unsigned char)ch);

while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); return ch;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;//USERBUTTON_GPIO_PIN 《嵌入式系统原理与应用 》课程试卷(A )参考答案及评分标准 第 7 页 共 12页

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz; GPIO_Init(USERBUTTON_GPIO_PORT, &GPIO_InitStructure); }

void EXTI_Configuration() {

EXTI_InitTypeDef EXTI_InitStructure;

SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0); SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource1); EXTI_InitStructure.EXTI_Line = EXTI_Line0|EXTI_Line1 ;

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); }

void NVIC_Configuration() {

NVIC_InitTypeDef NVIC_InitStructure;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

/* Enable and set EXTI0 Interrupt to the lowest priority */

NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn ;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn ;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }

void EXTI0_IRQHandler(void) { }

《嵌入式系统原理与应用 》课程试卷(A )参考答案及评分标准 第 8 页 共 12页

printf(\

EXTI_GenerateSWInterrupt(EXTI_Line1); EXTI_ClearFlag(EXTI_Line0);

void EXTI1_IRQHandler(void) { }

6.在基于ARM-Cortex M3内核的芯片上编写程序实现如下功能。定义一个32个整数的一维数组,配置DMA和CPU进行数据搬移,分别计算分别使用DMA和CPU来搬移这个数组所花的时间,并将这两个结果用串口传输到上位机显示。(20分) 1. 画出所需要的电路图。(5分)或者参见第五题去掉按键部分电路

printf(\EXTI_ClearFlag(EXTI_Line1);

2. 画出程序的流程图。(5分)

3. 写出DMA和CPU搬移数据的过程以及串口输出所花时间的程序。(10分) #include \#include \#include \

《嵌入式系统原理与应用 》课程试卷(A )参考答案及评分标准 第 9 页 共 12页

#define BufferSize 32 vu16 CurrDataCounter = 0; vu32 Tick = 0;

uc32 SRC_Const_Buffer[BufferSize ] = {

0x01020304,0x05060708,0x090A0B0C,0x0D0E0F10, 0x11121314,0x15161718,0x191A1B1C,0x1D1E1F20, 0x21222324,0x25262728,0x292A2B2C,0x2D2E2F30, 0x31323334,0x35363738,0x393A3B3C,0x3D3E3F40, 0x41424344,0x45464748,0x494A4B4C,0x4D4E4F50, 0x51525354,0x55565758,0x595A5B5C,0x5D5E5F60, 0x61626364,0x65666768,0x696A6B6C,0x6D6E6F70, 0x71727374,0x75767778,0x797A7B7C,0x7D7E7F80 };

u32 DST_Buffer[BufferSize ]; void RCC_Configuration(void); void NVIC_Configuration(void); void GPIO_Configuration(void); void USART_Configuration(void); void DMA_Configuration(void); void SysTick_Configuration(void); int main(void) {

u8 i = 0;

u8 TickCntCPU = 0; u8 TickCntDMA = 0;

RCC_Configuration(); /* 设置 NVIC */ NVIC_Configuration(); /* 设置 GPIO 端口 */ GPIO_Configuration(); /* 设置 USART */ USART_Configuration(); /* DMA初始化 */ DMA_Configuration(); /* SysTick初始化 */ SysTick_Configuration(); Tick = 0;

for(i = 0; i < BufferSize; i++) {

/* 在 RAM 中开辟一片空间用做DMA目的空间 */

/* 定义 DMA 传输数目变量 */

/* 计时变量 */

《嵌入式系统原理与应用 》课程试卷(A )参考答案及评分标准 第 10 页 共 12页

DST_Buffer[i] = SRC_Const_Buffer[i]; }

/* 保存计时数据 */ TickCntCPU = Tick; for(i = 0; i < BufferSize; i++) {

DST_Buffer[i] = 0; } Tick = 0;

DMA_Cmd(DMA1_Channel6, ENABLE); /* 等待传输完成 */

while(CurrDataCounter != 0); TickCntDMA = Tick;

if(strncmp((const char*)SRC_Const_Buffer, (const char*)DST_Buffer, BufferSize) == 0) {

printf(\ } else {

printf(\ }

printf(\ printf(\ while(1); }

RCC_Configuration() /*在前面基础上增加 开启 DMA , USART1 和 GPIOA 时钟 */ {

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); }

void NVIC_Configuration(void) {

/* 定义NVIC初始化结构体 NVIC_InitStructure */ NVIC_InitTypeDef NVIC_InitStructure;

/* #ifdef...#else...#endif结构的作用是根据预编译条件决定中断向量表起始地址*/ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

《嵌入式系统原理与应用 》课程试卷(A )参考答案及评分标准 第 11 页 共 12页

/* 开启DMA16通道中断控制,0级先占优先级,0级次占优先级*/ NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel6_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }

void DMA_Configuration(void) {

DMA_InitTypeDef DMA_InitStructure;

DMA_DeInit(DMA1_Channel6);

DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)SRC_Const_Buffer; DMA_InitStructure.DMA_MemoryBaseAddr = (u32)DST_Buffer; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = BufferSize;

DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word; DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Enable; DMA_Init(DMA1_Channel6, &DMA_InitStructure); DMA_ITConfig(DMA1_Channel6, DMA_IT_TC, ENABLE); CurrDataCounter= DMA_GetCurrDataCounter(DMA1_Channel6); }

《嵌入式系统原理与应用 》课程试卷(A )参考答案及评分标准 第 12 页 共 12页

本文来源:https://www.bwwdw.com/article/4ks6.html

Top