实验问题总结

  • 格式:docx
  • 大小:37.56 KB
  • 文档页数:8

M[3:0]表示M的第0位到底3位Configuration结构,布置,布局 系统每秒钟有多少时钟节拍(由文件OS_CFG.H中的常量OS_TICKS_PER_SEC设定 中断服务程序:应中断请求而运行的程序叫中断服务子程序(ISR) IRQ:interrupt request 中断请求 实验一 1、 CMSIS的作用是什么? 微控制器软件接口标准(CMSIS:Cortex Microcontroller Software Interface Standard) 是 Cortex-M 处理器系列的与供应商无关的硬件抽象层。使用CMSIS,可以为处理器和外设实现一致且简单的软件接口,从而简化软件的重用、缩短微控制器新开发人员的学习过程,并缩短新设备的上市时间。

2、 通过这次实验,你了解了STM32的哪些参数? STM32F103VE(观察参数,512KB Flash,64KB RAM 100PIN) STM32F407VG(观察参数,1MB Flash,192+4KB RAM 100PIN)

3、 SysTick的配置参数主要配置参数有哪些? SYSCLK 系统时钟,最大72MHz HCLK :AHB总线时钟,由系统时钟SYSCLK 分频得到,一般不分频,等于系统时钟 经过总线桥AHB--APB,通过设置分频,可由HCLK得到 PCLK1与PCLK2时钟 不过PCLK2时钟最高可达72MHz,而PCLK1最大36MHz。PCLK2对应APB2外设。PCLK1对应APB1外设。 SysTick 为一个 24 位递减计数器,SysTick 设定初值并使能后,每经过 1 个系统时钟周期,计数值就减 1。计数到 0 时,SysTick 计数器自动重装初值并继续计数,同时内部的 COUNTFLAG 标志会置位,触发中断 (如果中断使能情况下)。 1、调用SysTick_CounterCmd() -- 失能SysTick计数器 2、调用SysTick_ITConfig () -- 失能SysTick中断 3、调用SysTick_CLKSourceConfig() -- 设置SysTick时钟源。 4、调用SysTick_SetReload() -- 设置SysTick重装载值。 5、调用SysTick_ITConfig () -- 使能SysTick中断 6、调用SysTick_CounterCmd() -- 开启SysTick计数器 外部晶振为 8 MHz,9 倍频,系统时钟为 72MHz,SysTick 的最高频率为9MHz(最大为HCLK / 8),在这个条件下,把 SysTick 效验值设置成9000,将 SysTick 时钟设置为 9 MHz,就能够产生 1ms 的时间基值,即 SysTick 产生 1ms 的中断。1/9M在*9000=1ms 第一步: 配置 RCC 寄存器和 SysTick 寄存器 第二步: 配置 SysTick 中断函数 第三步: 编写 Delay 延时函数 第四步: 主函数中调用 Delay

SysTick_Config()函数的参数配置,SysTick时钟配置 void SysTick_Configuration(void) { /* Setup SysTick Timer for 100 msec interrupts */ if (SysTick_Config((SystemCoreClock) / 10)) // 1/10s=100ms { /* Capture error */ while (1); } NVIC_SetPriority(SysTick_IRQn, 0x0); } SysTick_Config(SystemFrequency / 10) 函数的形参就是systick重装定时器的值。 systck计数频率为每秒72000000次,所以7200000次就是1/10秒,也就是100ms。 SysTick是1个24bit递减计数器,通过对SysTick控制与状态寄存器的设置,可选择HCLK时钟(72M)或HCLK的8分频(9M,缺省是这个)作为SysTick的时钟源。 SysTick的重装寄存器决定了定时器频率。 若SysTick的时钟源是72M, SystemFrequency = 72000000Hz 所以 SysTick_Config(SystemFrequency / 1000);就是1ms时基。 // 1/1000 s=1ms

4、 通过这次实验,你了解了MDK的哪些功能? 完美支持Cortex-M系列器件,集成了开发环境,调试器和仿真环境,符合CMSIS (Cortex微控制器软件接口标准)

实验二 1、 Thumb2指令的主要优点是什么? Thumb2是一个高效,功能强的指令集,他的显著优点是易用,代码量少且性能优越

2、 通过这次实验,你了解了哪些Cotex-M3指令? LDR r0,r1 把1读到0里; STR r0,r1把0 放到1里面;PUSH进栈;POP出栈;ORR按位或;NOP空等待;CMP比较指令,不保存结果,只改变标志位相等时,z位为0;查看状态寄存器Z=o BEQ跳转指令;Z!=0 BNE跳转;B转移指令,跳转子程序;EOR逻辑异或 通用寄存器没地址,直接用R1-R15这样的名字进行访问,而其它所有寄存器都要通过地址来访问,所以就有了上述的#define GPBCON 这个宏定义

3、 以DELAY_NMS为例,说明子函数调用和返回的详细过程。 进入到DELAY_NMS之后,循环嵌套,循环次数为1125*1000 4、 尝试将汇编延时函数DELAY_NMS的延时周期改为10us,并评价代码的延时精度? 为10*10^(-6)秒除以1/9000000秒=》90,即延时寄存器R1=90 实验三 1.Cotex-M3内置的NVIC有什么特点?嵌套向量中断控制器NVIC 43个可屏蔽中断通道,16个可编程的优先等级 z 可嵌套中断支持 z 向量中断支持 z 动态优先级调整支持 z 中断延迟大大缩短 z 中断可屏蔽

2.简述STM32多级嵌套中断的执行过程。 中断优先级: STM32(Cortex-M3)中的优先级概念 STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级。 具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。 当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。 EXTI 1.2.3依照设定的优先级执行 3.了解并掌握STM32 EXTI线中断相关配置参数。 NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; //中断源,外部中断1 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;//PreemptionPriority占先优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //SubPriority副优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能 NVIC_Init(&NVIC_InitStructure);

EXTI_InitStructure.EXTI_Line = EXTI_Line1; //PC1 作为键盘K1 检测状态 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1 ,GPIO_Pin_5是一个管脚在前面设定为LED1 V6 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //PP表示PUSH PULL推挽模式 ;Out表示输出. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //这个是GPIO的线速度50MHZ GPIO_Init(GPIOB, &GPIO_InitStructure);

实验四 1、 总结一下任务调度发生的时机? uC/OS-II的任务有两种:用户任务和系统任务 下面是空任务,这种结构也叫超循环结构,OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()来控 制何时响应中断,何时屏蔽中断,这段代码叫做临界段。CRITICAL临界 void OS_TaskIdle (void *p_arg) { #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */ OS_CPU_SR cpu_sr = 0; #endif

(void)p_arg; /* Prevent compiler warning for not using 'parg' */ for(;;) { OS_ENTER_CRITICAL(); /进入临界段(关中断) OSIdleCtr++; //其他任何任务和中断都无法得到CPU,直到退出临界段。保证了临界段代码的运行完整性 OS_EXIT_CRITICAL();//退出临界段 (开中断) OSTaskIdleHook(); //Hook钩子,挂钩 /* Call user definable HOOK */