嵌入式系统原理复习题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

嵌⼊式系统原理复习题
嵌⼊式系统原理
⼀、选择题(30分)
1、假设Cortex-M4处理器的3级流⽔线,每级所耗时间均为0.1ms,不考虑流⽔线“断流”则顺序执⾏50条指令需要耗费时间
____5.2___
2、在下⾯的寄存器中,只能在特权级下进⾏访问的是()
A.PC
B.MSP
C.R3 DAPSR
3、若R0的值为4,执⾏指令ORR R0,R0,#3后,R0的值是___7____
4、下列指令中会对内存单元进⾏写操作的是()
A. Add r0,r1,r2,lsl#1
B.ldr r0,[r1]
C. bic r0,r0,#3
D.mov r0,r1
5、下列指令中,寻址⽅式为基址变址寻址的是()
A.ldr r0,[r1,#0x0f]
B.mov r0,r1
C.ldr r0,[r1]
D.add r0,r1,r2,lsl#1
6、按照ATPCS规则,⼦程序的第5个参数通过__堆栈__传递。

7、若要把F组GPIO的模式寄存器GPIO_MODER的bit3和bit2位设置为⼆进制01,⽽其他位不变,下⾯可以实现这⼀功能的正确表达式是()
A.GPIOF_MODER &=(~0x3)|0x1;
B.GPIOF_MODER=0x1;
C.GPIOF_MODER &=(0x3<<2)|(0x1<<2);
D.GPIOF_MODER &=(~(0x3<<2))|(0x1<<2);
8、STM32F439的主锁相环(PLL)时钟是否就绪,可通过寄存器()进⾏判断。

A.RCC_CFGR
B.RCC_PLLCFGR
C.RCC_CR
D.RCC_CIR
9、STM32F439的US ART1完成初始化⼯作后,若要发送数据,只要把需要发送的数据写⼊寄存器()
/doc/00c0ba232dc58bd63186bceb19e8b8f67d1cefc1.html ART1_SR
/doc/00c0ba232dc58bd63186bceb19e8b8f67d1cefc1.html ART1_DR
/doc/00c0ba232dc58bd63186bceb19e8b8f67d1cefc1.html ART1_BRR
/doc/00c0ba232dc58bd63186bceb19e8b8f67d1cefc1.html ART1_CR1
10、下列异常中,优先级可编程配置的异常是()
A.NMI
B.Hard fault
C.SVC
D.RESET
11、若已知STM32F439通⽤定时器TIM3预分频器的时钟由内部时钟CK_INT提供,CN_INT的频率为20MHz,预分频寄存器的值为1,要实现2us的定时,⾃动重载寄存器的值应为__19=ARR ___
12、STM32F439的通⽤定时器TIM14,⼯作在PWM模式时,在计数器时钟频率不变的情况下,输出PWM波形的周期取决于寄存器()。

A.TIM14_CCR1
B.TIM14_ARR
C.TIM14_CR1
D.TIM14_SR
13、Cortex_M4内核的嵌套向量中断控制器NVIC,要禁⽌⼀个中断,需要对寄存器()对应的位进⾏写1操作。

A.NVIC_ICERn
B.NVIC_ISERn
C.NVIC_ICPRn
D.NVIC_ISPRn
14、STM32F439的外部中断/事件控制器EXTI,若要允许某个输⼊线下降沿触发中断和事件,需要设置的寄存器是(c)。

A.EXTI_PR
B.EXTI_RTSR
C.EXTI_FTSR
D.EXTI_IMR
15、要取消STM32F439独⽴看门狗寄存器IWDG_PR的写保护,要对寄存器IWDG_KR寄存器写⼊____ 0x5555_____
⼆、填空题(20分)
1、STM32F439复位后默认的运⾏模式是__线性模式________ ,默认级别是__特权级________。

2、Cortex_M4三级流⽔线的三个阶段分别是____取指_____、___译码_______、__执⾏________
3、Cortex_M4内核复位后,读取0x00000000地址单元的值作为寄存器_(MSP)___的初始值;读取0x00000004地址单元的值作为寄存器__(PC)___的初始值。

4、把CONTROL的值读取到R0,完整的汇编指令是___(mrs r0,control)______;把R0的值写⼊到CONTROL,完整的汇编指令是____(msr control,r0)_________
5、伪操作IMPORT的作⽤是___声明需要应⽤的标号在其他⽂件中_。

6、Cortex_M4处理器嵌套向量中断控制器(NVIC)的中断控制器类型寄存器(NVIC_ICTR),主要⽤于_____显⽰NVIC⽀持的中断线数⽬_____。

7、通⽤寄存器TIM14主要由__触发控制器___、__时基单元__、_输⼊捕获通道__和__输出⽐较通道__组成。

8、伪指令ldr r0,=label的功能是_____将label标号地址传递给r0___。

9、STM32F439时钟数中,系统时钟SYSCLK的来源有三个,分别是:___HSI___、___HSE____和
___PLLCLK_________,其中__ PLLCLK ____是由主锁相环倍频分频产⽣。

三、简答题(20分)
1、Cortex_M4处理器的⼀个异常或中断被发出后,硬件⾃动完成了哪些操作?(10分)
所有异常都在处理模式中操作。

出现异常时,⾃动将处理器状态保存到堆栈中,并在中断服务程序(ISR)结束时⾃动从堆栈中恢复。

在状态保存的同事取出向量快速地进⼊中断。

异常进⼊当CM4处理器的⼀个异常或中断被触发,硬件中断完成如下⼯作:
(1)CM4中断控制器根据当前状态和中断的抢占级别来确定是响应应该中断,还是先挂起,并更新相应的寄存器状态。

(2)通过Dbus保存处理器状态,将下⾯的8个寄存器按顺序保存⼊SP(MSP或PSP)指向的系统堆栈。

(3)CM4通过Ibus从异常向量表取得对应的中断向量,并开始读取ISR指令,这⼀步⼏乎与压栈同时进⾏。

(4)CM4处理器更新到handler模式,SP切换到MSP,更新IPSR为新响应的异常编号,更新PC,更新LR寄存器为
EXC_RETURN。

2、画出STM32F439独⽴看门狗的结构框图,并简述独⽴看门狗的⼯作原理。

(10分)
答:⼯作原理
在键值寄存器(IWDG_KR)中写⼊0xCCCC,开始启⽤独⽴看门狗。

此时计数器开始从其复位值0xFFF 递减,当计数器值计数到尾值0x000时会产⽣⼀个复位信号(IWDG_RESET)。

⽆论何时,只要在键值寄存器IWDG_KR中写⼊0xAAAA(即喂狗), ⾃动重装载寄存器IWDG_RLR的值就会重新加载到计数器,从⽽避免看门狗复位。

如果程序异常,就⽆法正常喂狗,从⽽系统复位。

作业3:
画出STM32F439通⽤定时器PWM输出原理⽰意图,并简述TIM14输出PWM波形的原理。

答:⼯作原理
定时器TIM14⼯作在向上计数 PWM模式,且当CNT=CCRx 时输出1。

那么就可以得到如上的 PWM⽰意图:当 CNT 值⼩于CCRx 的时候, IO 输出低电平(0),当 CNT 值⼤于等于 CCRx 的时候,IO 输出⾼电平(1),当 CNT 达到 ARR值的时候,重新
归零,然后重新向上计数,依次循环。

改变CCRx的值,可改变PWM输出的占空⽐,改变ARR的值,可改变PWM输出的频率。

四、程序分析与设计题(30分)
1、查阅串⼝相关参考⼿册,根据注释完善串⼝2的初始化函数
**************************************
功能: USART2的初始化
参数: pclk1:USART2所连接的APB1总线时钟频率
baud:USART2发送/接收波特率
返回值:void
***************************************
void USART2_init(unsigned int pclk1,unsigned int baud)
{
unsigned short int mantissa;
unsigned char fraction;
RCC_AHB1ENR |= 1<<0; //GPIOA时钟使能
RCC_APB2ENR |= 1<<17; //USART2时钟使能
GPIOA_MODER = GPIOA_MODER&(~(3<<4))|(2<<4); //设置PA2为复⽤功能模式
GPIOA_MODER= GPIOA_MODER&(~(3<<6))|(2<<6); //设置PA3为复⽤功能模式
GPIOA_OTYPER &= ~(1<<2); //设置PA2为推挽输出
GPIOA_OTYPER &= ~(1<<3) //设置PA3为推挽输出
GPIOA_OSPEEDR = GPIOA_OSPEEDR&(~(3<<4))|(2<<4); //设置PA2为50MHz快速
GPIOA_OSPEEDR= GPIOA_OSPEEDR&(~(3<<6))|(2<<6); //设置PA3为50MHz快速
GPIOA_PUPDR = GPIOA_PUPDR&(~(3<<4))|(1<<4); //设置PA2上拉
GPIOA_PUPDR = GPIOA_PUPDR&(~(3<<6))|(1<<6); //设置PA3上拉
GPIOA_AFRH = GPIOA_AFRH&(~(0xf<<8))|(7<<8); //将PA2复⽤为USART2_TX
GPIOA_AFRH = GPIOA_AFRH&(~(0xf<<12))|(7<<12); //将PA3复⽤为USART2_RX
USART2_CR1&= ~((1<<12)|(1<<10)); //1个起始位,8个数据位,n个停⽌位,禁⽌奇偶校验USART2_CR2 &= ~(3<<12); //1个停⽌位
USART2_CR3 &= ~(3<<8); //禁⽌CTS、RTS硬件流控
USART2_CR1 &= ~(1<<15); //16倍过采样,即OVER8=0
//计算得出USARTDIV的尾数
mantissa=(unsigned short int)((pclk1*1000000)/(baud*(8*(2-0))));
//计算得出USARTDIV的尾数
fraction=(unsigned char)(((pclk1*1000000)/(baud*(8*(2-0)))-mantissa)*16);
//将得到的尾数和⼩数设置波特率寄存器USART2_BRR
USART2_BRR = USART1_BRR&(~(0xffff<<0))|(mantissa<<4)|(fraction<<0);
USART2_CR1|= (1<<13)|(1<<3)|(1<<2); //使能USART,使能发送器,使能接收器
}
2、⽤C语⾔编程控制与引脚PF9相连的LED闪烁,亮灭间隔⽤延时实现。

****************功能:实现开发板上LED亮灭闪烁**************** #define GPIOF_MODER (*(volatile unsigned int *)0x40021400) #define GPIOF_OTYPER (*(volatile unsigned int *)0x40021404)
#define GPIOF_OSPEEDR (*(volatile unsigned int *)0x40021408
#define GPIOF_PUPDR (*(volatile unsigned int *)0x4002140C)
#define GPIOF_ODR (*(volatile unsigned int *)0x40021414)
#define RCC_AHB1ENR (*(volatile unsigned int *)0x40023830)
void Delay(unsigned int nCount)
{
for(; nCount != 0; nCount--);
}
void Port_init(void)
{
// f10
RCC_AHB1ENR |= 0x20;
GPIOF_MODER &= (~(0x3<<20));GPIOF_MODER |= (0x1<<20); GPIOF_OTYPER &= (~(0x1<<10)); GPIOF_OSPEEDR&= (~(0x3<<20)); GPIOF_OSPEEDR |= (0x2<<20); GPIOF_PUPDR &= (~(0x3<<20)); // f9
RCC_AHB1ENR |= 0x18; GPIOF_MODER &= (~(0x3<<18));
GPIOF_MODER |= (0x1<<18);
GPIOF_OTYPER &= (~(0x1<<9));
GPIOF_OSPEEDR&= (~(0x3<<18));
GPIOF_OSPEEDR |= (0x2<<18);
GPIOF_PUPDR &= (~(0x3<<18)); // f8
RCC_AHB1ENR |= 0x16;
GPIOF_MODER &= (~(0x3<<16)); GPIOF_MODER |= (0x1<<16); GPIOF_OTYPER &= (~(0x1<<8)); GPIOF_OSPEEDR&= (~(0x3<<16)); GPIOF_OSPEEDR |= (0x2<<16); GPIOF_PUPDR &= (~(0x3<<16)); // f7
RCC_AHB1ENR |= 0x14;
GPIOF_MODER &= (~(0x3<<14)); GPIOF_MODER |= (0x1<<14); GPIOF_OTYPER &= (~(0x1<<7)); GPIOF_OSPEEDR&= (~(0x3<<14)); GPIOF_OSPEEDR |= (0x2<<14); GPIOF_PUPDR &= (~(0x3<<14)); } int led(void)
{
Port_init();
while (1)
{
// f10
GPIOF_ODR &= (~(0x1<<10)); Delay(0xFFFFF);
GPIOF_ODR |= (0x1<<10);
Delay(0xFFFFF);
// f9
GPIOF_ODR &= (~(0x1<<9)); Delay(0xFFFFF);
GPIOF_ODR |= (0x1<<9);
Delay(0xFFFFF);
// f8
GPIOF_ODR &= (~(0x1<<8)); Delay(0xFFFFF);
GPIOF_ODR |= (0x1<<8); Delay(0xFFFFF);
// f7
GPIOF_ODR &= (~(0x1<<7)); Delay(0xFFFFF);
GPIOF_ODR |= (0x1<<7); Delay(0xFFFFF);
}
}。

相关文档
最新文档